v0.2.20 - Improve automated test harness process/log watching/reporting and refresh test config examples

This commit is contained in:
Didactyl User
2026-03-25 14:31:31 -04:00
parent af3de3066b
commit 38fc0b10a1
25 changed files with 4961 additions and 10 deletions

2
.gitignore vendored
View File

@@ -33,3 +33,5 @@ a.out
# Local secrets
genesis.jsonc
tests/configs/test_genesis.jsonc
tests/configs/test_keys.jsonc

View File

@@ -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.19
## Current Status — v0.2.20
**Active build — this project is barely working. Experiment at your own risk.**
> Last release update: v0.2.19Default test harness execution to build_static debug binary and add skip-build override flag
> Last release update: v0.2.20Improve automated test harness process/log watching/reporting and refresh test config examples
- Connects to configured relays with auto-reconnect and relay state transition logging
- Publishes configured startup events per relay as each relay becomes connected

View File

@@ -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 19
#define DIDACTYL_VERSION "v0.2.19"
#define DIDACTYL_VERSION_PATCH 20
#define DIDACTYL_VERSION "v0.2.20"
// Agent metadata
#define DIDACTYL_NAME "Didactyl"

View File

@@ -0,0 +1,54 @@
{
// TEST CONFIGURATION TEMPLATE
// Copy this file to tests/configs/test_genesis.jsonc and fill in real disposable values.
// The concrete tests/configs/test_genesis.jsonc is gitignored.
"key": {
"nsec": "nsec1REPLACE_WITH_DISPOSABLE_TEST_NSEC"
},
"admin": {
"pubkey": "npub1REPLACE_WITH_TEST_ADMIN_PUBKEY"
},
"dm_protocol": "nip04",
"llm": {
"provider": "openai",
"api_key": "sk-REPLACE_WITH_API_KEY",
"model": "claude-haiku-4.5",
"base_url": "https://api.anthropic.com/v1",
"max_tokens": 512,
"temperature": 0.3
},
"api": {
"enabled": true,
"port": 8485,
"bind_address": "127.0.0.1"
},
"startup_events": [
{
"kind": 0,
"content_fields": {
"name": "Didactyl Test Agent",
"about": "Automated test instance"
},
"tags": []
},
{
"kind": 10002,
"content": "",
"tags": [
["r", "wss://relay.damus.io"],
["r", "wss://relay.primal.net"]
]
},
{
"kind": 31124,
"content": "# Test Agent\n\nYou are a test agent. Respond to requests and use tools when needed.",
"tags": [
["d", "identity_and_rules"],
["app", "didactyl"],
["scope", "private"],
["trigger", "dm"],
["filter", "{\"from\":\"admin\"}"]
]
}
]
}

View File

@@ -0,0 +1,10 @@
{
// LOCAL TEST KEYS TEMPLATE
// Copy to tests/configs/test_keys.jsonc (gitignored) and fill in real values.
"agent": {
"nsec": "nsec1REPLACE_WITH_DISPOSABLE_TEST_NSEC"
},
"admin": {
"pubkey": "npub1REPLACE_WITH_TEST_ADMIN_PUBKEY"
}
}

View File

@@ -22,8 +22,8 @@ class AgentProcess:
base_url: Optional[str] = None
def __post_init__(self) -> None:
self.binary_path = str(Path(self.binary_path))
self.config_path = str(Path(self.config_path))
self.binary_path = str(Path(self.binary_path).resolve())
self.config_path = str(Path(self.config_path).resolve())
self.log_file = self.log_file or "tests/results/agent_debug.log"
scheme = "https"
self.base_url = self.base_url or f"{scheme}://{self.api_bind}:{self.api_port}"
@@ -42,14 +42,83 @@ class AgentProcess:
self.api_bind,
]
def _pid_exists(self, pid: int) -> bool:
try:
os.kill(pid, 0)
return True
except OSError:
return False
def _collect_listener_pids(self) -> set[int]:
pids: set[int] = set()
commands = [
["lsof", "-t", f"-iTCP:{self.api_port}", "-sTCP:LISTEN"],
["fuser", f"{self.api_port}/tcp"],
]
for cmd in commands:
try:
proc = subprocess.run(cmd, capture_output=True, text=True, check=False)
except FileNotFoundError:
continue
output = f"{proc.stdout}\n{proc.stderr}"
for token in output.split():
if token.isdigit():
pids.add(int(token))
return pids
def _kill_stale_port_processes(self) -> None:
current_pid = os.getpid()
tracked_pid = self.process.pid if self.process else None
pids = self._collect_listener_pids()
targets = [p for p in pids if p != current_pid and p != tracked_pid]
for pid in targets:
try:
os.kill(pid, signal.SIGTERM)
except OSError:
pass
deadline = time.time() + 2.0
while time.time() < deadline:
alive = [pid for pid in targets if self._pid_exists(pid)]
if not alive:
return
time.sleep(0.1)
for pid in targets:
if self._pid_exists(pid):
try:
os.kill(pid, signal.SIGKILL)
except OSError:
pass
def _read_log_since(self, offset: int) -> tuple[str, int]:
path = Path(self.log_file)
if not path.exists():
return "", offset
with path.open("rb") as f:
f.seek(0, os.SEEK_END)
end = f.tell()
if offset > end:
offset = 0
f.seek(offset, os.SEEK_SET)
data = f.read()
return data.decode("utf-8", errors="replace"), end
def start(self, timeout: float = 30.0) -> bool:
if self.is_alive():
return True
self._kill_stale_port_processes()
env = os.environ.copy()
env["DIDACTYL_LOG_FILE"] = str(self.log_file)
Path(self.log_file).parent.mkdir(parents=True, exist_ok=True)
Path(self.log_file).write_text("", encoding="utf-8")
self.process = subprocess.Popen(
self._command(),
@@ -61,16 +130,29 @@ class AgentProcess:
client = DidactylClient(base_url=self.base_url, timeout=2.0, verify_tls=False)
deadline = time.time() + timeout
log_offset = 0
saw_ready_log = False
while time.time() < deadline:
if self.process and self.process.poll() is not None:
return False
log_chunk, log_offset = self._read_log_since(log_offset)
if log_chunk:
if "HTTP API disabled due to bind/init failure" in log_chunk:
return False
if "startup checklist [18] READY: ok" in log_chunk or "entering main poll loop" in log_chunk:
saw_ready_log = True
try:
data = client.status()
if data.get("success"):
if data.get("success") and saw_ready_log:
return True
except Exception:
pass
time.sleep(0.5)
return False
def stop(self, timeout: float = 10.0) -> bool:

View File

@@ -0,0 +1,53 @@
{
// TEST CONFIGURATION
// Use disposable keys/accounts only.
"key": {
"nsec": "d3011e59954403fb84729ab0e9fb239ba0f0238b3f353dfb5c08a32f4b3d21a1"
},
"admin": {
"pubkey": "254d7a7f68b4443f5430564eb3a726f09aea57d27e75ab2b8ef57176f9ca3dac"
},
"dm_protocol": "nip04",
"llm": {
"provider": "openai",
"api_key": "sk-REPLACE_WITH_API_KEY",
"model": "claude-haiku-4.5",
"base_url": "https://api.anthropic.com/v1",
"max_tokens": 512,
"temperature": 0.3
},
"api": {
"enabled": true,
"port": 8485,
"bind_address": "127.0.0.1"
},
"startup_events": [
{
"kind": 0,
"content_fields": {
"name": "Didactyl Test Agent",
"about": "Automated test instance"
},
"tags": []
},
{
"kind": 10002,
"content": "",
"tags": [
["r", "wss://relay.damus.io"],
["r", "wss://relay.primal.net"]
]
},
{
"kind": 31124,
"content": "# Test Agent\n\nYou are a test agent. Respond to requests and use tools when needed.",
"tags": [
["d", "identity_and_rules"],
["app", "didactyl"],
["scope", "private"],
["trigger", "dm"],
["filter", "{\"from\":\"admin\"}"]
]
}
]
}

View File

@@ -0,0 +1,662 @@
[2026-03-25 09:57:18] [INFO ] [main.c:1016] Didactyl v0.2.19 starting
[2026-03-25 09:57:18] [INFO ] [nostr_handler.c:2207] [didactyl] initializing relay pool with 2 relays
[2026-03-25 09:57:18] [INFO ] [nostr_handler.c:2231] [didactyl] added relay: wss://relay.damus.io
[2026-03-25 09:57:18] [INFO ] [nostr_handler.c:2231] [didactyl] added relay: wss://relay.primal.net
[2026-03-25 09:57:19] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] SEND relay.damus.io:443: ["REQ", "pool_1_1774447038", {
"kinds": [10000],
"authors": ["1eb171136dbb1ba695b2f14296adfe88a1f81d4220cc7d186b0e139b8ce0cdbc"],
"limit": 1
}]
[2026-03-25 09:57:20] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] SEND relay.primal.net:443: ["REQ", "pool_1_1774447038", {
"kinds": [10000],
"authors": ["1eb171136dbb1ba695b2f14296adfe88a1f81d4220cc7d186b0e139b8ce0cdbc"],
"limit": 1
}]
[2026-03-25 09:57:20] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] RECV relay.damus.io:443: ["EOSE","pool_1_1774447038"]
[2026-03-25 09:57:20] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] RECV relay.primal.net:443: ["EOSE","pool_1_1774447038"]
[2026-03-25 09:57:20] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] SEND relay.damus.io:443: ["CLOSE", "pool_1_1774447038"]
[2026-03-25 09:57:20] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] SEND relay.primal.net:443: ["CLOSE", "pool_1_1774447038"]
[2026-03-25 09:57:20] [INFO ] [main.c:248] [didactyl] startup checklist [01] Relay connectivity: begin
[2026-03-25 09:57:20] [INFO ] [main.c:255] [didactyl] startup checklist [01] Relay connectivity: ok (connected relays: 2/2)
[2026-03-25 09:57:20] [INFO ] [main.c:248] [didactyl] startup checklist [02] Recover runtime config from Nostr: begin
[2026-03-25 09:57:20] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] SEND relay.damus.io:443: ["REQ", "pool_2_1774447040", {
"kinds": [30078],
"authors": ["1eb171136dbb1ba695b2f14296adfe88a1f81d4220cc7d186b0e139b8ce0cdbc"],
"#d": ["agent_config"],
"limit": 1
}]
[2026-03-25 09:57:20] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] SEND relay.primal.net:443: ["REQ", "pool_2_1774447040", {
"kinds": [30078],
"authors": ["1eb171136dbb1ba695b2f14296adfe88a1f81d4220cc7d186b0e139b8ce0cdbc"],
"#d": ["agent_config"],
"limit": 1
}]
[2026-03-25 09:57:20] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] RECV relay.damus.io:443: ["EOSE","pool_2_1774447040"]
[2026-03-25 09:57:20] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] RECV relay.primal.net:443: ["EOSE","pool_2_1774447040"]
[2026-03-25 09:57:20] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] SEND relay.damus.io:443: ["CLOSE", "pool_2_1774447040"]
[2026-03-25 09:57:20] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] SEND relay.primal.net:443: ["CLOSE", "pool_2_1774447040"]
[2026-03-25 09:57:20] [WARN ] [main.c:917] [didactyl] startup phase: agent_config recall unavailable
[2026-03-25 09:57:20] [INFO ] [main.c:258] [didactyl] startup checklist [02] Recover runtime config from Nostr: ok
[2026-03-25 09:57:20] [INFO ] [main.c:248] [didactyl] startup checklist [03] Validate LLM config: begin
[2026-03-25 09:57:20] [INFO ] [main.c:258] [didactyl] startup checklist [03] Validate LLM config: ok
[2026-03-25 09:57:20] [INFO ] [main.c:248] [didactyl] startup checklist [04] Validate admin config: begin
[2026-03-25 09:57:20] [INFO ] [main.c:258] [didactyl] startup checklist [04] Validate admin config: ok
[2026-03-25 09:57:20] [INFO ] [main.c:248] [didactyl] startup checklist [05] Initialize LLM client: begin
[2026-03-25 09:57:20] [INFO ] [main.c:258] [didactyl] startup checklist [05] Initialize LLM client: ok
[2026-03-25 09:57:20] [INFO ] [main.c:248] [didactyl] startup checklist [06] Detect first run via kind 10002: begin
[2026-03-25 09:57:20] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] SEND relay.damus.io:443: ["REQ", "pool_3_1774447040", {
"kinds": [10002],
"authors": ["1eb171136dbb1ba695b2f14296adfe88a1f81d4220cc7d186b0e139b8ce0cdbc"],
"limit": 1
}]
[2026-03-25 09:57:20] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] SEND relay.primal.net:443: ["REQ", "pool_3_1774447040", {
"kinds": [10002],
"authors": ["1eb171136dbb1ba695b2f14296adfe88a1f81d4220cc7d186b0e139b8ce0cdbc"],
"limit": 1
}]
[2026-03-25 09:57:20] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] RECV relay.damus.io:443: ["EOSE","pool_3_1774447040"]
[2026-03-25 09:57:20] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] RECV relay.primal.net:443: ["EOSE","pool_3_1774447040"]
[2026-03-25 09:57:20] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] SEND relay.damus.io:443: ["CLOSE", "pool_3_1774447040"]
[2026-03-25 09:57:20] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] SEND relay.primal.net:443: ["CLOSE", "pool_3_1774447040"]
[2026-03-25 09:57:20] [INFO ] [main.c:1245] [didactyl] startup phase: first-run detection via kind 10002 => first-run
[2026-03-25 09:57:20] [INFO ] [main.c:255] [didactyl] startup checklist [06] Detect first run via kind 10002: ok (first-run)
[2026-03-25 09:57:20] [INFO ] [main.c:248] [didactyl] startup checklist [07] Reconcile/persist startup state: begin
[2026-03-25 09:57:20] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] SEND relay.damus.io:443: ["REQ", "pool_4_1774447040", {
"kinds": [1],
"authors": ["1eb171136dbb1ba695b2f14296adfe88a1f81d4220cc7d186b0e139b8ce0cdbc"],
"limit": 1
}]
[2026-03-25 09:57:20] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] SEND relay.primal.net:443: ["REQ", "pool_4_1774447040", {
"kinds": [1],
"authors": ["1eb171136dbb1ba695b2f14296adfe88a1f81d4220cc7d186b0e139b8ce0cdbc"],
"limit": 1
}]
[2026-03-25 09:57:21] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] RECV relay.damus.io:443: ["EOSE","pool_4_1774447040"]
[2026-03-25 09:57:21] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] RECV relay.primal.net:443: ["EOSE","pool_4_1774447040"]
[2026-03-25 09:57:21] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] SEND relay.damus.io:443: ["CLOSE", "pool_4_1774447040"]
[2026-03-25 09:57:21] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] SEND relay.primal.net:443: ["CLOSE", "pool_4_1774447040"]
[2026-03-25 09:57:21] [TRACE] [nostr_handler.c:162] [didactyl] [nostr:websocket] SEND <large EVENT frame suppressed, bytes=480>
[2026-03-25 09:57:21] [INFO ] [nostr_handler.c:2949] [didactyl] kind 0 event published to wss://relay.damus.io (async, reason=startup_reconcile)
[2026-03-25 09:57:21] [TRACE] [nostr_handler.c:162] [didactyl] [nostr:websocket] SEND <large EVENT frame suppressed, bytes=474>
[2026-03-25 09:57:21] [INFO ] [nostr_handler.c:2949] [didactyl] kind 10002 event published to wss://relay.damus.io (async, reason=startup_reconcile)
[2026-03-25 09:57:21] [TRACE] [nostr_handler.c:162] [didactyl] [nostr:websocket] SEND <large EVENT frame suppressed, bytes=621>
[2026-03-25 09:57:21] [INFO ] [nostr_handler.c:2949] [didactyl] kind 31124 event published to wss://relay.damus.io (async, reason=startup_reconcile)
[2026-03-25 09:57:21] [TRACE] [nostr_handler.c:162] [didactyl] [nostr:websocket] SEND <large EVENT frame suppressed, bytes=553>
[2026-03-25 09:57:21] [INFO ] [nostr_handler.c:2949] [didactyl] kind 10123 event published to wss://relay.damus.io (async, reason=startup_reconcile)
[2026-03-25 09:57:21] [TRACE] [nostr_handler.c:162] [didactyl] [nostr:websocket] SEND <large EVENT frame suppressed, bytes=482>
[2026-03-25 09:57:21] [INFO ] [nostr_handler.c:2949] [didactyl] kind 0 event published to wss://relay.primal.net (async, reason=startup_reconcile)
[2026-03-25 09:57:21] [TRACE] [nostr_handler.c:162] [didactyl] [nostr:websocket] SEND <large EVENT frame suppressed, bytes=476>
[2026-03-25 09:57:21] [INFO ] [nostr_handler.c:2949] [didactyl] kind 10002 event published to wss://relay.primal.net (async, reason=startup_reconcile)
[2026-03-25 09:57:21] [TRACE] [nostr_handler.c:162] [didactyl] [nostr:websocket] SEND <large EVENT frame suppressed, bytes=623>
[2026-03-25 09:57:21] [INFO ] [nostr_handler.c:2949] [didactyl] kind 31124 event published to wss://relay.primal.net (async, reason=startup_reconcile)
[2026-03-25 09:57:21] [TRACE] [nostr_handler.c:162] [didactyl] [nostr:websocket] SEND <large EVENT frame suppressed, bytes=555>
[2026-03-25 09:57:21] [INFO ] [nostr_handler.c:2949] [didactyl] kind 10123 event published to wss://relay.primal.net (async, reason=startup_reconcile)
[2026-03-25 09:57:21] [INFO ] [nostr_handler.c:3285] [didactyl] startup publish detail: kind=0 (profile) -> wss://relay.damus.io, wss://relay.primal.net
[2026-03-25 09:57:21] [INFO ] [nostr_handler.c:3285] [didactyl] startup publish detail: kind=10002 (relay_list) -> wss://relay.damus.io, wss://relay.primal.net
[2026-03-25 09:57:21] [INFO ] [nostr_handler.c:3285] [didactyl] startup publish detail: kind=31124 (skill) -> wss://relay.damus.io, wss://relay.primal.net
[2026-03-25 09:57:21] [INFO ] [nostr_handler.c:3285] [didactyl] startup publish detail: kind=10123 (adoption_list) -> wss://relay.damus.io, wss://relay.primal.net
[2026-03-25 09:57:21] [INFO ] [nostr_handler.c:3297] [didactyl] startup publish summary: 4/4 event(s) published to at least one relay; relays used=2/2
[2026-03-25 09:57:21] [INFO ] [nostr_handler.c:906] [didactyl] publish kind event target relays (2):
[2026-03-25 09:57:21] [INFO ] [nostr_handler.c:908] [didactyl] -> wss://relay.damus.io
[2026-03-25 09:57:21] [INFO ] [nostr_handler.c:908] [didactyl] -> wss://relay.primal.net
[2026-03-25 09:57:21] [TRACE] [nostr_handler.c:162] [didactyl] [nostr:websocket] SEND <large EVENT frame suppressed, bytes=800>
[2026-03-25 09:57:21] [TRACE] [nostr_handler.c:162] [didactyl] [nostr:websocket] SEND <large EVENT frame suppressed, bytes=802>
[2026-03-25 09:57:21] [INFO ] [nostr_handler.c:2949] [didactyl] kind 30078 event published to wss://relay.damus.io (async, reason=manual_publish)
[2026-03-25 09:57:21] [INFO ] [nostr_handler.c:2949] [didactyl] kind 30078 event published to wss://relay.primal.net (async, reason=manual_publish)
[2026-03-25 09:57:21] [INFO ] [nostr_handler.c:3012] [didactyl] published kind 30078 event via 2 connected relay(s)
[2026-03-25 09:57:21] [INFO ] [nostr_handler.c:906] [didactyl] publish kind event target relays (2):
[2026-03-25 09:57:21] [INFO ] [nostr_handler.c:908] [didactyl] -> wss://relay.damus.io
[2026-03-25 09:57:21] [INFO ] [nostr_handler.c:908] [didactyl] -> wss://relay.primal.net
[2026-03-25 09:57:21] [TRACE] [nostr_handler.c:162] [didactyl] [nostr:websocket] SEND <large EVENT frame suppressed, bytes=714>
[2026-03-25 09:57:21] [TRACE] [nostr_handler.c:162] [didactyl] [nostr:websocket] SEND <large EVENT frame suppressed, bytes=716>
[2026-03-25 09:57:21] [INFO ] [nostr_handler.c:2949] [didactyl] kind 30078 event published to wss://relay.damus.io (async, reason=manual_publish)
[2026-03-25 09:57:21] [INFO ] [nostr_handler.c:2949] [didactyl] kind 30078 event published to wss://relay.primal.net (async, reason=manual_publish)
[2026-03-25 09:57:21] [INFO ] [nostr_handler.c:3012] [didactyl] published kind 30078 event via 2 connected relay(s)
[2026-03-25 09:57:21] [INFO ] [main.c:1267] [didactyl] startup phase: persisted encrypted runtime config to Nostr
[2026-03-25 09:57:21] [INFO ] [main.c:258] [didactyl] startup checklist [07] Reconcile/persist startup state: ok
[2026-03-25 09:57:21] [INFO ] [main.c:248] [didactyl] startup checklist [08] Initialize agent: begin
[2026-03-25 09:57:21] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] SEND relay.damus.io:443: ["REQ", "pool_5_1774447041", {
"kinds": [30078],
"authors": ["1eb171136dbb1ba695b2f14296adfe88a1f81d4220cc7d186b0e139b8ce0cdbc"],
"#d": ["memory"],
"limit": 1
}]
[2026-03-25 09:57:21] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] SEND relay.primal.net:443: ["REQ", "pool_5_1774447041", {
"kinds": [30078],
"authors": ["1eb171136dbb1ba695b2f14296adfe88a1f81d4220cc7d186b0e139b8ce0cdbc"],
"#d": ["memory"],
"limit": 1
}]
[2026-03-25 09:57:21] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] RECV relay.damus.io:443: ["OK","13a1949f62624e029378e8cec322a470ac56eb25f1f5607f0289ccbb80811570",true,""]
[2026-03-25 09:57:21] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] RECV relay.primal.net:443: ["OK","04d546378376d6b3b6270b3b4df939d961a39d31b23d99a93f1362078a8ef3df",true,""]
[2026-03-25 09:57:21] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] RECV relay.damus.io:443: ["OK","d74130d3ca16481aa565126870193e298c24e3857bc343ea93a39465673a7297",true,""]
[2026-03-25 09:57:21] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] RECV relay.primal.net:443: ["OK","13a1949f62624e029378e8cec322a470ac56eb25f1f5607f0289ccbb80811570",true,""]
[2026-03-25 09:57:21] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] RECV relay.damus.io:443: ["OK","04d546378376d6b3b6270b3b4df939d961a39d31b23d99a93f1362078a8ef3df",true,""]
[2026-03-25 09:57:21] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] RECV relay.primal.net:443: ["OK","9b75006ce75a2cb675e39cab9fb057110c67a9c90606feec6064a28f1aae9e66",true,""]
[2026-03-25 09:57:21] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] RECV relay.damus.io:443: ["OK","9b75006ce75a2cb675e39cab9fb057110c67a9c90606feec6064a28f1aae9e66",true,""]
[2026-03-25 09:57:21] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] RECV relay.primal.net:443: ["OK","d74130d3ca16481aa565126870193e298c24e3857bc343ea93a39465673a7297",true,""]
[2026-03-25 09:57:21] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] RECV relay.damus.io:443: ["EOSE","pool_5_1774447041"]
[2026-03-25 09:57:21] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] RECV relay.primal.net:443: ["EOSE","pool_5_1774447041"]
[2026-03-25 09:57:21] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] SEND relay.damus.io:443: ["CLOSE", "pool_5_1774447041"]
[2026-03-25 09:57:21] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] SEND relay.primal.net:443: ["CLOSE", "pool_5_1774447041"]
[2026-03-25 09:57:21] [INFO ] [main.c:258] [didactyl] startup checklist [08] Initialize agent: ok
[2026-03-25 09:57:21] [INFO ] [main.c:248] [didactyl] startup checklist [09] Initialize trigger manager: begin
[2026-03-25 09:57:21] [INFO ] [trigger_manager.c:814] [didactyl] trigger manager initialized (capacity=16)
[2026-03-25 09:57:21] [INFO ] [main.c:258] [didactyl] startup checklist [09] Initialize trigger manager: ok
[2026-03-25 09:57:21] [INFO ] [main.c:1308] [didactyl] startup phase: deferred trigger load will run after self-skill EOSE
[2026-03-25 09:57:21] [INFO ] [main.c:248] [didactyl] startup checklist [10] Load startup triggers: begin
[2026-03-25 09:57:21] [INFO ] [main.c:1311] [didactyl] startup phase: startup-config trigger load begin
[2026-03-25 09:57:21] [INFO ] [trigger_manager.c:1138] [didactyl] trigger added d_tag=identity_and_rules action=0 enabled=1
[2026-03-25 09:57:21] [INFO ] [trigger_manager.c:1021] [didactyl] startup trigger registered d_tag=identity_and_rules action=llm enabled=1
[2026-03-25 09:57:21] [INFO ] [trigger_manager.c:1029] [didactyl] trigger manager loaded 1 trigger(s) from startup config (considered=1)
[2026-03-25 09:57:21] [INFO ] [main.c:1315] [didactyl] startup phase: startup-config trigger load end
[2026-03-25 09:57:21] [INFO ] [main.c:258] [didactyl] startup checklist [10] Load startup triggers: ok
[2026-03-25 09:57:21] [INFO ] [main.c:248] [didactyl] startup checklist [11] Discover self relay list via kind 10002: begin
[2026-03-25 09:57:21] [INFO ] [main.c:327] [didactyl] kind10002 query begin: timeout_ms=5000 author=1eb171136dbb1ba6... relay_count=2
[2026-03-25 09:57:21] [INFO ] [main.c:334] [didactyl] kind10002 query relay snapshot: {"relay_count":2,"connected_count":2,"relays":[{"url":"wss://relay.damus.io","status":"connected","events_received":0,"events_published":6,"events_published_ok":4,"events_published_failed":0,"ping_latency_current":0,"ping_latency_avg":0,"query_latency_avg":0,"publish_latency_avg":0,"connection_uptime_start":1774447038,"last_event_time":1774447041},{"url":"wss://relay.primal.net","status":"connected","events_received":0,"events_published":6,"events_published_ok":4,"events_published_failed":0,"ping_latency_current":0,"ping_latency_avg":0,"query_latency_avg":0,"publish_latency_avg":0,"connection_uptime_start":1774447038,"last_event_time":1774447041}]}
[2026-03-25 09:57:21] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] SEND relay.damus.io:443: ["REQ", "pool_6_1774447041", {
"kinds": [10002],
"authors": ["1eb171136dbb1ba695b2f14296adfe88a1f81d4220cc7d186b0e139b8ce0cdbc"],
"limit": 16
}]
[2026-03-25 09:57:21] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] SEND relay.primal.net:443: ["REQ", "pool_6_1774447041", {
"kinds": [10002],
"authors": ["1eb171136dbb1ba695b2f14296adfe88a1f81d4220cc7d186b0e139b8ce0cdbc"],
"limit": 16
}]
[2026-03-25 09:57:21] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] RECV relay.damus.io:443: ["OK","f03e026e0424e65c1b2a0886b16588790d6c6dfb7f2f73704c3e31714fa84c4e",false,"rate-limited: you are noting too much"]
[2026-03-25 09:57:21] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] RECV relay.primal.net:443: ["OK","882c5abde60d7f45037dff104d58de1cddd37dc14670672252856f46378652ce",true,""]
[2026-03-25 09:57:21] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] RECV relay.damus.io:443: ["OK","882c5abde60d7f45037dff104d58de1cddd37dc14670672252856f46378652ce",true,""]
[2026-03-25 09:57:21] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] RECV relay.primal.net:443: ["OK","f03e026e0424e65c1b2a0886b16588790d6c6dfb7f2f73704c3e31714fa84c4e",true,""]
[2026-03-25 09:57:21] [TRACE] [nostr_handler.c:162] [didactyl] [nostr:websocket] RECV <large EVENT frame suppressed, bytes=460>
[2026-03-25 09:57:21] [TRACE] [nostr_handler.c:162] [didactyl] [nostr:websocket] RECV <large EVENT frame suppressed, bytes=462>
[2026-03-25 09:57:21] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] RECV relay.damus.io:443: ["EOSE","pool_6_1774447041"]
[2026-03-25 09:57:21] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] RECV relay.primal.net:443: ["EOSE","pool_6_1774447041"]
[2026-03-25 09:57:21] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] SEND relay.damus.io:443: ["CLOSE", "pool_6_1774447041"]
[2026-03-25 09:57:21] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] SEND relay.primal.net:443: ["CLOSE", "pool_6_1774447041"]
[2026-03-25 09:57:21] [INFO ] [main.c:354] [didactyl] kind10002 query received event_count=1
[2026-03-25 09:57:21] [INFO ] [main.c:451] [didactyl] kind10002 query extracted relays=["wss://relay.damus.io","wss://relay.primal.net"]
[2026-03-25 09:57:21] [INFO ] [main.c:556] [didactyl] kind10002 wait success: relay_count=2
[2026-03-25 09:57:21] [INFO ] [main.c:558] [didactyl] kind10002 relay[0]=wss://relay.damus.io
[2026-03-25 09:57:21] [INFO ] [main.c:558] [didactyl] kind10002 relay[1]=wss://relay.primal.net
[2026-03-25 09:57:21] [INFO ] [main.c:562] [didactyl] kind10002 wait success relay snapshot: {"relay_count":2,"connected_count":2,"relays":[{"url":"wss://relay.damus.io","status":"connected","events_received":1,"events_published":6,"events_published_ok":5,"events_published_failed":1,"ping_latency_current":0,"ping_latency_avg":0,"query_latency_avg":0,"publish_latency_avg":0,"connection_uptime_start":1774447038,"last_event_time":1774447041,"last_publish_error":"rate-limited: you are noting too much"},{"url":"wss://relay.primal.net","status":"connected","events_received":0,"events_published":6,"events_published_ok":6,"events_published_failed":0,"ping_latency_current":0,"ping_latency_avg":0,"query_latency_avg":0,"publish_latency_avg":0,"connection_uptime_start":1774447038,"last_event_time":1774447041}]}
[2026-03-25 09:57:21] [INFO ] [main.c:255] [didactyl] startup checklist [11] Discover self relay list via kind 10002: ok (kind10002=2 added=0 connected=2/2)
[2026-03-25 09:57:21] [INFO ] [main.c:248] [didactyl] startup checklist [12] Subscribe admin context: begin
[2026-03-25 09:57:21] [INFO ] [main.c:1366] [didactyl] startup phase: subscribe admin context begin
[2026-03-25 09:57:21] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] SEND relay.damus.io:443: ["REQ", "pool_7_1774447041", {
"kinds": [0, 3, 10002],
"authors": ["254d7a7f68b4443f5430564eb3a726f09aea57d27e75ab2b8ef57176f9ca3dac"],
"limit": 32
}]
[2026-03-25 09:57:21] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] SEND relay.primal.net:443: ["REQ", "pool_7_1774447041", {
"kinds": [0, 3, 10002],
"authors": ["254d7a7f68b4443f5430564eb3a726f09aea57d27e75ab2b8ef57176f9ca3dac"],
"limit": 32
}]
[2026-03-25 09:57:21] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] SEND relay.damus.io:443: ["REQ", "pool_8_1774447041", {
"kinds": [1],
"authors": ["254d7a7f68b4443f5430564eb3a726f09aea57d27e75ab2b8ef57176f9ca3dac"],
"limit": 10
}]
[2026-03-25 09:57:21] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] SEND relay.primal.net:443: ["REQ", "pool_8_1774447041", {
"kinds": [1],
"authors": ["254d7a7f68b4443f5430564eb3a726f09aea57d27e75ab2b8ef57176f9ca3dac"],
"limit": 10
}]
[2026-03-25 09:57:21] [INFO ] [nostr_handler.c:2352] [didactyl] admin context subscriptions active for admin 254d7a7f68b4443f...
[2026-03-25 09:57:21] [INFO ] [main.c:1370] [didactyl] startup phase: subscribe admin context end
[2026-03-25 09:57:21] [INFO ] [main.c:258] [didactyl] startup checklist [12] Subscribe admin context: ok
[2026-03-25 09:57:21] [INFO ] [main.c:248] [didactyl] startup checklist [13] Subscribe agent self context: begin
[2026-03-25 09:57:21] [INFO ] [main.c:1374] [didactyl] startup phase: subscribe agent self context begin
[2026-03-25 09:57:21] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] SEND relay.damus.io:443: ["REQ", "pool_9_1774447041", {
"kinds": [0, 3, 10002],
"authors": ["1eb171136dbb1ba695b2f14296adfe88a1f81d4220cc7d186b0e139b8ce0cdbc"],
"limit": 64
}]
[2026-03-25 09:57:21] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] SEND relay.primal.net:443: ["REQ", "pool_9_1774447041", {
"kinds": [0, 3, 10002],
"authors": ["1eb171136dbb1ba695b2f14296adfe88a1f81d4220cc7d186b0e139b8ce0cdbc"],
"limit": 64
}]
[2026-03-25 09:57:21] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] SEND relay.damus.io:443: ["REQ", "pool_10_1774447041", {
"kinds": [1],
"authors": ["1eb171136dbb1ba695b2f14296adfe88a1f81d4220cc7d186b0e139b8ce0cdbc"],
"limit": 10
}]
[2026-03-25 09:57:21] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] SEND relay.primal.net:443: ["REQ", "pool_10_1774447041", {
"kinds": [1],
"authors": ["1eb171136dbb1ba695b2f14296adfe88a1f81d4220cc7d186b0e139b8ce0cdbc"],
"limit": 10
}]
[2026-03-25 09:57:21] [INFO ] [nostr_handler.c:2440] [didactyl] agent self-context subscriptions active for pubkey 1eb171136dbb1ba6...
[2026-03-25 09:57:21] [INFO ] [main.c:1378] [didactyl] startup phase: subscribe agent self context end
[2026-03-25 09:57:21] [INFO ] [main.c:258] [didactyl] startup checklist [13] Subscribe agent self context: ok
[2026-03-25 09:57:21] [INFO ] [main.c:248] [didactyl] startup checklist [14] Subscribe self-skill cache: begin
[2026-03-25 09:57:21] [INFO ] [main.c:1382] [didactyl] startup phase: subscribe self skill cache begin
[2026-03-25 09:57:21] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] SEND relay.damus.io:443: ["REQ", "pool_11_1774447041", {
"kinds": [31123, 31124, 10123],
"authors": ["1eb171136dbb1ba695b2f14296adfe88a1f81d4220cc7d186b0e139b8ce0cdbc"],
"limit": 300
}]
[2026-03-25 09:57:21] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] SEND relay.primal.net:443: ["REQ", "pool_11_1774447041", {
"kinds": [31123, 31124, 10123],
"authors": ["1eb171136dbb1ba695b2f14296adfe88a1f81d4220cc7d186b0e139b8ce0cdbc"],
"limit": 300
}]
[2026-03-25 09:57:21] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] SEND relay.damus.io:443: ["REQ", "pool_12_1774447041", {
"kinds": [31123],
"authors": ["254d7a7f68b4443f5430564eb3a726f09aea57d27e75ab2b8ef57176f9ca3dac"],
"limit": 150
}]
[2026-03-25 09:57:21] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] SEND relay.primal.net:443: ["REQ", "pool_12_1774447041", {
"kinds": [31123],
"authors": ["254d7a7f68b4443f5430564eb3a726f09aea57d27e75ab2b8ef57176f9ca3dac"],
"limit": 150
}]
[2026-03-25 09:57:21] [INFO ] [nostr_handler.c:2532] [didactyl] self/admin skill subscriptions active (self=1eb171136dbb1ba6..., admin=254d7a7f68b4443f...)
[2026-03-25 09:57:21] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] RECV relay.damus.io:443: ["EOSE","pool_7_1774447041"]
[2026-03-25 09:57:21] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] RECV relay.damus.io:443: ["EOSE","pool_8_1774447041"]
[2026-03-25 09:57:21] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] RECV relay.primal.net:443: ["EOSE","pool_7_1774447041"]
[2026-03-25 09:57:21] [TRACE] [nostr_handler.c:1718] [didactyl] DEBUG on_eose called: event_count=0
[2026-03-25 09:57:21] [TRACE] [nostr_handler.c:162] [didactyl] [nostr:websocket] RECV <large EVENT frame suppressed, bytes=469>
[2026-03-25 09:57:21] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] RECV relay.primal.net:443: ["EOSE","pool_8_1774447041"]
[2026-03-25 09:57:21] [TRACE] [nostr_handler.c:1718] [didactyl] DEBUG on_eose called: event_count=0
[2026-03-25 09:57:21] [TRACE] [nostr_handler.c:162] [didactyl] [nostr:websocket] RECV <large EVENT frame suppressed, bytes=460>
[2026-03-25 09:57:21] [TRACE] [nostr_handler.c:162] [didactyl] [nostr:websocket] RECV <large EVENT frame suppressed, bytes=471>
[2026-03-25 09:57:21] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] RECV relay.damus.io:443: ["EOSE","pool_9_1774447041"]
[2026-03-25 09:57:21] [TRACE] [nostr_handler.c:162] [didactyl] [nostr:websocket] RECV <large EVENT frame suppressed, bytes=462>
[2026-03-25 09:57:21] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] RECV relay.damus.io:443: ["EOSE","pool_10_1774447041"]
[2026-03-25 09:57:21] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] RECV relay.primal.net:443: ["EOSE","pool_9_1774447041"]
[2026-03-25 09:57:21] [TRACE] [nostr_handler.c:1718] [didactyl] DEBUG on_eose called: event_count=0
[2026-03-25 09:57:21] [TRACE] [nostr_handler.c:162] [didactyl] [nostr:websocket] RECV <large EVENT frame suppressed, bytes=602>
[2026-03-25 09:57:21] [INFO ] [nostr_handler.c:2151] [didactyl] self-skill cache received kind=31124 d_tag=identity_and_rules id=9b75006ce75a2cb675e39cab9fb057110c67a9c90606feec6064a28f1aae9e66 created_at=1774447041 via wss://relay.damus.io
[2026-03-25 09:57:21] [INFO ] [trigger_manager.c:1364] [didactyl] trigger updated d_tag=identity_and_rules action=0 enabled=1
[2026-03-25 09:57:21] [INFO ] [nostr_handler.c:1207] [didactyl] live self-skill trigger registered d_tag=identity_and_rules action=llm enabled=1
[2026-03-25 09:57:21] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] RECV relay.primal.net:443: ["EOSE","pool_10_1774447041"]
[2026-03-25 09:57:21] [TRACE] [nostr_handler.c:1718] [didactyl] DEBUG on_eose called: event_count=0
[2026-03-25 09:57:21] [TRACE] [nostr_handler.c:162] [didactyl] [nostr:websocket] RECV <large EVENT frame suppressed, bytes=538>
[2026-03-25 09:57:21] [INFO ] [nostr_handler.c:2151] [didactyl] self-skill cache received kind=10123 d_tag=- id=04d546378376d6b3b6270b3b4df939d961a39d31b23d99a93f1362078a8ef3df created_at=1774447041 via wss://relay.damus.io
[2026-03-25 09:57:21] [TRACE] [nostr_handler.c:162] [didactyl] [nostr:websocket] RECV <large EVENT frame suppressed, bytes=604>
[2026-03-25 09:57:21] [INFO ] [nostr_handler.c:2151] [didactyl] self-skill cache received kind=31124 d_tag=identity_and_rules id=9b75006ce75a2cb675e39cab9fb057110c67a9c90606feec6064a28f1aae9e66 created_at=1774447041 via wss://relay.primal.net
[2026-03-25 09:57:21] [INFO ] [trigger_manager.c:1364] [didactyl] trigger updated d_tag=identity_and_rules action=0 enabled=1
[2026-03-25 09:57:21] [INFO ] [nostr_handler.c:1207] [didactyl] live self-skill trigger registered d_tag=identity_and_rules action=llm enabled=1
[2026-03-25 09:57:21] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] RECV relay.damus.io:443: ["EOSE","pool_11_1774447041"]
[2026-03-25 09:57:21] [TRACE] [nostr_handler.c:162] [didactyl] [nostr:websocket] RECV <large EVENT frame suppressed, bytes=540>
[2026-03-25 09:57:21] [INFO ] [nostr_handler.c:2151] [didactyl] self-skill cache received kind=10123 d_tag=- id=04d546378376d6b3b6270b3b4df939d961a39d31b23d99a93f1362078a8ef3df created_at=1774447041 via wss://relay.primal.net
[2026-03-25 09:57:21] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] RECV relay.damus.io:443: ["EOSE","pool_12_1774447041"]
[2026-03-25 09:57:21] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] RECV relay.primal.net:443: ["EOSE","pool_11_1774447041"]
[2026-03-25 09:57:21] [INFO ] [nostr_handler.c:1725] [didactyl] self-skill EOSE received: cached skill events=0
[2026-03-25 09:57:21] [INFO ] [main.c:44] [didactyl] deferred trigger load begin after self-skill EOSE (event_count=0)
[2026-03-25 09:57:21] [INFO ] [trigger_manager.c:1364] [didactyl] trigger updated d_tag=identity_and_rules action=0 enabled=1
[2026-03-25 09:57:21] [INFO ] [trigger_manager.c:918] [didactyl] trigger manager loaded 1 trigger(s) from self skills (considered=1)
[2026-03-25 09:57:21] [INFO ] [main.c:54] [didactyl] deferred trigger load status: {"success":true,"count":1,"active":1,"triggers":[{"skill_d_tag":"identity_and_rules","filter_json":"{\"from\":\"admin\"}","type":"dm","action":"llm","enabled":true,"subscribed":false,"llm":"","tools":"","has_max_tokens":false,"has_temperature":false,"has_seed":false,"last_fired":0,"last_seen_created_at":0}]}
[2026-03-25 09:57:21] [INFO ] [nostr_handler.c:2757] [didactyl] self-skill cache event: kind=31124 d_tag=identity_and_rules id=9b75006ce75a2cb675e39cab9fb057110c67a9c90606feec6064a28f1aae9e66 created_at=1774447041
[2026-03-25 09:57:21] [INFO ] [nostr_handler.c:2757] [didactyl] self-skill cache event: kind=10123 d_tag=- id=04d546378376d6b3b6270b3b4df939d961a39d31b23d99a93f1362078a8ef3df created_at=1774447041
[2026-03-25 09:57:21] [INFO ] [main.c:1449] [didactyl] startup phase: subscribe self skill cache end
[2026-03-25 09:57:21] [INFO ] [main.c:255] [didactyl] startup checklist [14] Subscribe self-skill cache: ok (skills=1 adoptions=1)
[2026-03-25 09:57:21] [INFO ] [main.c:248] [didactyl] startup checklist [15] Subscribe DMs: begin
[2026-03-25 09:57:21] [INFO ] [main.c:1453] [didactyl] startup phase: subscribe DMs begin
[2026-03-25 09:57:21] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] SEND relay.damus.io:443: ["REQ", "pool_13_1774447041", {
"kinds": [4],
"#p": ["1eb171136dbb1ba695b2f14296adfe88a1f81d4220cc7d186b0e139b8ce0cdbc"],
"since": 1774447038,
"limit": 100
}]
[2026-03-25 09:57:21] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] SEND relay.primal.net:443: ["REQ", "pool_13_1774447041", {
"kinds": [4],
"#p": ["1eb171136dbb1ba695b2f14296adfe88a1f81d4220cc7d186b0e139b8ce0cdbc"],
"since": 1774447038,
"limit": 100
}]
[2026-03-25 09:57:21] [INFO ] [nostr_handler.c:2643] [didactyl] DM subscription active for pubkey 1eb171136dbb1ba6...
[2026-03-25 09:57:21] [TRACE] [nostr_handler.c:2644] [didactyl] DEBUG DM subscription g_start_time=1774447038 now=1774447041 delta=3 relay_count=2
[2026-03-25 09:57:21] [INFO ] [main.c:1468] [didactyl] startup phase: subscribe DMs end
[2026-03-25 09:57:21] [INFO ] [main.c:258] [didactyl] startup checklist [15] Subscribe DMs: ok
[2026-03-25 09:57:21] [INFO ] [main.c:248] [didactyl] startup checklist [16] Subscribe wallet events: begin
[2026-03-25 09:57:21] [INFO ] [main.c:1472] [didactyl] startup phase: subscribe wallet events begin
[2026-03-25 09:57:21] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] SEND relay.damus.io:443: ["REQ", "pool_14_1774447041", {
"kinds": [17375, 7375, 5],
"authors": ["1eb171136dbb1ba695b2f14296adfe88a1f81d4220cc7d186b0e139b8ce0cdbc"],
"since": 1774447038,
"limit": 500
}]
[2026-03-25 09:57:21] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] SEND relay.primal.net:443: ["REQ", "pool_14_1774447041", {
"kinds": [17375, 7375, 5],
"authors": ["1eb171136dbb1ba695b2f14296adfe88a1f81d4220cc7d186b0e139b8ce0cdbc"],
"since": 1774447038,
"limit": 500
}]
[2026-03-25 09:57:21] [INFO ] [nostr_handler.c:2696] [didactyl] wallet event subscription active for pubkey 1eb171136dbb1ba6...
[2026-03-25 09:57:21] [INFO ] [main.c:1476] [didactyl] startup phase: subscribe wallet events end
[2026-03-25 09:57:21] [INFO ] [main.c:258] [didactyl] startup checklist [16] Subscribe wallet events: ok
[2026-03-25 09:57:21] [INFO ] [main.c:248] [didactyl] startup checklist [17] Initialize cashu wallet: begin
[2026-03-25 09:57:21] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] SEND relay.damus.io:443: ["REQ", "pool_15_1774447041", {
"kinds": [17375, 7375],
"authors": ["1eb171136dbb1ba695b2f14296adfe88a1f81d4220cc7d186b0e139b8ce0cdbc"]
}]
[2026-03-25 09:57:21] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] SEND relay.primal.net:443: ["REQ", "pool_15_1774447041", {
"kinds": [17375, 7375],
"authors": ["1eb171136dbb1ba695b2f14296adfe88a1f81d4220cc7d186b0e139b8ce0cdbc"]
}]
[2026-03-25 09:57:22] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] RECV relay.primal.net:443: ["EOSE","pool_12_1774447041"]
[2026-03-25 09:57:22] [TRACE] [nostr_handler.c:1718] [didactyl] DEBUG on_eose called: event_count=0
[2026-03-25 09:57:22] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] RECV relay.damus.io:443: ["EOSE","pool_13_1774447041"]
[2026-03-25 09:57:22] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] RECV relay.primal.net:443: ["EOSE","pool_13_1774447041"]
[2026-03-25 09:57:22] [TRACE] [nostr_handler.c:1718] [didactyl] DEBUG on_eose called: event_count=0
[2026-03-25 09:57:22] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] RECV relay.damus.io:443: ["EOSE","pool_14_1774447041"]
[2026-03-25 09:57:22] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] RECV relay.primal.net:443: ["EOSE","pool_14_1774447041"]
[2026-03-25 09:57:22] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] RECV relay.damus.io:443: ["EOSE","pool_15_1774447041"]
[2026-03-25 09:57:22] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] RECV relay.primal.net:443: ["EOSE","pool_15_1774447041"]
[2026-03-25 09:57:22] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] SEND relay.damus.io:443: ["CLOSE", "pool_15_1774447041"]
[2026-03-25 09:57:22] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] SEND relay.primal.net:443: ["CLOSE", "pool_15_1774447041"]
[2026-03-25 09:57:22] [WARN ] [main.c:1492] [didactyl] startup phase: cashu wallet load/create deferred to first tool call
[2026-03-25 09:57:22] [INFO ] [main.c:255] [didactyl] startup checklist [17] Initialize cashu wallet: ok (initialized; load/create deferred)
[2026-03-25 09:57:22] [INFO ] [http_api.c:1570] [didactyl] http api listening on http://127.0.0.1:8485
[2026-03-25 09:57:22] [INFO ] [main.c:1532] [didactyl] HTTP API listening at http://127.0.0.1:8485
[2026-03-25 09:57:22] [INFO ] [main.c:1535] [didactyl] HTTP API endpoints: http://127.0.0.1:8485/api/context/current http://127.0.0.1:8485/api/context/parts
[2026-03-25 09:57:22] [TRACE] [nostr_handler.c:1499] [didactyl] sending plaintext DM content: Didactyl Test Agent has started up and is online at 2026-03-25 09:57:22 (version v0.2.19, connected relays: 2/2).
[2026-03-25 09:57:22] [TRACE] [nostr_handler.c:1491] [didactyl] sending encrypted DM event: {"pubkey":"1eb171136dbb1ba695b2f14296adfe88a1f81d4220cc7d186b0e139b8ce0cdbc","created_at":1774447042,"kind":4,"tags":[["p","254d7a7f68b4443f5430564eb3a726f09aea57d27e75ab2b8ef57176f9ca3dac"]],"content":"JHxPSTz8zGKKRsZk1IVZQ6QDc5PKZABp6fJV79Pe30/K4t/NxAVrWYuCcodwFN+TlZMdtO/VyLgxJYhffWTa8FPTMGVlvMpQtlEzMs8QnAMEuIXappUCvNZK3Qs4baWjO075bztD4IB7vEQdG6BPKHabKCABreuQZe86dnDZu24=?iv=PLBOGIdcaCv8s5FdvJmYpQ==","id":"856df7e0935a011340e1f1ad77b1fbc8f0e56ec6af9c366ae673ce7b09da29d7","sig":"369c84458e133b3c6e0d8a7bf0f712b75a73634ae43d1ba842b78dcaff19212cef88c3077b38c5822a1d330571e2b0ce7b093781b1b10fcbc2793466ac5f1fd4"}
[2026-03-25 09:57:22] [INFO ] [nostr_handler.c:906] [didactyl] publish DM target relays (2):
[2026-03-25 09:57:22] [INFO ] [nostr_handler.c:908] [didactyl] -> wss://relay.damus.io
[2026-03-25 09:57:22] [INFO ] [nostr_handler.c:908] [didactyl] -> wss://relay.primal.net
[2026-03-25 09:57:22] [TRACE] [nostr_handler.c:162] [didactyl] [nostr:websocket] SEND <large EVENT frame suppressed, bytes=681>
[2026-03-25 09:57:22] [TRACE] [nostr_handler.c:162] [didactyl] [nostr:websocket] SEND <large EVENT frame suppressed, bytes=683>
[2026-03-25 09:57:22] [INFO ] [nostr_handler.c:2843] [didactyl] kind 4 event published to wss://relay.damus.io (async)
[2026-03-25 09:57:22] [INFO ] [nostr_handler.c:2843] [didactyl] kind 4 event published to wss://relay.primal.net (async)
[2026-03-25 09:57:22] [INFO ] [nostr_handler.c:2852] [didactyl] sent DM 856df7e0935a0113... to 254d7a7f68b4443f... via 2 connected relay(s)
[2026-03-25 09:57:22] [INFO ] [main.c:255] [didactyl] startup checklist [18] READY: ok (agent online; entering main poll loop)
[2026-03-25 09:57:22] [INFO ] [main.c:1571] [didactyl] entering main poll loop
[2026-03-25 09:57:22] [INFO ] [main.c:1572] [didactyl] running with pubkey 1eb171136dbb1ba695b2f14296adfe88a1f81d4220cc7d186b0e139b8ce0cdbc
[2026-03-25 09:57:22] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] RECV relay.damus.io:443: ["OK","856df7e0935a011340e1f1ad77b1fbc8f0e56ec6af9c366ae673ce7b09da29d7",false,"rate-limited: you are noting too much"]
[2026-03-25 09:57:22] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] RECV relay.primal.net:443: ["OK","856df7e0935a011340e1f1ad77b1fbc8f0e56ec6af9c366ae673ce7b09da29d7",true,""]
[2026-03-25 09:58:20] [INFO ] [llm.c:76] [didactyl] llm request: method=POST url=https://api.anthropic.com/v1/chat/completions body_bytes=27520 body_preview={"model":"claude-haiku-4.5","max_tokens":512,"temperature":0.3,"messages":[{"role":"system","content":"# Test Agent\n\nYou are a test agent. Respond to requests and use tools when needed."},{"role":"user","content":"Hello, what is your name?"},{"role":"user","content":"Hello, what is your name?","_ts":1774447100}],"tools":[{"type":"function","function":{"name":"nostr_post","description":"Publish a Nostr event to connected relays","parameters":{"type":"object","properties":{"kind":{"type":"integer","description":"Nostr event kind number (for example 1 for note, 7 for reaction, 30023 for longform)"},"content":{"type":"string","description":"Event content/body text to publish"},"tags":{"type":"array","description":"Optional Nostr tags array, e.g. [[\"d\",\"my-skill\"],[\"t\",\"nostr\"]]","items":{"type":"array","items":{"type":"string"}}}},"required":["kind","content"]}}},{"type":"function","function":{"name":"nostr_query","description":"Query events from relays using a Nostr filter","parameters":{"type":"object","properties":{"filter":{"type":"object","description":"Nostr filter object (authors, kinds, ids, since, until, limit, and tag filters)"},"timeout_ms":{"type":"integer","description":"Optional query timeout in milliseconds"}},"required":["filter"]}}},{"type":"function","function":{"name":"local_shell_exec","description":"Execute a shell command and return stdout/stderr","parameters":{"type":"object","properties":{"command":{"type":"string","description":"Shell command to execute in the configured working directory"}},"required":["command"]}}},{"type":"function","function":{"name":"local_file_read","description":"Read a local file as text from the configured working directory","parameters":{"type":"object","properties":{"path":{"type":"string","description":"Path to file to read (relative to configured working directory)"},"max_bytes":{"type":"integer","description":"Optional maximum bytes to return"}},"required":["path"]}}},{"type":"function","function":{"name":"local_file_write","description":"Write text content to a local file in the configured working directory","parameters":{"type":"object","properties":{"path":{"type":"string","description":"Path to file to write (relative to configured working directory)"},"content":{"type":"string","description":"Text content to write"},"append":{"type":"boolean","description":"When true, append to file instead of overwriting"}},"required":["path","content"]}}},{"type":"function","function":{"name":"nostr_post_readme","description":"Publish README.md as kind 30023 with deterministic d tag readme.md","parameters":{"type":"object","properties":{},"required":[]}}},{"type":"function","function":{"name":"nostr_delete","description":"Request deletion of one or more previously published events (NIP-09 kind 5)","parameters":{"type":"object","properties":{"event_ids":{"type":"array","description":"Event IDs to request deletion for","items":{"type":"string"}},"kinds":{"type":"array","description":"Optional kinds corresponding to event_ids entries","items":{"type":"integer"}},"reason":{"type":"string","description":"Optional human-readable reason"}},"required":["event_ids"]}}},{"type":"function","function":{"name":"nostr_react","description":"React to a Nostr event with like/dislike/emoji (NIP-25 kind 7)","parameters":{"type":"object","properties":{"event_id":{"type":"string","description":"Target event ID to react to"},"event_pubkey":{"type":"string","description":"Author pubkey of target event"},"event_kind":{"type":"integer","description":"Optional kind of target event"},"reaction":{"type":"string","description":"Reaction content such as +, -, ❤️, or emoji"}},"required":["event_id","event_pubkey"]}}},{"type":"function","function":{"name":"nostr_profile_get","description":"Look up a Nostr profile (kind 0 metadata) by pubkey","parameters":{"type":"object","properties":{"pubkey":{"type":"string","description":"Hex pubkey of the profile to fetch"}},"required":["pubkey"]}}},{"type":"functio...
[2026-03-25 09:58:20] [ERROR] [llm.c:93] [didactyl] llm http request failed: status=401
[2026-03-25 09:58:20] [WARN ] [llm.c:98] [didactyl] llm error response: {"error":{"code":"authentication_error","message":"Invalid Anthropic API Key","type":"invalid_request_error","param":null}}
[2026-03-25 09:58:20] [INFO ] [llm.c:76] [didactyl] llm request: method=POST url=https://api.anthropic.com/v1/chat/completions body_bytes=27550 body_preview={"model":"claude-haiku-4.5","max_tokens":512,"temperature":0.3,"messages":[{"role":"system","content":"# Test Agent\n\nYou are a test agent. Respond to requests and use tools when needed."},{"role":"user","content":"What are you? Describe yourself briefly."},{"role":"user","content":"What are you? Describe yourself briefly.","_ts":1774447100}],"tools":[{"type":"function","function":{"name":"nostr_post","description":"Publish a Nostr event to connected relays","parameters":{"type":"object","properties":{"kind":{"type":"integer","description":"Nostr event kind number (for example 1 for note, 7 for reaction, 30023 for longform)"},"content":{"type":"string","description":"Event content/body text to publish"},"tags":{"type":"array","description":"Optional Nostr tags array, e.g. [[\"d\",\"my-skill\"],[\"t\",\"nostr\"]]","items":{"type":"array","items":{"type":"string"}}}},"required":["kind","content"]}}},{"type":"function","function":{"name":"nostr_query","description":"Query events from relays using a Nostr filter","parameters":{"type":"object","properties":{"filter":{"type":"object","description":"Nostr filter object (authors, kinds, ids, since, until, limit, and tag filters)"},"timeout_ms":{"type":"integer","description":"Optional query timeout in milliseconds"}},"required":["filter"]}}},{"type":"function","function":{"name":"local_shell_exec","description":"Execute a shell command and return stdout/stderr","parameters":{"type":"object","properties":{"command":{"type":"string","description":"Shell command to execute in the configured working directory"}},"required":["command"]}}},{"type":"function","function":{"name":"local_file_read","description":"Read a local file as text from the configured working directory","parameters":{"type":"object","properties":{"path":{"type":"string","description":"Path to file to read (relative to configured working directory)"},"max_bytes":{"type":"integer","description":"Optional maximum bytes to return"}},"required":["path"]}}},{"type":"function","function":{"name":"local_file_write","description":"Write text content to a local file in the configured working directory","parameters":{"type":"object","properties":{"path":{"type":"string","description":"Path to file to write (relative to configured working directory)"},"content":{"type":"string","description":"Text content to write"},"append":{"type":"boolean","description":"When true, append to file instead of overwriting"}},"required":["path","content"]}}},{"type":"function","function":{"name":"nostr_post_readme","description":"Publish README.md as kind 30023 with deterministic d tag readme.md","parameters":{"type":"object","properties":{},"required":[]}}},{"type":"function","function":{"name":"nostr_delete","description":"Request deletion of one or more previously published events (NIP-09 kind 5)","parameters":{"type":"object","properties":{"event_ids":{"type":"array","description":"Event IDs to request deletion for","items":{"type":"string"}},"kinds":{"type":"array","description":"Optional kinds corresponding to event_ids entries","items":{"type":"integer"}},"reason":{"type":"string","description":"Optional human-readable reason"}},"required":["event_ids"]}}},{"type":"function","function":{"name":"nostr_react","description":"React to a Nostr event with like/dislike/emoji (NIP-25 kind 7)","parameters":{"type":"object","properties":{"event_id":{"type":"string","description":"Target event ID to react to"},"event_pubkey":{"type":"string","description":"Author pubkey of target event"},"event_kind":{"type":"integer","description":"Optional kind of target event"},"reaction":{"type":"string","description":"Reaction content such as +, -, ❤️, or emoji"}},"required":["event_id","event_pubkey"]}}},{"type":"function","function":{"name":"nostr_profile_get","description":"Look up a Nostr profile (kind 0 metadata) by pubkey","parameters":{"type":"object","properties":{"pubkey":{"type":"string","description":"Hex pubkey of the profile to fetch"}},"required":...
[2026-03-25 09:58:21] [ERROR] [llm.c:93] [didactyl] llm http request failed: status=401
[2026-03-25 09:58:21] [WARN ] [llm.c:98] [didactyl] llm error response: {"error":{"code":"authentication_error","message":"Invalid Anthropic API Key","type":"invalid_request_error","param":null}}
[2026-03-25 09:58:21] [INFO ] [llm.c:336] [didactyl] llm request sanitizer: removed 2 empty text message(s) before provider request
[2026-03-25 09:58:21] [INFO ] [llm.c:76] [didactyl] llm request: method=POST url=https://api.anthropic.com/v1/chat/completions body_bytes=27395 body_preview={"model":"claude-haiku-4.5","max_tokens":512,"temperature":0.3,"messages":[{"role":"system","content":"# Test Agent\n\nYou are a test agent. Respond to requests and use tools when needed."}],"tools":[{"type":"function","function":{"name":"nostr_post","description":"Publish a Nostr event to connected relays","parameters":{"type":"object","properties":{"kind":{"type":"integer","description":"Nostr event kind number (for example 1 for note, 7 for reaction, 30023 for longform)"},"content":{"type":"string","description":"Event content/body text to publish"},"tags":{"type":"array","description":"Optional Nostr tags array, e.g. [[\"d\",\"my-skill\"],[\"t\",\"nostr\"]]","items":{"type":"array","items":{"type":"string"}}}},"required":["kind","content"]}}},{"type":"function","function":{"name":"nostr_query","description":"Query events from relays using a Nostr filter","parameters":{"type":"object","properties":{"filter":{"type":"object","description":"Nostr filter object (authors, kinds, ids, since, until, limit, and tag filters)"},"timeout_ms":{"type":"integer","description":"Optional query timeout in milliseconds"}},"required":["filter"]}}},{"type":"function","function":{"name":"local_shell_exec","description":"Execute a shell command and return stdout/stderr","parameters":{"type":"object","properties":{"command":{"type":"string","description":"Shell command to execute in the configured working directory"}},"required":["command"]}}},{"type":"function","function":{"name":"local_file_read","description":"Read a local file as text from the configured working directory","parameters":{"type":"object","properties":{"path":{"type":"string","description":"Path to file to read (relative to configured working directory)"},"max_bytes":{"type":"integer","description":"Optional maximum bytes to return"}},"required":["path"]}}},{"type":"function","function":{"name":"local_file_write","description":"Write text content to a local file in the configured working directory","parameters":{"type":"object","properties":{"path":{"type":"string","description":"Path to file to write (relative to configured working directory)"},"content":{"type":"string","description":"Text content to write"},"append":{"type":"boolean","description":"When true, append to file instead of overwriting"}},"required":["path","content"]}}},{"type":"function","function":{"name":"nostr_post_readme","description":"Publish README.md as kind 30023 with deterministic d tag readme.md","parameters":{"type":"object","properties":{},"required":[]}}},{"type":"function","function":{"name":"nostr_delete","description":"Request deletion of one or more previously published events (NIP-09 kind 5)","parameters":{"type":"object","properties":{"event_ids":{"type":"array","description":"Event IDs to request deletion for","items":{"type":"string"}},"kinds":{"type":"array","description":"Optional kinds corresponding to event_ids entries","items":{"type":"integer"}},"reason":{"type":"string","description":"Optional human-readable reason"}},"required":["event_ids"]}}},{"type":"function","function":{"name":"nostr_react","description":"React to a Nostr event with like/dislike/emoji (NIP-25 kind 7)","parameters":{"type":"object","properties":{"event_id":{"type":"string","description":"Target event ID to react to"},"event_pubkey":{"type":"string","description":"Author pubkey of target event"},"event_kind":{"type":"integer","description":"Optional kind of target event"},"reaction":{"type":"string","description":"Reaction content such as +, -, ❤️, or emoji"}},"required":["event_id","event_pubkey"]}}},{"type":"function","function":{"name":"nostr_profile_get","description":"Look up a Nostr profile (kind 0 metadata) by pubkey","parameters":{"type":"object","properties":{"pubkey":{"type":"string","description":"Hex pubkey of the profile to fetch"}},"required":["pubkey"]}}},{"type":"function","function":{"name":"nostr_relay_status","description":"Get connection status and statistics for all relays","parameters":{...
[2026-03-25 09:58:22] [ERROR] [llm.c:93] [didactyl] llm http request failed: status=401
[2026-03-25 09:58:22] [WARN ] [llm.c:98] [didactyl] llm error response: {"error":{"code":"authentication_error","message":"Invalid Anthropic API Key","type":"invalid_request_error","param":null}}
[2026-03-25 09:58:22] [TRACE] [nostr_handler.c:162] [didactyl] [nostr:websocket] RECV <large EVENT frame suppressed, bytes=460>
[2026-03-25 09:58:22] [TRACE] [nostr_handler.c:162] [didactyl] [nostr:websocket] RECV <large EVENT frame suppressed, bytes=462>
[2026-03-25 09:58:22] [INFO ] [llm.c:76] [didactyl] llm request: method=POST url=https://api.anthropic.com/v1/chat/completions body_bytes=47470 body_preview={"model":"claude-haiku-4.5","max_tokens":512,"temperature":0.3,"messages":[{"role":"system","content":"# Test Agent\n\nYou are a test agent. Respond to requests and use tools when needed."},{"role":"user","content":"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA...
[2026-03-25 09:58:22] [ERROR] [llm.c:93] [didactyl] llm http request failed: status=401
[2026-03-25 09:58:22] [WARN ] [llm.c:98] [didactyl] llm error response: {"error":{"code":"authentication_error","message":"Invalid Anthropic API Key","type":"invalid_request_error","param":null}}
[2026-03-25 09:58:22] [TRACE] [nostr_handler.c:162] [didactyl] [nostr:websocket] RECV <large EVENT frame suppressed, bytes=469>
[2026-03-25 09:58:22] [TRACE] [nostr_handler.c:162] [didactyl] [nostr:websocket] RECV <large EVENT frame suppressed, bytes=471>
[2026-03-25 09:58:22] [TRACE] [nostr_handler.c:162] [didactyl] [nostr:websocket] RECV <large EVENT frame suppressed, bytes=602>
[2026-03-25 09:58:22] [INFO ] [nostr_handler.c:2151] [didactyl] self-skill cache received kind=31124 d_tag=identity_and_rules id=832e2a43d2325d8e538fb4fec67dfcdb9f42223cd43a289a477c3fd1bd0ae259 created_at=1774447102 via wss://relay.damus.io
[2026-03-25 09:58:22] [INFO ] [trigger_manager.c:1364] [didactyl] trigger updated d_tag=identity_and_rules action=0 enabled=1
[2026-03-25 09:58:22] [INFO ] [nostr_handler.c:1207] [didactyl] live self-skill trigger registered d_tag=identity_and_rules action=llm enabled=1
[2026-03-25 09:58:22] [TRACE] [nostr_handler.c:162] [didactyl] [nostr:websocket] RECV <large EVENT frame suppressed, bytes=604>
[2026-03-25 09:58:22] [INFO ] [nostr_handler.c:2151] [didactyl] self-skill cache received kind=31124 d_tag=identity_and_rules id=832e2a43d2325d8e538fb4fec67dfcdb9f42223cd43a289a477c3fd1bd0ae259 created_at=1774447102 via wss://relay.primal.net
[2026-03-25 09:58:22] [INFO ] [trigger_manager.c:1364] [didactyl] trigger updated d_tag=identity_and_rules action=0 enabled=1
[2026-03-25 09:58:22] [INFO ] [nostr_handler.c:1207] [didactyl] live self-skill trigger registered d_tag=identity_and_rules action=llm enabled=1
[2026-03-25 09:58:22] [TRACE] [nostr_handler.c:162] [didactyl] [nostr:websocket] RECV <large EVENT frame suppressed, bytes=538>
[2026-03-25 09:58:22] [INFO ] [nostr_handler.c:2151] [didactyl] self-skill cache received kind=10123 d_tag=- id=d1fc3cfb4b7db93639baee6726e7203105ac4bc630446feb62f0e9d03cd694d2 created_at=1774447102 via wss://relay.damus.io
[2026-03-25 09:58:22] [TRACE] [nostr_handler.c:162] [didactyl] [nostr:websocket] RECV <large EVENT frame suppressed, bytes=540>
[2026-03-25 09:58:22] [INFO ] [nostr_handler.c:2151] [didactyl] self-skill cache received kind=10123 d_tag=- id=d1fc3cfb4b7db93639baee6726e7203105ac4bc630446feb62f0e9d03cd694d2 created_at=1774447102 via wss://relay.primal.net
[2026-03-25 09:58:27] [INFO ] [llm.c:76] [didactyl] llm request: method=POST url=https://api.anthropic.com/v1/chat/completions body_bytes=27520 body_preview={"model":"claude-haiku-4.5","max_tokens":512,"temperature":0.3,"messages":[{"role":"system","content":"# Test Agent\n\nYou are a test agent. Respond to requests and use tools when needed."},{"role":"user","content":"After restart, say hello."},{"role":"user","content":"After restart, say hello.","_ts":1774447107}],"tools":[{"type":"function","function":{"name":"nostr_post","description":"Publish a Nostr event to connected relays","parameters":{"type":"object","properties":{"kind":{"type":"integer","description":"Nostr event kind number (for example 1 for note, 7 for reaction, 30023 for longform)"},"content":{"type":"string","description":"Event content/body text to publish"},"tags":{"type":"array","description":"Optional Nostr tags array, e.g. [[\"d\",\"my-skill\"],[\"t\",\"nostr\"]]","items":{"type":"array","items":{"type":"string"}}}},"required":["kind","content"]}}},{"type":"function","function":{"name":"nostr_query","description":"Query events from relays using a Nostr filter","parameters":{"type":"object","properties":{"filter":{"type":"object","description":"Nostr filter object (authors, kinds, ids, since, until, limit, and tag filters)"},"timeout_ms":{"type":"integer","description":"Optional query timeout in milliseconds"}},"required":["filter"]}}},{"type":"function","function":{"name":"local_shell_exec","description":"Execute a shell command and return stdout/stderr","parameters":{"type":"object","properties":{"command":{"type":"string","description":"Shell command to execute in the configured working directory"}},"required":["command"]}}},{"type":"function","function":{"name":"local_file_read","description":"Read a local file as text from the configured working directory","parameters":{"type":"object","properties":{"path":{"type":"string","description":"Path to file to read (relative to configured working directory)"},"max_bytes":{"type":"integer","description":"Optional maximum bytes to return"}},"required":["path"]}}},{"type":"function","function":{"name":"local_file_write","description":"Write text content to a local file in the configured working directory","parameters":{"type":"object","properties":{"path":{"type":"string","description":"Path to file to write (relative to configured working directory)"},"content":{"type":"string","description":"Text content to write"},"append":{"type":"boolean","description":"When true, append to file instead of overwriting"}},"required":["path","content"]}}},{"type":"function","function":{"name":"nostr_post_readme","description":"Publish README.md as kind 30023 with deterministic d tag readme.md","parameters":{"type":"object","properties":{},"required":[]}}},{"type":"function","function":{"name":"nostr_delete","description":"Request deletion of one or more previously published events (NIP-09 kind 5)","parameters":{"type":"object","properties":{"event_ids":{"type":"array","description":"Event IDs to request deletion for","items":{"type":"string"}},"kinds":{"type":"array","description":"Optional kinds corresponding to event_ids entries","items":{"type":"integer"}},"reason":{"type":"string","description":"Optional human-readable reason"}},"required":["event_ids"]}}},{"type":"function","function":{"name":"nostr_react","description":"React to a Nostr event with like/dislike/emoji (NIP-25 kind 7)","parameters":{"type":"object","properties":{"event_id":{"type":"string","description":"Target event ID to react to"},"event_pubkey":{"type":"string","description":"Author pubkey of target event"},"event_kind":{"type":"integer","description":"Optional kind of target event"},"reaction":{"type":"string","description":"Reaction content such as +, -, ❤️, or emoji"}},"required":["event_id","event_pubkey"]}}},{"type":"function","function":{"name":"nostr_profile_get","description":"Look up a Nostr profile (kind 0 metadata) by pubkey","parameters":{"type":"object","properties":{"pubkey":{"type":"string","description":"Hex pubkey of the profile to fetch"}},"required":["pubkey"]}}},{"type":"functio...
[2026-03-25 09:58:28] [ERROR] [llm.c:93] [didactyl] llm http request failed: status=401
[2026-03-25 09:58:28] [WARN ] [llm.c:98] [didactyl] llm error response: {"error":{"code":"authentication_error","message":"Invalid Anthropic API Key","type":"invalid_request_error","param":null}}
[2026-03-25 09:58:28] [INFO ] [llm.c:76] [didactyl] llm request: method=POST url=https://api.anthropic.com/v1/chat/completions body_bytes=27522 body_preview={"model":"claude-haiku-4.5","max_tokens":512,"temperature":0.3,"messages":[{"role":"system","content":"# Test Agent\n\nYou are a test agent. Respond to requests and use tools when needed."},{"role":"user","content":"Say hello in one sentence."},{"role":"user","content":"Say hello in one sentence.","_ts":1774447108}],"tools":[{"type":"function","function":{"name":"nostr_post","description":"Publish a Nostr event to connected relays","parameters":{"type":"object","properties":{"kind":{"type":"integer","description":"Nostr event kind number (for example 1 for note, 7 for reaction, 30023 for longform)"},"content":{"type":"string","description":"Event content/body text to publish"},"tags":{"type":"array","description":"Optional Nostr tags array, e.g. [[\"d\",\"my-skill\"],[\"t\",\"nostr\"]]","items":{"type":"array","items":{"type":"string"}}}},"required":["kind","content"]}}},{"type":"function","function":{"name":"nostr_query","description":"Query events from relays using a Nostr filter","parameters":{"type":"object","properties":{"filter":{"type":"object","description":"Nostr filter object (authors, kinds, ids, since, until, limit, and tag filters)"},"timeout_ms":{"type":"integer","description":"Optional query timeout in milliseconds"}},"required":["filter"]}}},{"type":"function","function":{"name":"local_shell_exec","description":"Execute a shell command and return stdout/stderr","parameters":{"type":"object","properties":{"command":{"type":"string","description":"Shell command to execute in the configured working directory"}},"required":["command"]}}},{"type":"function","function":{"name":"local_file_read","description":"Read a local file as text from the configured working directory","parameters":{"type":"object","properties":{"path":{"type":"string","description":"Path to file to read (relative to configured working directory)"},"max_bytes":{"type":"integer","description":"Optional maximum bytes to return"}},"required":["path"]}}},{"type":"function","function":{"name":"local_file_write","description":"Write text content to a local file in the configured working directory","parameters":{"type":"object","properties":{"path":{"type":"string","description":"Path to file to write (relative to configured working directory)"},"content":{"type":"string","description":"Text content to write"},"append":{"type":"boolean","description":"When true, append to file instead of overwriting"}},"required":["path","content"]}}},{"type":"function","function":{"name":"nostr_post_readme","description":"Publish README.md as kind 30023 with deterministic d tag readme.md","parameters":{"type":"object","properties":{},"required":[]}}},{"type":"function","function":{"name":"nostr_delete","description":"Request deletion of one or more previously published events (NIP-09 kind 5)","parameters":{"type":"object","properties":{"event_ids":{"type":"array","description":"Event IDs to request deletion for","items":{"type":"string"}},"kinds":{"type":"array","description":"Optional kinds corresponding to event_ids entries","items":{"type":"integer"}},"reason":{"type":"string","description":"Optional human-readable reason"}},"required":["event_ids"]}}},{"type":"function","function":{"name":"nostr_react","description":"React to a Nostr event with like/dislike/emoji (NIP-25 kind 7)","parameters":{"type":"object","properties":{"event_id":{"type":"string","description":"Target event ID to react to"},"event_pubkey":{"type":"string","description":"Author pubkey of target event"},"event_kind":{"type":"integer","description":"Optional kind of target event"},"reaction":{"type":"string","description":"Reaction content such as +, -, ❤️, or emoji"}},"required":["event_id","event_pubkey"]}}},{"type":"function","function":{"name":"nostr_profile_get","description":"Look up a Nostr profile (kind 0 metadata) by pubkey","parameters":{"type":"object","properties":{"pubkey":{"type":"string","description":"Hex pubkey of the profile to fetch"}},"required":["pubkey"]}}},{"type":"funct...
[2026-03-25 09:58:28] [ERROR] [llm.c:93] [didactyl] llm http request failed: status=401
[2026-03-25 09:58:28] [WARN ] [llm.c:98] [didactyl] llm error response: {"error":{"code":"authentication_error","message":"Invalid Anthropic API Key","type":"invalid_request_error","param":null}}
[2026-03-25 09:58:29] [INFO ] [llm.c:76] [didactyl] llm request: method=POST url=https://api.anthropic.com/v1/chat/completions body_bytes=27516 body_preview={"model":"claude-haiku-4.5","max_tokens":512,"temperature":0.3,"messages":[{"role":"system","content":"# Test Agent\n\nYou are a test agent. Respond to requests and use tools when needed."},{"role":"user","content":"List your blossom blobs"},{"role":"user","content":"List your blossom blobs","_ts":1774447109}],"tools":[{"type":"function","function":{"name":"nostr_post","description":"Publish a Nostr event to connected relays","parameters":{"type":"object","properties":{"kind":{"type":"integer","description":"Nostr event kind number (for example 1 for note, 7 for reaction, 30023 for longform)"},"content":{"type":"string","description":"Event content/body text to publish"},"tags":{"type":"array","description":"Optional Nostr tags array, e.g. [[\"d\",\"my-skill\"],[\"t\",\"nostr\"]]","items":{"type":"array","items":{"type":"string"}}}},"required":["kind","content"]}}},{"type":"function","function":{"name":"nostr_query","description":"Query events from relays using a Nostr filter","parameters":{"type":"object","properties":{"filter":{"type":"object","description":"Nostr filter object (authors, kinds, ids, since, until, limit, and tag filters)"},"timeout_ms":{"type":"integer","description":"Optional query timeout in milliseconds"}},"required":["filter"]}}},{"type":"function","function":{"name":"local_shell_exec","description":"Execute a shell command and return stdout/stderr","parameters":{"type":"object","properties":{"command":{"type":"string","description":"Shell command to execute in the configured working directory"}},"required":["command"]}}},{"type":"function","function":{"name":"local_file_read","description":"Read a local file as text from the configured working directory","parameters":{"type":"object","properties":{"path":{"type":"string","description":"Path to file to read (relative to configured working directory)"},"max_bytes":{"type":"integer","description":"Optional maximum bytes to return"}},"required":["path"]}}},{"type":"function","function":{"name":"local_file_write","description":"Write text content to a local file in the configured working directory","parameters":{"type":"object","properties":{"path":{"type":"string","description":"Path to file to write (relative to configured working directory)"},"content":{"type":"string","description":"Text content to write"},"append":{"type":"boolean","description":"When true, append to file instead of overwriting"}},"required":["path","content"]}}},{"type":"function","function":{"name":"nostr_post_readme","description":"Publish README.md as kind 30023 with deterministic d tag readme.md","parameters":{"type":"object","properties":{},"required":[]}}},{"type":"function","function":{"name":"nostr_delete","description":"Request deletion of one or more previously published events (NIP-09 kind 5)","parameters":{"type":"object","properties":{"event_ids":{"type":"array","description":"Event IDs to request deletion for","items":{"type":"string"}},"kinds":{"type":"array","description":"Optional kinds corresponding to event_ids entries","items":{"type":"integer"}},"reason":{"type":"string","description":"Optional human-readable reason"}},"required":["event_ids"]}}},{"type":"function","function":{"name":"nostr_react","description":"React to a Nostr event with like/dislike/emoji (NIP-25 kind 7)","parameters":{"type":"object","properties":{"event_id":{"type":"string","description":"Target event ID to react to"},"event_pubkey":{"type":"string","description":"Author pubkey of target event"},"event_kind":{"type":"integer","description":"Optional kind of target event"},"reaction":{"type":"string","description":"Reaction content such as +, -, ❤️, or emoji"}},"required":["event_id","event_pubkey"]}}},{"type":"function","function":{"name":"nostr_profile_get","description":"Look up a Nostr profile (kind 0 metadata) by pubkey","parameters":{"type":"object","properties":{"pubkey":{"type":"string","description":"Hex pubkey of the profile to fetch"}},"required":["pubkey"]}}},{"type":"function","...
[2026-03-25 09:58:30] [ERROR] [llm.c:93] [didactyl] llm http request failed: status=401
[2026-03-25 09:58:30] [WARN ] [llm.c:98] [didactyl] llm error response: {"error":{"code":"authentication_error","message":"Invalid Anthropic API Key","type":"invalid_request_error","param":null}}
[2026-03-25 09:58:30] [TRACE] [nostr_handler.c:162] [didactyl] [nostr:websocket] RECV <large EVENT frame suppressed, bytes=540>
[2026-03-25 09:58:30] [INFO ] [nostr_handler.c:2151] [didactyl] self-skill cache received kind=10123 d_tag=- id=11b414ef25e76ad7556d48b8386311bcdc429a56b8300e42e6a382f9bc02edac created_at=1774447109 via wss://relay.primal.net
[2026-03-25 09:58:30] [TRACE] [nostr_handler.c:162] [didactyl] [nostr:websocket] RECV <large EVENT frame suppressed, bytes=471>
[2026-03-25 09:58:30] [TRACE] [nostr_handler.c:162] [didactyl] [nostr:websocket] RECV <large EVENT frame suppressed, bytes=462>
[2026-03-25 09:58:30] [INFO ] [llm.c:76] [didactyl] llm request: method=POST url=https://api.anthropic.com/v1/chat/completions body_bytes=27532 body_preview={"model":"claude-haiku-4.5","max_tokens":512,"temperature":0.3,"messages":[{"role":"system","content":"# Test Agent\n\nYou are a test agent. Respond to requests and use tools when needed."},{"role":"user","content":"Check your cashu wallet balance"},{"role":"user","content":"Check your cashu wallet balance","_ts":1774447110}],"tools":[{"type":"function","function":{"name":"nostr_post","description":"Publish a Nostr event to connected relays","parameters":{"type":"object","properties":{"kind":{"type":"integer","description":"Nostr event kind number (for example 1 for note, 7 for reaction, 30023 for longform)"},"content":{"type":"string","description":"Event content/body text to publish"},"tags":{"type":"array","description":"Optional Nostr tags array, e.g. [[\"d\",\"my-skill\"],[\"t\",\"nostr\"]]","items":{"type":"array","items":{"type":"string"}}}},"required":["kind","content"]}}},{"type":"function","function":{"name":"nostr_query","description":"Query events from relays using a Nostr filter","parameters":{"type":"object","properties":{"filter":{"type":"object","description":"Nostr filter object (authors, kinds, ids, since, until, limit, and tag filters)"},"timeout_ms":{"type":"integer","description":"Optional query timeout in milliseconds"}},"required":["filter"]}}},{"type":"function","function":{"name":"local_shell_exec","description":"Execute a shell command and return stdout/stderr","parameters":{"type":"object","properties":{"command":{"type":"string","description":"Shell command to execute in the configured working directory"}},"required":["command"]}}},{"type":"function","function":{"name":"local_file_read","description":"Read a local file as text from the configured working directory","parameters":{"type":"object","properties":{"path":{"type":"string","description":"Path to file to read (relative to configured working directory)"},"max_bytes":{"type":"integer","description":"Optional maximum bytes to return"}},"required":["path"]}}},{"type":"function","function":{"name":"local_file_write","description":"Write text content to a local file in the configured working directory","parameters":{"type":"object","properties":{"path":{"type":"string","description":"Path to file to write (relative to configured working directory)"},"content":{"type":"string","description":"Text content to write"},"append":{"type":"boolean","description":"When true, append to file instead of overwriting"}},"required":["path","content"]}}},{"type":"function","function":{"name":"nostr_post_readme","description":"Publish README.md as kind 30023 with deterministic d tag readme.md","parameters":{"type":"object","properties":{},"required":[]}}},{"type":"function","function":{"name":"nostr_delete","description":"Request deletion of one or more previously published events (NIP-09 kind 5)","parameters":{"type":"object","properties":{"event_ids":{"type":"array","description":"Event IDs to request deletion for","items":{"type":"string"}},"kinds":{"type":"array","description":"Optional kinds corresponding to event_ids entries","items":{"type":"integer"}},"reason":{"type":"string","description":"Optional human-readable reason"}},"required":["event_ids"]}}},{"type":"function","function":{"name":"nostr_react","description":"React to a Nostr event with like/dislike/emoji (NIP-25 kind 7)","parameters":{"type":"object","properties":{"event_id":{"type":"string","description":"Target event ID to react to"},"event_pubkey":{"type":"string","description":"Author pubkey of target event"},"event_kind":{"type":"integer","description":"Optional kind of target event"},"reaction":{"type":"string","description":"Reaction content such as +, -, ❤️, or emoji"}},"required":["event_id","event_pubkey"]}}},{"type":"function","function":{"name":"nostr_profile_get","description":"Look up a Nostr profile (kind 0 metadata) by pubkey","parameters":{"type":"object","properties":{"pubkey":{"type":"string","description":"Hex pubkey of the profile to fetch"}},"required":["pubkey"]}}},{"ty...
[2026-03-25 09:58:30] [ERROR] [llm.c:93] [didactyl] llm http request failed: status=401
[2026-03-25 09:58:30] [WARN ] [llm.c:98] [didactyl] llm error response: {"error":{"code":"authentication_error","message":"Invalid Anthropic API Key","type":"invalid_request_error","param":null}}
[2026-03-25 09:58:30] [TRACE] [nostr_handler.c:162] [didactyl] [nostr:websocket] RECV <large EVENT frame suppressed, bytes=604>
[2026-03-25 09:58:30] [INFO ] [nostr_handler.c:2151] [didactyl] self-skill cache received kind=31124 d_tag=identity_and_rules id=d55623b990437049aa50e7e24cc3e4a989f08e0d40c95fc0e8f618ca8db50a54 created_at=1774447109 via wss://relay.primal.net
[2026-03-25 09:58:30] [INFO ] [trigger_manager.c:1364] [didactyl] trigger updated d_tag=identity_and_rules action=0 enabled=1
[2026-03-25 09:58:30] [INFO ] [nostr_handler.c:1207] [didactyl] live self-skill trigger registered d_tag=identity_and_rules action=llm enabled=1
[2026-03-25 09:58:31] [TRACE] [nostr_handler.c:162] [didactyl] [nostr:websocket] RECV <large EVENT frame suppressed, bytes=469>
[2026-03-25 09:58:31] [INFO ] [llm.c:76] [didactyl] llm request: method=POST url=https://api.anthropic.com/v1/chat/completions body_bytes=27532 body_preview={"model":"claude-haiku-4.5","max_tokens":512,"temperature":0.3,"messages":[{"role":"system","content":"# Test Agent\n\nYou are a test agent. Respond to requests and use tools when needed."},{"role":"user","content":"What is your public key in hex?"},{"role":"user","content":"What is your public key in hex?","_ts":1774447111}],"tools":[{"type":"function","function":{"name":"nostr_post","description":"Publish a Nostr event to connected relays","parameters":{"type":"object","properties":{"kind":{"type":"integer","description":"Nostr event kind number (for example 1 for note, 7 for reaction, 30023 for longform)"},"content":{"type":"string","description":"Event content/body text to publish"},"tags":{"type":"array","description":"Optional Nostr tags array, e.g. [[\"d\",\"my-skill\"],[\"t\",\"nostr\"]]","items":{"type":"array","items":{"type":"string"}}}},"required":["kind","content"]}}},{"type":"function","function":{"name":"nostr_query","description":"Query events from relays using a Nostr filter","parameters":{"type":"object","properties":{"filter":{"type":"object","description":"Nostr filter object (authors, kinds, ids, since, until, limit, and tag filters)"},"timeout_ms":{"type":"integer","description":"Optional query timeout in milliseconds"}},"required":["filter"]}}},{"type":"function","function":{"name":"local_shell_exec","description":"Execute a shell command and return stdout/stderr","parameters":{"type":"object","properties":{"command":{"type":"string","description":"Shell command to execute in the configured working directory"}},"required":["command"]}}},{"type":"function","function":{"name":"local_file_read","description":"Read a local file as text from the configured working directory","parameters":{"type":"object","properties":{"path":{"type":"string","description":"Path to file to read (relative to configured working directory)"},"max_bytes":{"type":"integer","description":"Optional maximum bytes to return"}},"required":["path"]}}},{"type":"function","function":{"name":"local_file_write","description":"Write text content to a local file in the configured working directory","parameters":{"type":"object","properties":{"path":{"type":"string","description":"Path to file to write (relative to configured working directory)"},"content":{"type":"string","description":"Text content to write"},"append":{"type":"boolean","description":"When true, append to file instead of overwriting"}},"required":["path","content"]}}},{"type":"function","function":{"name":"nostr_post_readme","description":"Publish README.md as kind 30023 with deterministic d tag readme.md","parameters":{"type":"object","properties":{},"required":[]}}},{"type":"function","function":{"name":"nostr_delete","description":"Request deletion of one or more previously published events (NIP-09 kind 5)","parameters":{"type":"object","properties":{"event_ids":{"type":"array","description":"Event IDs to request deletion for","items":{"type":"string"}},"kinds":{"type":"array","description":"Optional kinds corresponding to event_ids entries","items":{"type":"integer"}},"reason":{"type":"string","description":"Optional human-readable reason"}},"required":["event_ids"]}}},{"type":"function","function":{"name":"nostr_react","description":"React to a Nostr event with like/dislike/emoji (NIP-25 kind 7)","parameters":{"type":"object","properties":{"event_id":{"type":"string","description":"Target event ID to react to"},"event_pubkey":{"type":"string","description":"Author pubkey of target event"},"event_kind":{"type":"integer","description":"Optional kind of target event"},"reaction":{"type":"string","description":"Reaction content such as +, -, ❤️, or emoji"}},"required":["event_id","event_pubkey"]}}},{"type":"function","function":{"name":"nostr_profile_get","description":"Look up a Nostr profile (kind 0 metadata) by pubkey","parameters":{"type":"object","properties":{"pubkey":{"type":"string","description":"Hex pubkey of the profile to fetch"}},"required":["pubkey"]}}},{"ty...
[2026-03-25 09:58:31] [ERROR] [llm.c:93] [didactyl] llm http request failed: status=401
[2026-03-25 09:58:31] [WARN ] [llm.c:98] [didactyl] llm error response: {"error":{"code":"authentication_error","message":"Invalid Anthropic API Key","type":"invalid_request_error","param":null}}
[2026-03-25 09:58:31] [INFO ] [llm.c:76] [didactyl] llm request: method=POST url=https://api.anthropic.com/v1/chat/completions body_bytes=27506 body_preview={"model":"claude-haiku-4.5","max_tokens":512,"temperature":0.3,"messages":[{"role":"system","content":"# Test Agent\n\nYou are a test agent. Respond to requests and use tools when needed."},{"role":"user","content":"What is your npub?"},{"role":"user","content":"What is your npub?","_ts":1774447111}],"tools":[{"type":"function","function":{"name":"nostr_post","description":"Publish a Nostr event to connected relays","parameters":{"type":"object","properties":{"kind":{"type":"integer","description":"Nostr event kind number (for example 1 for note, 7 for reaction, 30023 for longform)"},"content":{"type":"string","description":"Event content/body text to publish"},"tags":{"type":"array","description":"Optional Nostr tags array, e.g. [[\"d\",\"my-skill\"],[\"t\",\"nostr\"]]","items":{"type":"array","items":{"type":"string"}}}},"required":["kind","content"]}}},{"type":"function","function":{"name":"nostr_query","description":"Query events from relays using a Nostr filter","parameters":{"type":"object","properties":{"filter":{"type":"object","description":"Nostr filter object (authors, kinds, ids, since, until, limit, and tag filters)"},"timeout_ms":{"type":"integer","description":"Optional query timeout in milliseconds"}},"required":["filter"]}}},{"type":"function","function":{"name":"local_shell_exec","description":"Execute a shell command and return stdout/stderr","parameters":{"type":"object","properties":{"command":{"type":"string","description":"Shell command to execute in the configured working directory"}},"required":["command"]}}},{"type":"function","function":{"name":"local_file_read","description":"Read a local file as text from the configured working directory","parameters":{"type":"object","properties":{"path":{"type":"string","description":"Path to file to read (relative to configured working directory)"},"max_bytes":{"type":"integer","description":"Optional maximum bytes to return"}},"required":["path"]}}},{"type":"function","function":{"name":"local_file_write","description":"Write text content to a local file in the configured working directory","parameters":{"type":"object","properties":{"path":{"type":"string","description":"Path to file to write (relative to configured working directory)"},"content":{"type":"string","description":"Text content to write"},"append":{"type":"boolean","description":"When true, append to file instead of overwriting"}},"required":["path","content"]}}},{"type":"function","function":{"name":"nostr_post_readme","description":"Publish README.md as kind 30023 with deterministic d tag readme.md","parameters":{"type":"object","properties":{},"required":[]}}},{"type":"function","function":{"name":"nostr_delete","description":"Request deletion of one or more previously published events (NIP-09 kind 5)","parameters":{"type":"object","properties":{"event_ids":{"type":"array","description":"Event IDs to request deletion for","items":{"type":"string"}},"kinds":{"type":"array","description":"Optional kinds corresponding to event_ids entries","items":{"type":"integer"}},"reason":{"type":"string","description":"Optional human-readable reason"}},"required":["event_ids"]}}},{"type":"function","function":{"name":"nostr_react","description":"React to a Nostr event with like/dislike/emoji (NIP-25 kind 7)","parameters":{"type":"object","properties":{"event_id":{"type":"string","description":"Target event ID to react to"},"event_pubkey":{"type":"string","description":"Author pubkey of target event"},"event_kind":{"type":"integer","description":"Optional kind of target event"},"reaction":{"type":"string","description":"Reaction content such as +, -, ❤️, or emoji"}},"required":["event_id","event_pubkey"]}}},{"type":"function","function":{"name":"nostr_profile_get","description":"Look up a Nostr profile (kind 0 metadata) by pubkey","parameters":{"type":"object","properties":{"pubkey":{"type":"string","description":"Hex pubkey of the profile to fetch"}},"required":["pubkey"]}}},{"type":"function","function":...
[2026-03-25 09:58:32] [ERROR] [llm.c:93] [didactyl] llm http request failed: status=401
[2026-03-25 09:58:32] [WARN ] [llm.c:98] [didactyl] llm error response: {"error":{"code":"authentication_error","message":"Invalid Anthropic API Key","type":"invalid_request_error","param":null}}
[2026-03-25 09:58:32] [INFO ] [llm.c:76] [didactyl] llm request: method=POST url=https://api.anthropic.com/v1/chat/completions body_bytes=27524 body_preview={"model":"claude-haiku-4.5","max_tokens":512,"temperature":0.3,"messages":[{"role":"system","content":"# Test Agent\n\nYou are a test agent. Respond to requests and use tools when needed."},{"role":"user","content":"Tell me about your identity"},{"role":"user","content":"Tell me about your identity","_ts":1774447112}],"tools":[{"type":"function","function":{"name":"nostr_post","description":"Publish a Nostr event to connected relays","parameters":{"type":"object","properties":{"kind":{"type":"integer","description":"Nostr event kind number (for example 1 for note, 7 for reaction, 30023 for longform)"},"content":{"type":"string","description":"Event content/body text to publish"},"tags":{"type":"array","description":"Optional Nostr tags array, e.g. [[\"d\",\"my-skill\"],[\"t\",\"nostr\"]]","items":{"type":"array","items":{"type":"string"}}}},"required":["kind","content"]}}},{"type":"function","function":{"name":"nostr_query","description":"Query events from relays using a Nostr filter","parameters":{"type":"object","properties":{"filter":{"type":"object","description":"Nostr filter object (authors, kinds, ids, since, until, limit, and tag filters)"},"timeout_ms":{"type":"integer","description":"Optional query timeout in milliseconds"}},"required":["filter"]}}},{"type":"function","function":{"name":"local_shell_exec","description":"Execute a shell command and return stdout/stderr","parameters":{"type":"object","properties":{"command":{"type":"string","description":"Shell command to execute in the configured working directory"}},"required":["command"]}}},{"type":"function","function":{"name":"local_file_read","description":"Read a local file as text from the configured working directory","parameters":{"type":"object","properties":{"path":{"type":"string","description":"Path to file to read (relative to configured working directory)"},"max_bytes":{"type":"integer","description":"Optional maximum bytes to return"}},"required":["path"]}}},{"type":"function","function":{"name":"local_file_write","description":"Write text content to a local file in the configured working directory","parameters":{"type":"object","properties":{"path":{"type":"string","description":"Path to file to write (relative to configured working directory)"},"content":{"type":"string","description":"Text content to write"},"append":{"type":"boolean","description":"When true, append to file instead of overwriting"}},"required":["path","content"]}}},{"type":"function","function":{"name":"nostr_post_readme","description":"Publish README.md as kind 30023 with deterministic d tag readme.md","parameters":{"type":"object","properties":{},"required":[]}}},{"type":"function","function":{"name":"nostr_delete","description":"Request deletion of one or more previously published events (NIP-09 kind 5)","parameters":{"type":"object","properties":{"event_ids":{"type":"array","description":"Event IDs to request deletion for","items":{"type":"string"}},"kinds":{"type":"array","description":"Optional kinds corresponding to event_ids entries","items":{"type":"integer"}},"reason":{"type":"string","description":"Optional human-readable reason"}},"required":["event_ids"]}}},{"type":"function","function":{"name":"nostr_react","description":"React to a Nostr event with like/dislike/emoji (NIP-25 kind 7)","parameters":{"type":"object","properties":{"event_id":{"type":"string","description":"Target event ID to react to"},"event_pubkey":{"type":"string","description":"Author pubkey of target event"},"event_kind":{"type":"integer","description":"Optional kind of target event"},"reaction":{"type":"string","description":"Reaction content such as +, -, ❤️, or emoji"}},"required":["event_id","event_pubkey"]}}},{"type":"function","function":{"name":"nostr_profile_get","description":"Look up a Nostr profile (kind 0 metadata) by pubkey","parameters":{"type":"object","properties":{"pubkey":{"type":"string","description":"Hex pubkey of the profile to fetch"}},"required":["pubkey"]}}},{"type":"fun...
[2026-03-25 09:58:33] [ERROR] [llm.c:93] [didactyl] llm http request failed: status=401
[2026-03-25 09:58:33] [WARN ] [llm.c:98] [didactyl] llm error response: {"error":{"code":"authentication_error","message":"Invalid Anthropic API Key","type":"invalid_request_error","param":null}}
[2026-03-25 09:58:33] [INFO ] [llm.c:76] [didactyl] llm request: method=POST url=https://api.anthropic.com/v1/chat/completions body_bytes=27512 body_preview={"model":"claude-haiku-4.5","max_tokens":512,"temperature":0.3,"messages":[{"role":"system","content":"# Test Agent\n\nYou are a test agent. Respond to requests and use tools when needed."},{"role":"user","content":"What version are you?"},{"role":"user","content":"What version are you?","_ts":1774447113}],"tools":[{"type":"function","function":{"name":"nostr_post","description":"Publish a Nostr event to connected relays","parameters":{"type":"object","properties":{"kind":{"type":"integer","description":"Nostr event kind number (for example 1 for note, 7 for reaction, 30023 for longform)"},"content":{"type":"string","description":"Event content/body text to publish"},"tags":{"type":"array","description":"Optional Nostr tags array, e.g. [[\"d\",\"my-skill\"],[\"t\",\"nostr\"]]","items":{"type":"array","items":{"type":"string"}}}},"required":["kind","content"]}}},{"type":"function","function":{"name":"nostr_query","description":"Query events from relays using a Nostr filter","parameters":{"type":"object","properties":{"filter":{"type":"object","description":"Nostr filter object (authors, kinds, ids, since, until, limit, and tag filters)"},"timeout_ms":{"type":"integer","description":"Optional query timeout in milliseconds"}},"required":["filter"]}}},{"type":"function","function":{"name":"local_shell_exec","description":"Execute a shell command and return stdout/stderr","parameters":{"type":"object","properties":{"command":{"type":"string","description":"Shell command to execute in the configured working directory"}},"required":["command"]}}},{"type":"function","function":{"name":"local_file_read","description":"Read a local file as text from the configured working directory","parameters":{"type":"object","properties":{"path":{"type":"string","description":"Path to file to read (relative to configured working directory)"},"max_bytes":{"type":"integer","description":"Optional maximum bytes to return"}},"required":["path"]}}},{"type":"function","function":{"name":"local_file_write","description":"Write text content to a local file in the configured working directory","parameters":{"type":"object","properties":{"path":{"type":"string","description":"Path to file to write (relative to configured working directory)"},"content":{"type":"string","description":"Text content to write"},"append":{"type":"boolean","description":"When true, append to file instead of overwriting"}},"required":["path","content"]}}},{"type":"function","function":{"name":"nostr_post_readme","description":"Publish README.md as kind 30023 with deterministic d tag readme.md","parameters":{"type":"object","properties":{},"required":[]}}},{"type":"function","function":{"name":"nostr_delete","description":"Request deletion of one or more previously published events (NIP-09 kind 5)","parameters":{"type":"object","properties":{"event_ids":{"type":"array","description":"Event IDs to request deletion for","items":{"type":"string"}},"kinds":{"type":"array","description":"Optional kinds corresponding to event_ids entries","items":{"type":"integer"}},"reason":{"type":"string","description":"Optional human-readable reason"}},"required":["event_ids"]}}},{"type":"function","function":{"name":"nostr_react","description":"React to a Nostr event with like/dislike/emoji (NIP-25 kind 7)","parameters":{"type":"object","properties":{"event_id":{"type":"string","description":"Target event ID to react to"},"event_pubkey":{"type":"string","description":"Author pubkey of target event"},"event_kind":{"type":"integer","description":"Optional kind of target event"},"reaction":{"type":"string","description":"Reaction content such as +, -, ❤️, or emoji"}},"required":["event_id","event_pubkey"]}}},{"type":"function","function":{"name":"nostr_profile_get","description":"Look up a Nostr profile (kind 0 metadata) by pubkey","parameters":{"type":"object","properties":{"pubkey":{"type":"string","description":"Hex pubkey of the profile to fetch"}},"required":["pubkey"]}}},{"type":"function","func...
[2026-03-25 09:58:33] [ERROR] [llm.c:93] [didactyl] llm http request failed: status=401
[2026-03-25 09:58:33] [WARN ] [llm.c:98] [didactyl] llm error response: {"error":{"code":"authentication_error","message":"Invalid Anthropic API Key","type":"invalid_request_error","param":null}}
[2026-03-25 09:58:34] [INFO ] [llm.c:76] [didactyl] llm request: method=POST url=https://api.anthropic.com/v1/chat/completions body_bytes=27522 body_preview={"model":"claude-haiku-4.5","max_tokens":512,"temperature":0.3,"messages":[{"role":"system","content":"# Test Agent\n\nYou are a test agent. Respond to requests and use tools when needed."},{"role":"user","content":"Who is your administrator?"},{"role":"user","content":"Who is your administrator?","_ts":1774447114}],"tools":[{"type":"function","function":{"name":"nostr_post","description":"Publish a Nostr event to connected relays","parameters":{"type":"object","properties":{"kind":{"type":"integer","description":"Nostr event kind number (for example 1 for note, 7 for reaction, 30023 for longform)"},"content":{"type":"string","description":"Event content/body text to publish"},"tags":{"type":"array","description":"Optional Nostr tags array, e.g. [[\"d\",\"my-skill\"],[\"t\",\"nostr\"]]","items":{"type":"array","items":{"type":"string"}}}},"required":["kind","content"]}}},{"type":"function","function":{"name":"nostr_query","description":"Query events from relays using a Nostr filter","parameters":{"type":"object","properties":{"filter":{"type":"object","description":"Nostr filter object (authors, kinds, ids, since, until, limit, and tag filters)"},"timeout_ms":{"type":"integer","description":"Optional query timeout in milliseconds"}},"required":["filter"]}}},{"type":"function","function":{"name":"local_shell_exec","description":"Execute a shell command and return stdout/stderr","parameters":{"type":"object","properties":{"command":{"type":"string","description":"Shell command to execute in the configured working directory"}},"required":["command"]}}},{"type":"function","function":{"name":"local_file_read","description":"Read a local file as text from the configured working directory","parameters":{"type":"object","properties":{"path":{"type":"string","description":"Path to file to read (relative to configured working directory)"},"max_bytes":{"type":"integer","description":"Optional maximum bytes to return"}},"required":["path"]}}},{"type":"function","function":{"name":"local_file_write","description":"Write text content to a local file in the configured working directory","parameters":{"type":"object","properties":{"path":{"type":"string","description":"Path to file to write (relative to configured working directory)"},"content":{"type":"string","description":"Text content to write"},"append":{"type":"boolean","description":"When true, append to file instead of overwriting"}},"required":["path","content"]}}},{"type":"function","function":{"name":"nostr_post_readme","description":"Publish README.md as kind 30023 with deterministic d tag readme.md","parameters":{"type":"object","properties":{},"required":[]}}},{"type":"function","function":{"name":"nostr_delete","description":"Request deletion of one or more previously published events (NIP-09 kind 5)","parameters":{"type":"object","properties":{"event_ids":{"type":"array","description":"Event IDs to request deletion for","items":{"type":"string"}},"kinds":{"type":"array","description":"Optional kinds corresponding to event_ids entries","items":{"type":"integer"}},"reason":{"type":"string","description":"Optional human-readable reason"}},"required":["event_ids"]}}},{"type":"function","function":{"name":"nostr_react","description":"React to a Nostr event with like/dislike/emoji (NIP-25 kind 7)","parameters":{"type":"object","properties":{"event_id":{"type":"string","description":"Target event ID to react to"},"event_pubkey":{"type":"string","description":"Author pubkey of target event"},"event_kind":{"type":"integer","description":"Optional kind of target event"},"reaction":{"type":"string","description":"Reaction content such as +, -, ❤️, or emoji"}},"required":["event_id","event_pubkey"]}}},{"type":"function","function":{"name":"nostr_profile_get","description":"Look up a Nostr profile (kind 0 metadata) by pubkey","parameters":{"type":"object","properties":{"pubkey":{"type":"string","description":"Hex pubkey of the profile to fetch"}},"required":["pubkey"]}}},{"type":"funct...
[2026-03-25 09:58:34] [ERROR] [llm.c:93] [didactyl] llm http request failed: status=401
[2026-03-25 09:58:34] [WARN ] [llm.c:98] [didactyl] llm error response: {"error":{"code":"authentication_error","message":"Invalid Anthropic API Key","type":"invalid_request_error","param":null}}
[2026-03-25 09:58:34] [INFO ] [llm.c:76] [didactyl] llm request: method=POST url=https://api.anthropic.com/v1/chat/completions body_bytes=27530 body_preview={"model":"claude-haiku-4.5","max_tokens":512,"temperature":0.3,"messages":[{"role":"system","content":"# Test Agent\n\nYou are a test agent. Respond to requests and use tools when needed."},{"role":"user","content":"Show me your current task list"},{"role":"user","content":"Show me your current task list","_ts":1774447114}],"tools":[{"type":"function","function":{"name":"nostr_post","description":"Publish a Nostr event to connected relays","parameters":{"type":"object","properties":{"kind":{"type":"integer","description":"Nostr event kind number (for example 1 for note, 7 for reaction, 30023 for longform)"},"content":{"type":"string","description":"Event content/body text to publish"},"tags":{"type":"array","description":"Optional Nostr tags array, e.g. [[\"d\",\"my-skill\"],[\"t\",\"nostr\"]]","items":{"type":"array","items":{"type":"string"}}}},"required":["kind","content"]}}},{"type":"function","function":{"name":"nostr_query","description":"Query events from relays using a Nostr filter","parameters":{"type":"object","properties":{"filter":{"type":"object","description":"Nostr filter object (authors, kinds, ids, since, until, limit, and tag filters)"},"timeout_ms":{"type":"integer","description":"Optional query timeout in milliseconds"}},"required":["filter"]}}},{"type":"function","function":{"name":"local_shell_exec","description":"Execute a shell command and return stdout/stderr","parameters":{"type":"object","properties":{"command":{"type":"string","description":"Shell command to execute in the configured working directory"}},"required":["command"]}}},{"type":"function","function":{"name":"local_file_read","description":"Read a local file as text from the configured working directory","parameters":{"type":"object","properties":{"path":{"type":"string","description":"Path to file to read (relative to configured working directory)"},"max_bytes":{"type":"integer","description":"Optional maximum bytes to return"}},"required":["path"]}}},{"type":"function","function":{"name":"local_file_write","description":"Write text content to a local file in the configured working directory","parameters":{"type":"object","properties":{"path":{"type":"string","description":"Path to file to write (relative to configured working directory)"},"content":{"type":"string","description":"Text content to write"},"append":{"type":"boolean","description":"When true, append to file instead of overwriting"}},"required":["path","content"]}}},{"type":"function","function":{"name":"nostr_post_readme","description":"Publish README.md as kind 30023 with deterministic d tag readme.md","parameters":{"type":"object","properties":{},"required":[]}}},{"type":"function","function":{"name":"nostr_delete","description":"Request deletion of one or more previously published events (NIP-09 kind 5)","parameters":{"type":"object","properties":{"event_ids":{"type":"array","description":"Event IDs to request deletion for","items":{"type":"string"}},"kinds":{"type":"array","description":"Optional kinds corresponding to event_ids entries","items":{"type":"integer"}},"reason":{"type":"string","description":"Optional human-readable reason"}},"required":["event_ids"]}}},{"type":"function","function":{"name":"nostr_react","description":"React to a Nostr event with like/dislike/emoji (NIP-25 kind 7)","parameters":{"type":"object","properties":{"event_id":{"type":"string","description":"Target event ID to react to"},"event_pubkey":{"type":"string","description":"Author pubkey of target event"},"event_kind":{"type":"integer","description":"Optional kind of target event"},"reaction":{"type":"string","description":"Reaction content such as +, -, ❤️, or emoji"}},"required":["event_id","event_pubkey"]}}},{"type":"function","function":{"name":"nostr_profile_get","description":"Look up a Nostr profile (kind 0 metadata) by pubkey","parameters":{"type":"object","properties":{"pubkey":{"type":"string","description":"Hex pubkey of the profile to fetch"}},"required":["pubkey"]}}},{"type...
[2026-03-25 09:58:35] [ERROR] [llm.c:93] [didactyl] llm http request failed: status=401
[2026-03-25 09:58:35] [WARN ] [llm.c:98] [didactyl] llm error response: {"error":{"code":"authentication_error","message":"Invalid Anthropic API Key","type":"invalid_request_error","param":null}}
[2026-03-25 09:58:35] [INFO ] [llm.c:76] [didactyl] llm request: method=POST url=https://api.anthropic.com/v1/chat/completions body_bytes=27568 body_preview={"model":"claude-haiku-4.5","max_tokens":512,"temperature":0.3,"messages":[{"role":"system","content":"# Test Agent\n\nYou are a test agent. Respond to requests and use tools when needed."},{"role":"user","content":"Add a task test harness probe task then remove it"},{"role":"user","content":"Add a task test harness probe task then remove it","_ts":1774447115}],"tools":[{"type":"function","function":{"name":"nostr_post","description":"Publish a Nostr event to connected relays","parameters":{"type":"object","properties":{"kind":{"type":"integer","description":"Nostr event kind number (for example 1 for note, 7 for reaction, 30023 for longform)"},"content":{"type":"string","description":"Event content/body text to publish"},"tags":{"type":"array","description":"Optional Nostr tags array, e.g. [[\"d\",\"my-skill\"],[\"t\",\"nostr\"]]","items":{"type":"array","items":{"type":"string"}}}},"required":["kind","content"]}}},{"type":"function","function":{"name":"nostr_query","description":"Query events from relays using a Nostr filter","parameters":{"type":"object","properties":{"filter":{"type":"object","description":"Nostr filter object (authors, kinds, ids, since, until, limit, and tag filters)"},"timeout_ms":{"type":"integer","description":"Optional query timeout in milliseconds"}},"required":["filter"]}}},{"type":"function","function":{"name":"local_shell_exec","description":"Execute a shell command and return stdout/stderr","parameters":{"type":"object","properties":{"command":{"type":"string","description":"Shell command to execute in the configured working directory"}},"required":["command"]}}},{"type":"function","function":{"name":"local_file_read","description":"Read a local file as text from the configured working directory","parameters":{"type":"object","properties":{"path":{"type":"string","description":"Path to file to read (relative to configured working directory)"},"max_bytes":{"type":"integer","description":"Optional maximum bytes to return"}},"required":["path"]}}},{"type":"function","function":{"name":"local_file_write","description":"Write text content to a local file in the configured working directory","parameters":{"type":"object","properties":{"path":{"type":"string","description":"Path to file to write (relative to configured working directory)"},"content":{"type":"string","description":"Text content to write"},"append":{"type":"boolean","description":"When true, append to file instead of overwriting"}},"required":["path","content"]}}},{"type":"function","function":{"name":"nostr_post_readme","description":"Publish README.md as kind 30023 with deterministic d tag readme.md","parameters":{"type":"object","properties":{},"required":[]}}},{"type":"function","function":{"name":"nostr_delete","description":"Request deletion of one or more previously published events (NIP-09 kind 5)","parameters":{"type":"object","properties":{"event_ids":{"type":"array","description":"Event IDs to request deletion for","items":{"type":"string"}},"kinds":{"type":"array","description":"Optional kinds corresponding to event_ids entries","items":{"type":"integer"}},"reason":{"type":"string","description":"Optional human-readable reason"}},"required":["event_ids"]}}},{"type":"function","function":{"name":"nostr_react","description":"React to a Nostr event with like/dislike/emoji (NIP-25 kind 7)","parameters":{"type":"object","properties":{"event_id":{"type":"string","description":"Target event ID to react to"},"event_pubkey":{"type":"string","description":"Author pubkey of target event"},"event_kind":{"type":"integer","description":"Optional kind of target event"},"reaction":{"type":"string","description":"Reaction content such as +, -, ❤️, or emoji"}},"required":["event_id","event_pubkey"]}}},{"type":"function","function":{"name":"nostr_profile_get","description":"Look up a Nostr profile (kind 0 metadata) by pubkey","parameters":{"type":"object","properties":{"pubkey":{"type":"string","description":"Hex pubkey of the profile to fe...
[2026-03-25 09:58:36] [ERROR] [llm.c:93] [didactyl] llm http request failed: status=401
[2026-03-25 09:58:36] [WARN ] [llm.c:98] [didactyl] llm error response: {"error":{"code":"authentication_error","message":"Invalid Anthropic API Key","type":"invalid_request_error","param":null}}
[2026-03-25 09:58:36] [INFO ] [llm.c:76] [didactyl] llm request: method=POST url=https://api.anthropic.com/v1/chat/completions body_bytes=27586 body_preview={"model":"claude-haiku-4.5","max_tokens":512,"temperature":0.3,"messages":[{"role":"system","content":"# Test Agent\n\nYou are a test agent. Respond to requests and use tools when needed."},{"role":"user","content":"Save test harness probe to memory, then recall your memory"},{"role":"user","content":"Save test harness probe to memory, then recall your memory","_ts":1774447116}],"tools":[{"type":"function","function":{"name":"nostr_post","description":"Publish a Nostr event to connected relays","parameters":{"type":"object","properties":{"kind":{"type":"integer","description":"Nostr event kind number (for example 1 for note, 7 for reaction, 30023 for longform)"},"content":{"type":"string","description":"Event content/body text to publish"},"tags":{"type":"array","description":"Optional Nostr tags array, e.g. [[\"d\",\"my-skill\"],[\"t\",\"nostr\"]]","items":{"type":"array","items":{"type":"string"}}}},"required":["kind","content"]}}},{"type":"function","function":{"name":"nostr_query","description":"Query events from relays using a Nostr filter","parameters":{"type":"object","properties":{"filter":{"type":"object","description":"Nostr filter object (authors, kinds, ids, since, until, limit, and tag filters)"},"timeout_ms":{"type":"integer","description":"Optional query timeout in milliseconds"}},"required":["filter"]}}},{"type":"function","function":{"name":"local_shell_exec","description":"Execute a shell command and return stdout/stderr","parameters":{"type":"object","properties":{"command":{"type":"string","description":"Shell command to execute in the configured working directory"}},"required":["command"]}}},{"type":"function","function":{"name":"local_file_read","description":"Read a local file as text from the configured working directory","parameters":{"type":"object","properties":{"path":{"type":"string","description":"Path to file to read (relative to configured working directory)"},"max_bytes":{"type":"integer","description":"Optional maximum bytes to return"}},"required":["path"]}}},{"type":"function","function":{"name":"local_file_write","description":"Write text content to a local file in the configured working directory","parameters":{"type":"object","properties":{"path":{"type":"string","description":"Path to file to write (relative to configured working directory)"},"content":{"type":"string","description":"Text content to write"},"append":{"type":"boolean","description":"When true, append to file instead of overwriting"}},"required":["path","content"]}}},{"type":"function","function":{"name":"nostr_post_readme","description":"Publish README.md as kind 30023 with deterministic d tag readme.md","parameters":{"type":"object","properties":{},"required":[]}}},{"type":"function","function":{"name":"nostr_delete","description":"Request deletion of one or more previously published events (NIP-09 kind 5)","parameters":{"type":"object","properties":{"event_ids":{"type":"array","description":"Event IDs to request deletion for","items":{"type":"string"}},"kinds":{"type":"array","description":"Optional kinds corresponding to event_ids entries","items":{"type":"integer"}},"reason":{"type":"string","description":"Optional human-readable reason"}},"required":["event_ids"]}}},{"type":"function","function":{"name":"nostr_react","description":"React to a Nostr event with like/dislike/emoji (NIP-25 kind 7)","parameters":{"type":"object","properties":{"event_id":{"type":"string","description":"Target event ID to react to"},"event_pubkey":{"type":"string","description":"Author pubkey of target event"},"event_kind":{"type":"integer","description":"Optional kind of target event"},"reaction":{"type":"string","description":"Reaction content such as +, -, ❤️, or emoji"}},"required":["event_id","event_pubkey"]}}},{"type":"function","function":{"name":"nostr_profile_get","description":"Look up a Nostr profile (kind 0 metadata) by pubkey","parameters":{"type":"object","properties":{"pubkey":{"type":"string","description":"Hex pubkey of...
[2026-03-25 09:58:36] [ERROR] [llm.c:93] [didactyl] llm http request failed: status=401
[2026-03-25 09:58:36] [WARN ] [llm.c:98] [didactyl] llm error response: {"error":{"code":"authentication_error","message":"Invalid Anthropic API Key","type":"invalid_request_error","param":null}}
[2026-03-25 09:58:37] [INFO ] [llm.c:76] [didactyl] llm request: method=POST url=https://api.anthropic.com/v1/chat/completions body_bytes=27556 body_preview={"model":"claude-haiku-4.5","max_tokens":512,"temperature":0.3,"messages":[{"role":"system","content":"# Test Agent\n\nYou are a test agent. Respond to requests and use tools when needed."},{"role":"user","content":"Post a test note saying Automated test post"},{"role":"user","content":"Post a test note saying Automated test post","_ts":1774447117}],"tools":[{"type":"function","function":{"name":"nostr_post","description":"Publish a Nostr event to connected relays","parameters":{"type":"object","properties":{"kind":{"type":"integer","description":"Nostr event kind number (for example 1 for note, 7 for reaction, 30023 for longform)"},"content":{"type":"string","description":"Event content/body text to publish"},"tags":{"type":"array","description":"Optional Nostr tags array, e.g. [[\"d\",\"my-skill\"],[\"t\",\"nostr\"]]","items":{"type":"array","items":{"type":"string"}}}},"required":["kind","content"]}}},{"type":"function","function":{"name":"nostr_query","description":"Query events from relays using a Nostr filter","parameters":{"type":"object","properties":{"filter":{"type":"object","description":"Nostr filter object (authors, kinds, ids, since, until, limit, and tag filters)"},"timeout_ms":{"type":"integer","description":"Optional query timeout in milliseconds"}},"required":["filter"]}}},{"type":"function","function":{"name":"local_shell_exec","description":"Execute a shell command and return stdout/stderr","parameters":{"type":"object","properties":{"command":{"type":"string","description":"Shell command to execute in the configured working directory"}},"required":["command"]}}},{"type":"function","function":{"name":"local_file_read","description":"Read a local file as text from the configured working directory","parameters":{"type":"object","properties":{"path":{"type":"string","description":"Path to file to read (relative to configured working directory)"},"max_bytes":{"type":"integer","description":"Optional maximum bytes to return"}},"required":["path"]}}},{"type":"function","function":{"name":"local_file_write","description":"Write text content to a local file in the configured working directory","parameters":{"type":"object","properties":{"path":{"type":"string","description":"Path to file to write (relative to configured working directory)"},"content":{"type":"string","description":"Text content to write"},"append":{"type":"boolean","description":"When true, append to file instead of overwriting"}},"required":["path","content"]}}},{"type":"function","function":{"name":"nostr_post_readme","description":"Publish README.md as kind 30023 with deterministic d tag readme.md","parameters":{"type":"object","properties":{},"required":[]}}},{"type":"function","function":{"name":"nostr_delete","description":"Request deletion of one or more previously published events (NIP-09 kind 5)","parameters":{"type":"object","properties":{"event_ids":{"type":"array","description":"Event IDs to request deletion for","items":{"type":"string"}},"kinds":{"type":"array","description":"Optional kinds corresponding to event_ids entries","items":{"type":"integer"}},"reason":{"type":"string","description":"Optional human-readable reason"}},"required":["event_ids"]}}},{"type":"function","function":{"name":"nostr_react","description":"React to a Nostr event with like/dislike/emoji (NIP-25 kind 7)","parameters":{"type":"object","properties":{"event_id":{"type":"string","description":"Target event ID to react to"},"event_pubkey":{"type":"string","description":"Author pubkey of target event"},"event_kind":{"type":"integer","description":"Optional kind of target event"},"reaction":{"type":"string","description":"Reaction content such as +, -, ❤️, or emoji"}},"required":["event_id","event_pubkey"]}}},{"type":"function","function":{"name":"nostr_profile_get","description":"Look up a Nostr profile (kind 0 metadata) by pubkey","parameters":{"type":"object","properties":{"pubkey":{"type":"string","description":"Hex pubkey of the profile to fetch"}},"requ...
[2026-03-25 09:58:37] [ERROR] [llm.c:93] [didactyl] llm http request failed: status=401
[2026-03-25 09:58:37] [WARN ] [llm.c:98] [didactyl] llm error response: {"error":{"code":"authentication_error","message":"Invalid Anthropic API Key","type":"invalid_request_error","param":null}}
[2026-03-25 09:58:37] [INFO ] [llm.c:76] [didactyl] llm request: method=POST url=https://api.anthropic.com/v1/chat/completions body_bytes=27574 body_preview={"model":"claude-haiku-4.5","max_tokens":512,"temperature":0.3,"messages":[{"role":"system","content":"# Test Agent\n\nYou are a test agent. Respond to requests and use tools when needed."},{"role":"user","content":"Query the 3 most recent kind 1 notes from any author"},{"role":"user","content":"Query the 3 most recent kind 1 notes from any author","_ts":1774447117}],"tools":[{"type":"function","function":{"name":"nostr_post","description":"Publish a Nostr event to connected relays","parameters":{"type":"object","properties":{"kind":{"type":"integer","description":"Nostr event kind number (for example 1 for note, 7 for reaction, 30023 for longform)"},"content":{"type":"string","description":"Event content/body text to publish"},"tags":{"type":"array","description":"Optional Nostr tags array, e.g. [[\"d\",\"my-skill\"],[\"t\",\"nostr\"]]","items":{"type":"array","items":{"type":"string"}}}},"required":["kind","content"]}}},{"type":"function","function":{"name":"nostr_query","description":"Query events from relays using a Nostr filter","parameters":{"type":"object","properties":{"filter":{"type":"object","description":"Nostr filter object (authors, kinds, ids, since, until, limit, and tag filters)"},"timeout_ms":{"type":"integer","description":"Optional query timeout in milliseconds"}},"required":["filter"]}}},{"type":"function","function":{"name":"local_shell_exec","description":"Execute a shell command and return stdout/stderr","parameters":{"type":"object","properties":{"command":{"type":"string","description":"Shell command to execute in the configured working directory"}},"required":["command"]}}},{"type":"function","function":{"name":"local_file_read","description":"Read a local file as text from the configured working directory","parameters":{"type":"object","properties":{"path":{"type":"string","description":"Path to file to read (relative to configured working directory)"},"max_bytes":{"type":"integer","description":"Optional maximum bytes to return"}},"required":["path"]}}},{"type":"function","function":{"name":"local_file_write","description":"Write text content to a local file in the configured working directory","parameters":{"type":"object","properties":{"path":{"type":"string","description":"Path to file to write (relative to configured working directory)"},"content":{"type":"string","description":"Text content to write"},"append":{"type":"boolean","description":"When true, append to file instead of overwriting"}},"required":["path","content"]}}},{"type":"function","function":{"name":"nostr_post_readme","description":"Publish README.md as kind 30023 with deterministic d tag readme.md","parameters":{"type":"object","properties":{},"required":[]}}},{"type":"function","function":{"name":"nostr_delete","description":"Request deletion of one or more previously published events (NIP-09 kind 5)","parameters":{"type":"object","properties":{"event_ids":{"type":"array","description":"Event IDs to request deletion for","items":{"type":"string"}},"kinds":{"type":"array","description":"Optional kinds corresponding to event_ids entries","items":{"type":"integer"}},"reason":{"type":"string","description":"Optional human-readable reason"}},"required":["event_ids"]}}},{"type":"function","function":{"name":"nostr_react","description":"React to a Nostr event with like/dislike/emoji (NIP-25 kind 7)","parameters":{"type":"object","properties":{"event_id":{"type":"string","description":"Target event ID to react to"},"event_pubkey":{"type":"string","description":"Author pubkey of target event"},"event_kind":{"type":"integer","description":"Optional kind of target event"},"reaction":{"type":"string","description":"Reaction content such as +, -, ❤️, or emoji"}},"required":["event_id","event_pubkey"]}}},{"type":"function","function":{"name":"nostr_profile_get","description":"Look up a Nostr profile (kind 0 metadata) by pubkey","parameters":{"type":"object","properties":{"pubkey":{"type":"string","description":"Hex pubkey of the profile...
[2026-03-25 09:58:38] [ERROR] [llm.c:93] [didactyl] llm http request failed: status=401
[2026-03-25 09:58:38] [WARN ] [llm.c:98] [didactyl] llm error response: {"error":{"code":"authentication_error","message":"Invalid Anthropic API Key","type":"invalid_request_error","param":null}}
[2026-03-25 09:58:38] [INFO ] [llm.c:76] [didactyl] llm request: method=POST url=https://api.anthropic.com/v1/chat/completions body_bytes=27516 body_preview={"model":"claude-haiku-4.5","max_tokens":512,"temperature":0.3,"messages":[{"role":"system","content":"# Test Agent\n\nYou are a test agent. Respond to requests and use tools when needed."},{"role":"user","content":"List your recent events"},{"role":"user","content":"List your recent events","_ts":1774447118}],"tools":[{"type":"function","function":{"name":"nostr_post","description":"Publish a Nostr event to connected relays","parameters":{"type":"object","properties":{"kind":{"type":"integer","description":"Nostr event kind number (for example 1 for note, 7 for reaction, 30023 for longform)"},"content":{"type":"string","description":"Event content/body text to publish"},"tags":{"type":"array","description":"Optional Nostr tags array, e.g. [[\"d\",\"my-skill\"],[\"t\",\"nostr\"]]","items":{"type":"array","items":{"type":"string"}}}},"required":["kind","content"]}}},{"type":"function","function":{"name":"nostr_query","description":"Query events from relays using a Nostr filter","parameters":{"type":"object","properties":{"filter":{"type":"object","description":"Nostr filter object (authors, kinds, ids, since, until, limit, and tag filters)"},"timeout_ms":{"type":"integer","description":"Optional query timeout in milliseconds"}},"required":["filter"]}}},{"type":"function","function":{"name":"local_shell_exec","description":"Execute a shell command and return stdout/stderr","parameters":{"type":"object","properties":{"command":{"type":"string","description":"Shell command to execute in the configured working directory"}},"required":["command"]}}},{"type":"function","function":{"name":"local_file_read","description":"Read a local file as text from the configured working directory","parameters":{"type":"object","properties":{"path":{"type":"string","description":"Path to file to read (relative to configured working directory)"},"max_bytes":{"type":"integer","description":"Optional maximum bytes to return"}},"required":["path"]}}},{"type":"function","function":{"name":"local_file_write","description":"Write text content to a local file in the configured working directory","parameters":{"type":"object","properties":{"path":{"type":"string","description":"Path to file to write (relative to configured working directory)"},"content":{"type":"string","description":"Text content to write"},"append":{"type":"boolean","description":"When true, append to file instead of overwriting"}},"required":["path","content"]}}},{"type":"function","function":{"name":"nostr_post_readme","description":"Publish README.md as kind 30023 with deterministic d tag readme.md","parameters":{"type":"object","properties":{},"required":[]}}},{"type":"function","function":{"name":"nostr_delete","description":"Request deletion of one or more previously published events (NIP-09 kind 5)","parameters":{"type":"object","properties":{"event_ids":{"type":"array","description":"Event IDs to request deletion for","items":{"type":"string"}},"kinds":{"type":"array","description":"Optional kinds corresponding to event_ids entries","items":{"type":"integer"}},"reason":{"type":"string","description":"Optional human-readable reason"}},"required":["event_ids"]}}},{"type":"function","function":{"name":"nostr_react","description":"React to a Nostr event with like/dislike/emoji (NIP-25 kind 7)","parameters":{"type":"object","properties":{"event_id":{"type":"string","description":"Target event ID to react to"},"event_pubkey":{"type":"string","description":"Author pubkey of target event"},"event_kind":{"type":"integer","description":"Optional kind of target event"},"reaction":{"type":"string","description":"Reaction content such as +, -, ❤️, or emoji"}},"required":["event_id","event_pubkey"]}}},{"type":"function","function":{"name":"nostr_profile_get","description":"Look up a Nostr profile (kind 0 metadata) by pubkey","parameters":{"type":"object","properties":{"pubkey":{"type":"string","description":"Hex pubkey of the profile to fetch"}},"required":["pubkey"]}}},{"type":"function","...
[2026-03-25 09:58:38] [ERROR] [llm.c:93] [didactyl] llm http request failed: status=401
[2026-03-25 09:58:38] [WARN ] [llm.c:98] [didactyl] llm error response: {"error":{"code":"authentication_error","message":"Invalid Anthropic API Key","type":"invalid_request_error","param":null}}
[2026-03-25 09:58:39] [INFO ] [llm.c:76] [didactyl] llm request: method=POST url=https://api.anthropic.com/v1/chat/completions body_bytes=27560 body_preview={"model":"claude-haiku-4.5","max_tokens":512,"temperature":0.3,"messages":[{"role":"system","content":"# Test Agent\n\nYou are a test agent. Respond to requests and use tools when needed."},{"role":"user","content":"What is the status of your relay connections?"},{"role":"user","content":"What is the status of your relay connections?","_ts":1774447119}],"tools":[{"type":"function","function":{"name":"nostr_post","description":"Publish a Nostr event to connected relays","parameters":{"type":"object","properties":{"kind":{"type":"integer","description":"Nostr event kind number (for example 1 for note, 7 for reaction, 30023 for longform)"},"content":{"type":"string","description":"Event content/body text to publish"},"tags":{"type":"array","description":"Optional Nostr tags array, e.g. [[\"d\",\"my-skill\"],[\"t\",\"nostr\"]]","items":{"type":"array","items":{"type":"string"}}}},"required":["kind","content"]}}},{"type":"function","function":{"name":"nostr_query","description":"Query events from relays using a Nostr filter","parameters":{"type":"object","properties":{"filter":{"type":"object","description":"Nostr filter object (authors, kinds, ids, since, until, limit, and tag filters)"},"timeout_ms":{"type":"integer","description":"Optional query timeout in milliseconds"}},"required":["filter"]}}},{"type":"function","function":{"name":"local_shell_exec","description":"Execute a shell command and return stdout/stderr","parameters":{"type":"object","properties":{"command":{"type":"string","description":"Shell command to execute in the configured working directory"}},"required":["command"]}}},{"type":"function","function":{"name":"local_file_read","description":"Read a local file as text from the configured working directory","parameters":{"type":"object","properties":{"path":{"type":"string","description":"Path to file to read (relative to configured working directory)"},"max_bytes":{"type":"integer","description":"Optional maximum bytes to return"}},"required":["path"]}}},{"type":"function","function":{"name":"local_file_write","description":"Write text content to a local file in the configured working directory","parameters":{"type":"object","properties":{"path":{"type":"string","description":"Path to file to write (relative to configured working directory)"},"content":{"type":"string","description":"Text content to write"},"append":{"type":"boolean","description":"When true, append to file instead of overwriting"}},"required":["path","content"]}}},{"type":"function","function":{"name":"nostr_post_readme","description":"Publish README.md as kind 30023 with deterministic d tag readme.md","parameters":{"type":"object","properties":{},"required":[]}}},{"type":"function","function":{"name":"nostr_delete","description":"Request deletion of one or more previously published events (NIP-09 kind 5)","parameters":{"type":"object","properties":{"event_ids":{"type":"array","description":"Event IDs to request deletion for","items":{"type":"string"}},"kinds":{"type":"array","description":"Optional kinds corresponding to event_ids entries","items":{"type":"integer"}},"reason":{"type":"string","description":"Optional human-readable reason"}},"required":["event_ids"]}}},{"type":"function","function":{"name":"nostr_react","description":"React to a Nostr event with like/dislike/emoji (NIP-25 kind 7)","parameters":{"type":"object","properties":{"event_id":{"type":"string","description":"Target event ID to react to"},"event_pubkey":{"type":"string","description":"Author pubkey of target event"},"event_kind":{"type":"integer","description":"Optional kind of target event"},"reaction":{"type":"string","description":"Reaction content such as +, -, ❤️, or emoji"}},"required":["event_id","event_pubkey"]}}},{"type":"function","function":{"name":"nostr_profile_get","description":"Look up a Nostr profile (kind 0 metadata) by pubkey","parameters":{"type":"object","properties":{"pubkey":{"type":"string","description":"Hex pubkey of the profile to fetch"}},"...
[2026-03-25 09:58:39] [ERROR] [llm.c:93] [didactyl] llm http request failed: status=401
[2026-03-25 09:58:39] [WARN ] [llm.c:98] [didactyl] llm error response: {"error":{"code":"authentication_error","message":"Invalid Anthropic API Key","type":"invalid_request_error","param":null}}
[2026-03-25 09:58:39] [INFO ] [llm.c:76] [didactyl] llm request: method=POST url=https://api.anthropic.com/v1/chat/completions body_bytes=27522 body_preview={"model":"claude-haiku-4.5","max_tokens":512,"temperature":0.3,"messages":[{"role":"system","content":"# Test Agent\n\nYou are a test agent. Respond to requests and use tools when needed."},{"role":"user","content":"Send a test DM to yourself"},{"role":"user","content":"Send a test DM to yourself","_ts":1774447119}],"tools":[{"type":"function","function":{"name":"nostr_post","description":"Publish a Nostr event to connected relays","parameters":{"type":"object","properties":{"kind":{"type":"integer","description":"Nostr event kind number (for example 1 for note, 7 for reaction, 30023 for longform)"},"content":{"type":"string","description":"Event content/body text to publish"},"tags":{"type":"array","description":"Optional Nostr tags array, e.g. [[\"d\",\"my-skill\"],[\"t\",\"nostr\"]]","items":{"type":"array","items":{"type":"string"}}}},"required":["kind","content"]}}},{"type":"function","function":{"name":"nostr_query","description":"Query events from relays using a Nostr filter","parameters":{"type":"object","properties":{"filter":{"type":"object","description":"Nostr filter object (authors, kinds, ids, since, until, limit, and tag filters)"},"timeout_ms":{"type":"integer","description":"Optional query timeout in milliseconds"}},"required":["filter"]}}},{"type":"function","function":{"name":"local_shell_exec","description":"Execute a shell command and return stdout/stderr","parameters":{"type":"object","properties":{"command":{"type":"string","description":"Shell command to execute in the configured working directory"}},"required":["command"]}}},{"type":"function","function":{"name":"local_file_read","description":"Read a local file as text from the configured working directory","parameters":{"type":"object","properties":{"path":{"type":"string","description":"Path to file to read (relative to configured working directory)"},"max_bytes":{"type":"integer","description":"Optional maximum bytes to return"}},"required":["path"]}}},{"type":"function","function":{"name":"local_file_write","description":"Write text content to a local file in the configured working directory","parameters":{"type":"object","properties":{"path":{"type":"string","description":"Path to file to write (relative to configured working directory)"},"content":{"type":"string","description":"Text content to write"},"append":{"type":"boolean","description":"When true, append to file instead of overwriting"}},"required":["path","content"]}}},{"type":"function","function":{"name":"nostr_post_readme","description":"Publish README.md as kind 30023 with deterministic d tag readme.md","parameters":{"type":"object","properties":{},"required":[]}}},{"type":"function","function":{"name":"nostr_delete","description":"Request deletion of one or more previously published events (NIP-09 kind 5)","parameters":{"type":"object","properties":{"event_ids":{"type":"array","description":"Event IDs to request deletion for","items":{"type":"string"}},"kinds":{"type":"array","description":"Optional kinds corresponding to event_ids entries","items":{"type":"integer"}},"reason":{"type":"string","description":"Optional human-readable reason"}},"required":["event_ids"]}}},{"type":"function","function":{"name":"nostr_react","description":"React to a Nostr event with like/dislike/emoji (NIP-25 kind 7)","parameters":{"type":"object","properties":{"event_id":{"type":"string","description":"Target event ID to react to"},"event_pubkey":{"type":"string","description":"Author pubkey of target event"},"event_kind":{"type":"integer","description":"Optional kind of target event"},"reaction":{"type":"string","description":"Reaction content such as +, -, ❤️, or emoji"}},"required":["event_id","event_pubkey"]}}},{"type":"function","function":{"name":"nostr_profile_get","description":"Look up a Nostr profile (kind 0 metadata) by pubkey","parameters":{"type":"object","properties":{"pubkey":{"type":"string","description":"Hex pubkey of the profile to fetch"}},"required":["pubkey"]}}},{"type":"funct...
[2026-03-25 09:58:40] [ERROR] [llm.c:93] [didactyl] llm http request failed: status=401
[2026-03-25 09:58:40] [WARN ] [llm.c:98] [didactyl] llm error response: {"error":{"code":"authentication_error","message":"Invalid Anthropic API Key","type":"invalid_request_error","param":null}}
[2026-03-25 09:58:40] [INFO ] [llm.c:76] [didactyl] llm request: method=POST url=https://api.anthropic.com/v1/chat/completions body_bytes=27528 body_preview={"model":"claude-haiku-4.5","max_tokens":512,"temperature":0.3,"messages":[{"role":"system","content":"# Test Agent\n\nYou are a test agent. Respond to requests and use tools when needed."},{"role":"user","content":"Encode your pubkey as an npub"},{"role":"user","content":"Encode your pubkey as an npub","_ts":1774447120}],"tools":[{"type":"function","function":{"name":"nostr_post","description":"Publish a Nostr event to connected relays","parameters":{"type":"object","properties":{"kind":{"type":"integer","description":"Nostr event kind number (for example 1 for note, 7 for reaction, 30023 for longform)"},"content":{"type":"string","description":"Event content/body text to publish"},"tags":{"type":"array","description":"Optional Nostr tags array, e.g. [[\"d\",\"my-skill\"],[\"t\",\"nostr\"]]","items":{"type":"array","items":{"type":"string"}}}},"required":["kind","content"]}}},{"type":"function","function":{"name":"nostr_query","description":"Query events from relays using a Nostr filter","parameters":{"type":"object","properties":{"filter":{"type":"object","description":"Nostr filter object (authors, kinds, ids, since, until, limit, and tag filters)"},"timeout_ms":{"type":"integer","description":"Optional query timeout in milliseconds"}},"required":["filter"]}}},{"type":"function","function":{"name":"local_shell_exec","description":"Execute a shell command and return stdout/stderr","parameters":{"type":"object","properties":{"command":{"type":"string","description":"Shell command to execute in the configured working directory"}},"required":["command"]}}},{"type":"function","function":{"name":"local_file_read","description":"Read a local file as text from the configured working directory","parameters":{"type":"object","properties":{"path":{"type":"string","description":"Path to file to read (relative to configured working directory)"},"max_bytes":{"type":"integer","description":"Optional maximum bytes to return"}},"required":["path"]}}},{"type":"function","function":{"name":"local_file_write","description":"Write text content to a local file in the configured working directory","parameters":{"type":"object","properties":{"path":{"type":"string","description":"Path to file to write (relative to configured working directory)"},"content":{"type":"string","description":"Text content to write"},"append":{"type":"boolean","description":"When true, append to file instead of overwriting"}},"required":["path","content"]}}},{"type":"function","function":{"name":"nostr_post_readme","description":"Publish README.md as kind 30023 with deterministic d tag readme.md","parameters":{"type":"object","properties":{},"required":[]}}},{"type":"function","function":{"name":"nostr_delete","description":"Request deletion of one or more previously published events (NIP-09 kind 5)","parameters":{"type":"object","properties":{"event_ids":{"type":"array","description":"Event IDs to request deletion for","items":{"type":"string"}},"kinds":{"type":"array","description":"Optional kinds corresponding to event_ids entries","items":{"type":"integer"}},"reason":{"type":"string","description":"Optional human-readable reason"}},"required":["event_ids"]}}},{"type":"function","function":{"name":"nostr_react","description":"React to a Nostr event with like/dislike/emoji (NIP-25 kind 7)","parameters":{"type":"object","properties":{"event_id":{"type":"string","description":"Target event ID to react to"},"event_pubkey":{"type":"string","description":"Author pubkey of target event"},"event_kind":{"type":"integer","description":"Optional kind of target event"},"reaction":{"type":"string","description":"Reaction content such as +, -, ❤️, or emoji"}},"required":["event_id","event_pubkey"]}}},{"type":"function","function":{"name":"nostr_profile_get","description":"Look up a Nostr profile (kind 0 metadata) by pubkey","parameters":{"type":"object","properties":{"pubkey":{"type":"string","description":"Hex pubkey of the profile to fetch"}},"required":["pubkey"]}}},{"type":...
[2026-03-25 09:58:40] [ERROR] [llm.c:93] [didactyl] llm http request failed: status=401
[2026-03-25 09:58:40] [WARN ] [llm.c:98] [didactyl] llm error response: {"error":{"code":"authentication_error","message":"Invalid Anthropic API Key","type":"invalid_request_error","param":null}}
[2026-03-25 09:58:41] [INFO ] [llm.c:76] [didactyl] llm request: method=POST url=https://api.anthropic.com/v1/chat/completions body_bytes=27530 body_preview={"model":"claude-haiku-4.5","max_tokens":512,"temperature":0.3,"messages":[{"role":"system","content":"# Test Agent\n\nYou are a test agent. Respond to requests and use tools when needed."},{"role":"user","content":"Look up your own Nostr profile"},{"role":"user","content":"Look up your own Nostr profile","_ts":1774447121}],"tools":[{"type":"function","function":{"name":"nostr_post","description":"Publish a Nostr event to connected relays","parameters":{"type":"object","properties":{"kind":{"type":"integer","description":"Nostr event kind number (for example 1 for note, 7 for reaction, 30023 for longform)"},"content":{"type":"string","description":"Event content/body text to publish"},"tags":{"type":"array","description":"Optional Nostr tags array, e.g. [[\"d\",\"my-skill\"],[\"t\",\"nostr\"]]","items":{"type":"array","items":{"type":"string"}}}},"required":["kind","content"]}}},{"type":"function","function":{"name":"nostr_query","description":"Query events from relays using a Nostr filter","parameters":{"type":"object","properties":{"filter":{"type":"object","description":"Nostr filter object (authors, kinds, ids, since, until, limit, and tag filters)"},"timeout_ms":{"type":"integer","description":"Optional query timeout in milliseconds"}},"required":["filter"]}}},{"type":"function","function":{"name":"local_shell_exec","description":"Execute a shell command and return stdout/stderr","parameters":{"type":"object","properties":{"command":{"type":"string","description":"Shell command to execute in the configured working directory"}},"required":["command"]}}},{"type":"function","function":{"name":"local_file_read","description":"Read a local file as text from the configured working directory","parameters":{"type":"object","properties":{"path":{"type":"string","description":"Path to file to read (relative to configured working directory)"},"max_bytes":{"type":"integer","description":"Optional maximum bytes to return"}},"required":["path"]}}},{"type":"function","function":{"name":"local_file_write","description":"Write text content to a local file in the configured working directory","parameters":{"type":"object","properties":{"path":{"type":"string","description":"Path to file to write (relative to configured working directory)"},"content":{"type":"string","description":"Text content to write"},"append":{"type":"boolean","description":"When true, append to file instead of overwriting"}},"required":["path","content"]}}},{"type":"function","function":{"name":"nostr_post_readme","description":"Publish README.md as kind 30023 with deterministic d tag readme.md","parameters":{"type":"object","properties":{},"required":[]}}},{"type":"function","function":{"name":"nostr_delete","description":"Request deletion of one or more previously published events (NIP-09 kind 5)","parameters":{"type":"object","properties":{"event_ids":{"type":"array","description":"Event IDs to request deletion for","items":{"type":"string"}},"kinds":{"type":"array","description":"Optional kinds corresponding to event_ids entries","items":{"type":"integer"}},"reason":{"type":"string","description":"Optional human-readable reason"}},"required":["event_ids"]}}},{"type":"function","function":{"name":"nostr_react","description":"React to a Nostr event with like/dislike/emoji (NIP-25 kind 7)","parameters":{"type":"object","properties":{"event_id":{"type":"string","description":"Target event ID to react to"},"event_pubkey":{"type":"string","description":"Author pubkey of target event"},"event_kind":{"type":"integer","description":"Optional kind of target event"},"reaction":{"type":"string","description":"Reaction content such as +, -, ❤️, or emoji"}},"required":["event_id","event_pubkey"]}}},{"type":"function","function":{"name":"nostr_profile_get","description":"Look up a Nostr profile (kind 0 metadata) by pubkey","parameters":{"type":"object","properties":{"pubkey":{"type":"string","description":"Hex pubkey of the profile to fetch"}},"required":["pubkey"]}}},{"type...
[2026-03-25 09:58:41] [ERROR] [llm.c:93] [didactyl] llm http request failed: status=401
[2026-03-25 09:58:41] [WARN ] [llm.c:98] [didactyl] llm error response: {"error":{"code":"authentication_error","message":"Invalid Anthropic API Key","type":"invalid_request_error","param":null}}
[2026-03-25 09:58:42] [INFO ] [llm.c:76] [didactyl] llm request: method=POST url=https://api.anthropic.com/v1/chat/completions body_bytes=27522 body_preview={"model":"claude-haiku-4.5","max_tokens":512,"temperature":0.3,"messages":[{"role":"system","content":"# Test Agent\n\nYou are a test agent. Respond to requests and use tools when needed."},{"role":"user","content":"List your available skills"},{"role":"user","content":"List your available skills","_ts":1774447122}],"tools":[{"type":"function","function":{"name":"nostr_post","description":"Publish a Nostr event to connected relays","parameters":{"type":"object","properties":{"kind":{"type":"integer","description":"Nostr event kind number (for example 1 for note, 7 for reaction, 30023 for longform)"},"content":{"type":"string","description":"Event content/body text to publish"},"tags":{"type":"array","description":"Optional Nostr tags array, e.g. [[\"d\",\"my-skill\"],[\"t\",\"nostr\"]]","items":{"type":"array","items":{"type":"string"}}}},"required":["kind","content"]}}},{"type":"function","function":{"name":"nostr_query","description":"Query events from relays using a Nostr filter","parameters":{"type":"object","properties":{"filter":{"type":"object","description":"Nostr filter object (authors, kinds, ids, since, until, limit, and tag filters)"},"timeout_ms":{"type":"integer","description":"Optional query timeout in milliseconds"}},"required":["filter"]}}},{"type":"function","function":{"name":"local_shell_exec","description":"Execute a shell command and return stdout/stderr","parameters":{"type":"object","properties":{"command":{"type":"string","description":"Shell command to execute in the configured working directory"}},"required":["command"]}}},{"type":"function","function":{"name":"local_file_read","description":"Read a local file as text from the configured working directory","parameters":{"type":"object","properties":{"path":{"type":"string","description":"Path to file to read (relative to configured working directory)"},"max_bytes":{"type":"integer","description":"Optional maximum bytes to return"}},"required":["path"]}}},{"type":"function","function":{"name":"local_file_write","description":"Write text content to a local file in the configured working directory","parameters":{"type":"object","properties":{"path":{"type":"string","description":"Path to file to write (relative to configured working directory)"},"content":{"type":"string","description":"Text content to write"},"append":{"type":"boolean","description":"When true, append to file instead of overwriting"}},"required":["path","content"]}}},{"type":"function","function":{"name":"nostr_post_readme","description":"Publish README.md as kind 30023 with deterministic d tag readme.md","parameters":{"type":"object","properties":{},"required":[]}}},{"type":"function","function":{"name":"nostr_delete","description":"Request deletion of one or more previously published events (NIP-09 kind 5)","parameters":{"type":"object","properties":{"event_ids":{"type":"array","description":"Event IDs to request deletion for","items":{"type":"string"}},"kinds":{"type":"array","description":"Optional kinds corresponding to event_ids entries","items":{"type":"integer"}},"reason":{"type":"string","description":"Optional human-readable reason"}},"required":["event_ids"]}}},{"type":"function","function":{"name":"nostr_react","description":"React to a Nostr event with like/dislike/emoji (NIP-25 kind 7)","parameters":{"type":"object","properties":{"event_id":{"type":"string","description":"Target event ID to react to"},"event_pubkey":{"type":"string","description":"Author pubkey of target event"},"event_kind":{"type":"integer","description":"Optional kind of target event"},"reaction":{"type":"string","description":"Reaction content such as +, -, ❤️, or emoji"}},"required":["event_id","event_pubkey"]}}},{"type":"function","function":{"name":"nostr_profile_get","description":"Look up a Nostr profile (kind 0 metadata) by pubkey","parameters":{"type":"object","properties":{"pubkey":{"type":"string","description":"Hex pubkey of the profile to fetch"}},"required":["pubkey"]}}},{"type":"funct...
[2026-03-25 09:58:42] [ERROR] [llm.c:93] [didactyl] llm http request failed: status=401
[2026-03-25 09:58:42] [WARN ] [llm.c:98] [didactyl] llm error response: {"error":{"code":"authentication_error","message":"Invalid Anthropic API Key","type":"invalid_request_error","param":null}}
[2026-03-25 09:58:42] [INFO ] [llm.c:76] [didactyl] llm request: method=POST url=https://api.anthropic.com/v1/chat/completions body_bytes=27520 body_preview={"model":"claude-haiku-4.5","max_tokens":512,"temperature":0.3,"messages":[{"role":"system","content":"# Test Agent\n\nYou are a test agent. Respond to requests and use tools when needed."},{"role":"user","content":"List your active triggers"},{"role":"user","content":"List your active triggers","_ts":1774447122}],"tools":[{"type":"function","function":{"name":"nostr_post","description":"Publish a Nostr event to connected relays","parameters":{"type":"object","properties":{"kind":{"type":"integer","description":"Nostr event kind number (for example 1 for note, 7 for reaction, 30023 for longform)"},"content":{"type":"string","description":"Event content/body text to publish"},"tags":{"type":"array","description":"Optional Nostr tags array, e.g. [[\"d\",\"my-skill\"],[\"t\",\"nostr\"]]","items":{"type":"array","items":{"type":"string"}}}},"required":["kind","content"]}}},{"type":"function","function":{"name":"nostr_query","description":"Query events from relays using a Nostr filter","parameters":{"type":"object","properties":{"filter":{"type":"object","description":"Nostr filter object (authors, kinds, ids, since, until, limit, and tag filters)"},"timeout_ms":{"type":"integer","description":"Optional query timeout in milliseconds"}},"required":["filter"]}}},{"type":"function","function":{"name":"local_shell_exec","description":"Execute a shell command and return stdout/stderr","parameters":{"type":"object","properties":{"command":{"type":"string","description":"Shell command to execute in the configured working directory"}},"required":["command"]}}},{"type":"function","function":{"name":"local_file_read","description":"Read a local file as text from the configured working directory","parameters":{"type":"object","properties":{"path":{"type":"string","description":"Path to file to read (relative to configured working directory)"},"max_bytes":{"type":"integer","description":"Optional maximum bytes to return"}},"required":["path"]}}},{"type":"function","function":{"name":"local_file_write","description":"Write text content to a local file in the configured working directory","parameters":{"type":"object","properties":{"path":{"type":"string","description":"Path to file to write (relative to configured working directory)"},"content":{"type":"string","description":"Text content to write"},"append":{"type":"boolean","description":"When true, append to file instead of overwriting"}},"required":["path","content"]}}},{"type":"function","function":{"name":"nostr_post_readme","description":"Publish README.md as kind 30023 with deterministic d tag readme.md","parameters":{"type":"object","properties":{},"required":[]}}},{"type":"function","function":{"name":"nostr_delete","description":"Request deletion of one or more previously published events (NIP-09 kind 5)","parameters":{"type":"object","properties":{"event_ids":{"type":"array","description":"Event IDs to request deletion for","items":{"type":"string"}},"kinds":{"type":"array","description":"Optional kinds corresponding to event_ids entries","items":{"type":"integer"}},"reason":{"type":"string","description":"Optional human-readable reason"}},"required":["event_ids"]}}},{"type":"function","function":{"name":"nostr_react","description":"React to a Nostr event with like/dislike/emoji (NIP-25 kind 7)","parameters":{"type":"object","properties":{"event_id":{"type":"string","description":"Target event ID to react to"},"event_pubkey":{"type":"string","description":"Author pubkey of target event"},"event_kind":{"type":"integer","description":"Optional kind of target event"},"reaction":{"type":"string","description":"Reaction content such as +, -, ❤️, or emoji"}},"required":["event_id","event_pubkey"]}}},{"type":"function","function":{"name":"nostr_profile_get","description":"Look up a Nostr profile (kind 0 metadata) by pubkey","parameters":{"type":"object","properties":{"pubkey":{"type":"string","description":"Hex pubkey of the profile to fetch"}},"required":["pubkey"]}}},{"type":"functio...
[2026-03-25 09:58:43] [ERROR] [llm.c:93] [didactyl] llm http request failed: status=401
[2026-03-25 09:58:43] [WARN ] [llm.c:98] [didactyl] llm error response: {"error":{"code":"authentication_error","message":"Invalid Anthropic API Key","type":"invalid_request_error","param":null}}
[2026-03-25 09:58:43] [INFO ] [llm.c:76] [didactyl] llm request: method=POST url=https://api.anthropic.com/v1/chat/completions body_bytes=27638 body_preview={"model":"claude-haiku-4.5","max_tokens":512,"temperature":0.3,"messages":[{"role":"system","content":"# Test Agent\n\nYou are a test agent. Respond to requests and use tools when needed."},{"role":"user","content":"Create a test skill called test-harness-probe with content Test skill then remove it"},{"role":"user","content":"Create a test skill called test-harness-probe with content Test skill then remove it","_ts":1774447123}],"tools":[{"type":"function","function":{"name":"nostr_post","description":"Publish a Nostr event to connected relays","parameters":{"type":"object","properties":{"kind":{"type":"integer","description":"Nostr event kind number (for example 1 for note, 7 for reaction, 30023 for longform)"},"content":{"type":"string","description":"Event content/body text to publish"},"tags":{"type":"array","description":"Optional Nostr tags array, e.g. [[\"d\",\"my-skill\"],[\"t\",\"nostr\"]]","items":{"type":"array","items":{"type":"string"}}}},"required":["kind","content"]}}},{"type":"function","function":{"name":"nostr_query","description":"Query events from relays using a Nostr filter","parameters":{"type":"object","properties":{"filter":{"type":"object","description":"Nostr filter object (authors, kinds, ids, since, until, limit, and tag filters)"},"timeout_ms":{"type":"integer","description":"Optional query timeout in milliseconds"}},"required":["filter"]}}},{"type":"function","function":{"name":"local_shell_exec","description":"Execute a shell command and return stdout/stderr","parameters":{"type":"object","properties":{"command":{"type":"string","description":"Shell command to execute in the configured working directory"}},"required":["command"]}}},{"type":"function","function":{"name":"local_file_read","description":"Read a local file as text from the configured working directory","parameters":{"type":"object","properties":{"path":{"type":"string","description":"Path to file to read (relative to configured working directory)"},"max_bytes":{"type":"integer","description":"Optional maximum bytes to return"}},"required":["path"]}}},{"type":"function","function":{"name":"local_file_write","description":"Write text content to a local file in the configured working directory","parameters":{"type":"object","properties":{"path":{"type":"string","description":"Path to file to write (relative to configured working directory)"},"content":{"type":"string","description":"Text content to write"},"append":{"type":"boolean","description":"When true, append to file instead of overwriting"}},"required":["path","content"]}}},{"type":"function","function":{"name":"nostr_post_readme","description":"Publish README.md as kind 30023 with deterministic d tag readme.md","parameters":{"type":"object","properties":{},"required":[]}}},{"type":"function","function":{"name":"nostr_delete","description":"Request deletion of one or more previously published events (NIP-09 kind 5)","parameters":{"type":"object","properties":{"event_ids":{"type":"array","description":"Event IDs to request deletion for","items":{"type":"string"}},"kinds":{"type":"array","description":"Optional kinds corresponding to event_ids entries","items":{"type":"integer"}},"reason":{"type":"string","description":"Optional human-readable reason"}},"required":["event_ids"]}}},{"type":"function","function":{"name":"nostr_react","description":"React to a Nostr event with like/dislike/emoji (NIP-25 kind 7)","parameters":{"type":"object","properties":{"event_id":{"type":"string","description":"Target event ID to react to"},"event_pubkey":{"type":"string","description":"Author pubkey of target event"},"event_kind":{"type":"integer","description":"Optional kind of target event"},"reaction":{"type":"string","description":"Reaction content such as +, -, ❤️, or emoji"}},"required":["event_id","event_pubkey"]}}},{"type":"function","function":{"name":"nostr_profile_get","description":"Look up a Nostr profile (kind 0 metadata) by pubkey","parameters":{"type":"object","properties":{"p...
[2026-03-25 09:58:43] [ERROR] [llm.c:93] [didactyl] llm http request failed: status=401
[2026-03-25 09:58:43] [WARN ] [llm.c:98] [didactyl] llm error response: {"error":{"code":"authentication_error","message":"Invalid Anthropic API Key","type":"invalid_request_error","param":null}}
[2026-03-25 09:58:44] [INFO ] [llm.c:76] [didactyl] llm request: method=POST url=https://api.anthropic.com/v1/chat/completions body_bytes=27528 body_preview={"model":"claude-haiku-4.5","max_tokens":512,"temperature":0.3,"messages":[{"role":"system","content":"# Test Agent\n\nYou are a test agent. Respond to requests and use tools when needed."},{"role":"user","content":"List all your available tools"},{"role":"user","content":"List all your available tools","_ts":1774447124}],"tools":[{"type":"function","function":{"name":"nostr_post","description":"Publish a Nostr event to connected relays","parameters":{"type":"object","properties":{"kind":{"type":"integer","description":"Nostr event kind number (for example 1 for note, 7 for reaction, 30023 for longform)"},"content":{"type":"string","description":"Event content/body text to publish"},"tags":{"type":"array","description":"Optional Nostr tags array, e.g. [[\"d\",\"my-skill\"],[\"t\",\"nostr\"]]","items":{"type":"array","items":{"type":"string"}}}},"required":["kind","content"]}}},{"type":"function","function":{"name":"nostr_query","description":"Query events from relays using a Nostr filter","parameters":{"type":"object","properties":{"filter":{"type":"object","description":"Nostr filter object (authors, kinds, ids, since, until, limit, and tag filters)"},"timeout_ms":{"type":"integer","description":"Optional query timeout in milliseconds"}},"required":["filter"]}}},{"type":"function","function":{"name":"local_shell_exec","description":"Execute a shell command and return stdout/stderr","parameters":{"type":"object","properties":{"command":{"type":"string","description":"Shell command to execute in the configured working directory"}},"required":["command"]}}},{"type":"function","function":{"name":"local_file_read","description":"Read a local file as text from the configured working directory","parameters":{"type":"object","properties":{"path":{"type":"string","description":"Path to file to read (relative to configured working directory)"},"max_bytes":{"type":"integer","description":"Optional maximum bytes to return"}},"required":["path"]}}},{"type":"function","function":{"name":"local_file_write","description":"Write text content to a local file in the configured working directory","parameters":{"type":"object","properties":{"path":{"type":"string","description":"Path to file to write (relative to configured working directory)"},"content":{"type":"string","description":"Text content to write"},"append":{"type":"boolean","description":"When true, append to file instead of overwriting"}},"required":["path","content"]}}},{"type":"function","function":{"name":"nostr_post_readme","description":"Publish README.md as kind 30023 with deterministic d tag readme.md","parameters":{"type":"object","properties":{},"required":[]}}},{"type":"function","function":{"name":"nostr_delete","description":"Request deletion of one or more previously published events (NIP-09 kind 5)","parameters":{"type":"object","properties":{"event_ids":{"type":"array","description":"Event IDs to request deletion for","items":{"type":"string"}},"kinds":{"type":"array","description":"Optional kinds corresponding to event_ids entries","items":{"type":"integer"}},"reason":{"type":"string","description":"Optional human-readable reason"}},"required":["event_ids"]}}},{"type":"function","function":{"name":"nostr_react","description":"React to a Nostr event with like/dislike/emoji (NIP-25 kind 7)","parameters":{"type":"object","properties":{"event_id":{"type":"string","description":"Target event ID to react to"},"event_pubkey":{"type":"string","description":"Author pubkey of target event"},"event_kind":{"type":"integer","description":"Optional kind of target event"},"reaction":{"type":"string","description":"Reaction content such as +, -, ❤️, or emoji"}},"required":["event_id","event_pubkey"]}}},{"type":"function","function":{"name":"nostr_profile_get","description":"Look up a Nostr profile (kind 0 metadata) by pubkey","parameters":{"type":"object","properties":{"pubkey":{"type":"string","description":"Hex pubkey of the profile to fetch"}},"required":["pubkey"]}}},{"type":...
[2026-03-25 09:58:44] [ERROR] [llm.c:93] [didactyl] llm http request failed: status=401
[2026-03-25 09:58:44] [WARN ] [llm.c:98] [didactyl] llm error response: {"error":{"code":"authentication_error","message":"Invalid Anthropic API Key","type":"invalid_request_error","param":null}}
[2026-03-25 09:58:45] [INFO ] [llm.c:76] [didactyl] llm request: method=POST url=https://api.anthropic.com/v1/chat/completions body_bytes=27540 body_preview={"model":"claude-haiku-4.5","max_tokens":512,"temperature":0.3,"messages":[{"role":"system","content":"# Test Agent\n\nYou are a test agent. Respond to requests and use tools when needed."},{"role":"user","content":"What model are you currently using?"},{"role":"user","content":"What model are you currently using?","_ts":1774447125}],"tools":[{"type":"function","function":{"name":"nostr_post","description":"Publish a Nostr event to connected relays","parameters":{"type":"object","properties":{"kind":{"type":"integer","description":"Nostr event kind number (for example 1 for note, 7 for reaction, 30023 for longform)"},"content":{"type":"string","description":"Event content/body text to publish"},"tags":{"type":"array","description":"Optional Nostr tags array, e.g. [[\"d\",\"my-skill\"],[\"t\",\"nostr\"]]","items":{"type":"array","items":{"type":"string"}}}},"required":["kind","content"]}}},{"type":"function","function":{"name":"nostr_query","description":"Query events from relays using a Nostr filter","parameters":{"type":"object","properties":{"filter":{"type":"object","description":"Nostr filter object (authors, kinds, ids, since, until, limit, and tag filters)"},"timeout_ms":{"type":"integer","description":"Optional query timeout in milliseconds"}},"required":["filter"]}}},{"type":"function","function":{"name":"local_shell_exec","description":"Execute a shell command and return stdout/stderr","parameters":{"type":"object","properties":{"command":{"type":"string","description":"Shell command to execute in the configured working directory"}},"required":["command"]}}},{"type":"function","function":{"name":"local_file_read","description":"Read a local file as text from the configured working directory","parameters":{"type":"object","properties":{"path":{"type":"string","description":"Path to file to read (relative to configured working directory)"},"max_bytes":{"type":"integer","description":"Optional maximum bytes to return"}},"required":["path"]}}},{"type":"function","function":{"name":"local_file_write","description":"Write text content to a local file in the configured working directory","parameters":{"type":"object","properties":{"path":{"type":"string","description":"Path to file to write (relative to configured working directory)"},"content":{"type":"string","description":"Text content to write"},"append":{"type":"boolean","description":"When true, append to file instead of overwriting"}},"required":["path","content"]}}},{"type":"function","function":{"name":"nostr_post_readme","description":"Publish README.md as kind 30023 with deterministic d tag readme.md","parameters":{"type":"object","properties":{},"required":[]}}},{"type":"function","function":{"name":"nostr_delete","description":"Request deletion of one or more previously published events (NIP-09 kind 5)","parameters":{"type":"object","properties":{"event_ids":{"type":"array","description":"Event IDs to request deletion for","items":{"type":"string"}},"kinds":{"type":"array","description":"Optional kinds corresponding to event_ids entries","items":{"type":"integer"}},"reason":{"type":"string","description":"Optional human-readable reason"}},"required":["event_ids"]}}},{"type":"function","function":{"name":"nostr_react","description":"React to a Nostr event with like/dislike/emoji (NIP-25 kind 7)","parameters":{"type":"object","properties":{"event_id":{"type":"string","description":"Target event ID to react to"},"event_pubkey":{"type":"string","description":"Author pubkey of target event"},"event_kind":{"type":"integer","description":"Optional kind of target event"},"reaction":{"type":"string","description":"Reaction content such as +, -, ❤️, or emoji"}},"required":["event_id","event_pubkey"]}}},{"type":"function","function":{"name":"nostr_profile_get","description":"Look up a Nostr profile (kind 0 metadata) by pubkey","parameters":{"type":"object","properties":{"pubkey":{"type":"string","description":"Hex pubkey of the profile to fetch"}},"required":["pubkey"]...
[2026-03-25 09:58:45] [ERROR] [llm.c:93] [didactyl] llm http request failed: status=401
[2026-03-25 09:58:45] [WARN ] [llm.c:98] [didactyl] llm error response: {"error":{"code":"authentication_error","message":"Invalid Anthropic API Key","type":"invalid_request_error","param":null}}
[2026-03-25 09:58:45] [INFO ] [llm.c:76] [didactyl] llm request: method=POST url=https://api.anthropic.com/v1/chat/completions body_bytes=27512 body_preview={"model":"claude-haiku-4.5","max_tokens":512,"temperature":0.3,"messages":[{"role":"system","content":"# Test Agent\n\nYou are a test agent. Respond to requests and use tools when needed."},{"role":"user","content":"List available models"},{"role":"user","content":"List available models","_ts":1774447125}],"tools":[{"type":"function","function":{"name":"nostr_post","description":"Publish a Nostr event to connected relays","parameters":{"type":"object","properties":{"kind":{"type":"integer","description":"Nostr event kind number (for example 1 for note, 7 for reaction, 30023 for longform)"},"content":{"type":"string","description":"Event content/body text to publish"},"tags":{"type":"array","description":"Optional Nostr tags array, e.g. [[\"d\",\"my-skill\"],[\"t\",\"nostr\"]]","items":{"type":"array","items":{"type":"string"}}}},"required":["kind","content"]}}},{"type":"function","function":{"name":"nostr_query","description":"Query events from relays using a Nostr filter","parameters":{"type":"object","properties":{"filter":{"type":"object","description":"Nostr filter object (authors, kinds, ids, since, until, limit, and tag filters)"},"timeout_ms":{"type":"integer","description":"Optional query timeout in milliseconds"}},"required":["filter"]}}},{"type":"function","function":{"name":"local_shell_exec","description":"Execute a shell command and return stdout/stderr","parameters":{"type":"object","properties":{"command":{"type":"string","description":"Shell command to execute in the configured working directory"}},"required":["command"]}}},{"type":"function","function":{"name":"local_file_read","description":"Read a local file as text from the configured working directory","parameters":{"type":"object","properties":{"path":{"type":"string","description":"Path to file to read (relative to configured working directory)"},"max_bytes":{"type":"integer","description":"Optional maximum bytes to return"}},"required":["path"]}}},{"type":"function","function":{"name":"local_file_write","description":"Write text content to a local file in the configured working directory","parameters":{"type":"object","properties":{"path":{"type":"string","description":"Path to file to write (relative to configured working directory)"},"content":{"type":"string","description":"Text content to write"},"append":{"type":"boolean","description":"When true, append to file instead of overwriting"}},"required":["path","content"]}}},{"type":"function","function":{"name":"nostr_post_readme","description":"Publish README.md as kind 30023 with deterministic d tag readme.md","parameters":{"type":"object","properties":{},"required":[]}}},{"type":"function","function":{"name":"nostr_delete","description":"Request deletion of one or more previously published events (NIP-09 kind 5)","parameters":{"type":"object","properties":{"event_ids":{"type":"array","description":"Event IDs to request deletion for","items":{"type":"string"}},"kinds":{"type":"array","description":"Optional kinds corresponding to event_ids entries","items":{"type":"integer"}},"reason":{"type":"string","description":"Optional human-readable reason"}},"required":["event_ids"]}}},{"type":"function","function":{"name":"nostr_react","description":"React to a Nostr event with like/dislike/emoji (NIP-25 kind 7)","parameters":{"type":"object","properties":{"event_id":{"type":"string","description":"Target event ID to react to"},"event_pubkey":{"type":"string","description":"Author pubkey of target event"},"event_kind":{"type":"integer","description":"Optional kind of target event"},"reaction":{"type":"string","description":"Reaction content such as +, -, ❤️, or emoji"}},"required":["event_id","event_pubkey"]}}},{"type":"function","function":{"name":"nostr_profile_get","description":"Look up a Nostr profile (kind 0 metadata) by pubkey","parameters":{"type":"object","properties":{"pubkey":{"type":"string","description":"Hex pubkey of the profile to fetch"}},"required":["pubkey"]}}},{"type":"function","func...
[2026-03-25 09:58:46] [ERROR] [llm.c:93] [didactyl] llm http request failed: status=401
[2026-03-25 09:58:46] [WARN ] [llm.c:98] [didactyl] llm error response: {"error":{"code":"authentication_error","message":"Invalid Anthropic API Key","type":"invalid_request_error","param":null}}
[2026-03-25 09:58:46] [INFO ] [llm.c:76] [didactyl] llm request: method=POST url=https://api.anthropic.com/v1/chat/completions body_bytes=27528 body_preview={"model":"claude-haiku-4.5","max_tokens":512,"temperature":0.3,"messages":[{"role":"system","content":"# Test Agent\n\nYou are a test agent. Respond to requests and use tools when needed."},{"role":"user","content":"Fetch https://httpbin.org/get"},{"role":"user","content":"Fetch https://httpbin.org/get","_ts":1774447126}],"tools":[{"type":"function","function":{"name":"nostr_post","description":"Publish a Nostr event to connected relays","parameters":{"type":"object","properties":{"kind":{"type":"integer","description":"Nostr event kind number (for example 1 for note, 7 for reaction, 30023 for longform)"},"content":{"type":"string","description":"Event content/body text to publish"},"tags":{"type":"array","description":"Optional Nostr tags array, e.g. [[\"d\",\"my-skill\"],[\"t\",\"nostr\"]]","items":{"type":"array","items":{"type":"string"}}}},"required":["kind","content"]}}},{"type":"function","function":{"name":"nostr_query","description":"Query events from relays using a Nostr filter","parameters":{"type":"object","properties":{"filter":{"type":"object","description":"Nostr filter object (authors, kinds, ids, since, until, limit, and tag filters)"},"timeout_ms":{"type":"integer","description":"Optional query timeout in milliseconds"}},"required":["filter"]}}},{"type":"function","function":{"name":"local_shell_exec","description":"Execute a shell command and return stdout/stderr","parameters":{"type":"object","properties":{"command":{"type":"string","description":"Shell command to execute in the configured working directory"}},"required":["command"]}}},{"type":"function","function":{"name":"local_file_read","description":"Read a local file as text from the configured working directory","parameters":{"type":"object","properties":{"path":{"type":"string","description":"Path to file to read (relative to configured working directory)"},"max_bytes":{"type":"integer","description":"Optional maximum bytes to return"}},"required":["path"]}}},{"type":"function","function":{"name":"local_file_write","description":"Write text content to a local file in the configured working directory","parameters":{"type":"object","properties":{"path":{"type":"string","description":"Path to file to write (relative to configured working directory)"},"content":{"type":"string","description":"Text content to write"},"append":{"type":"boolean","description":"When true, append to file instead of overwriting"}},"required":["path","content"]}}},{"type":"function","function":{"name":"nostr_post_readme","description":"Publish README.md as kind 30023 with deterministic d tag readme.md","parameters":{"type":"object","properties":{},"required":[]}}},{"type":"function","function":{"name":"nostr_delete","description":"Request deletion of one or more previously published events (NIP-09 kind 5)","parameters":{"type":"object","properties":{"event_ids":{"type":"array","description":"Event IDs to request deletion for","items":{"type":"string"}},"kinds":{"type":"array","description":"Optional kinds corresponding to event_ids entries","items":{"type":"integer"}},"reason":{"type":"string","description":"Optional human-readable reason"}},"required":["event_ids"]}}},{"type":"function","function":{"name":"nostr_react","description":"React to a Nostr event with like/dislike/emoji (NIP-25 kind 7)","parameters":{"type":"object","properties":{"event_id":{"type":"string","description":"Target event ID to react to"},"event_pubkey":{"type":"string","description":"Author pubkey of target event"},"event_kind":{"type":"integer","description":"Optional kind of target event"},"reaction":{"type":"string","description":"Reaction content such as +, -, ❤️, or emoji"}},"required":["event_id","event_pubkey"]}}},{"type":"function","function":{"name":"nostr_profile_get","description":"Look up a Nostr profile (kind 0 metadata) by pubkey","parameters":{"type":"object","properties":{"pubkey":{"type":"string","description":"Hex pubkey of the profile to fetch"}},"required":["pubkey"]}}},{"type":...
[2026-03-25 09:58:47] [ERROR] [llm.c:93] [didactyl] llm http request failed: status=401
[2026-03-25 09:58:47] [WARN ] [llm.c:98] [didactyl] llm error response: {"error":{"code":"authentication_error","message":"Invalid Anthropic API Key","type":"invalid_request_error","param":null}}
[2026-03-25 09:58:47] [INFO ] [llm.c:76] [didactyl] llm request: method=POST url=https://api.anthropic.com/v1/chat/completions body_bytes=27634 body_preview={"model":"claude-haiku-4.5","max_tokens":512,"temperature":0.3,"messages":[{"role":"system","content":"# Test Agent\n\nYou are a test agent. Respond to requests and use tools when needed."},{"role":"user","content":"Store a test config with d_tag test_harness_probe containing hello, then recall it"},{"role":"user","content":"Store a test config with d_tag test_harness_probe containing hello, then recall it","_ts":1774447127}],"tools":[{"type":"function","function":{"name":"nostr_post","description":"Publish a Nostr event to connected relays","parameters":{"type":"object","properties":{"kind":{"type":"integer","description":"Nostr event kind number (for example 1 for note, 7 for reaction, 30023 for longform)"},"content":{"type":"string","description":"Event content/body text to publish"},"tags":{"type":"array","description":"Optional Nostr tags array, e.g. [[\"d\",\"my-skill\"],[\"t\",\"nostr\"]]","items":{"type":"array","items":{"type":"string"}}}},"required":["kind","content"]}}},{"type":"function","function":{"name":"nostr_query","description":"Query events from relays using a Nostr filter","parameters":{"type":"object","properties":{"filter":{"type":"object","description":"Nostr filter object (authors, kinds, ids, since, until, limit, and tag filters)"},"timeout_ms":{"type":"integer","description":"Optional query timeout in milliseconds"}},"required":["filter"]}}},{"type":"function","function":{"name":"local_shell_exec","description":"Execute a shell command and return stdout/stderr","parameters":{"type":"object","properties":{"command":{"type":"string","description":"Shell command to execute in the configured working directory"}},"required":["command"]}}},{"type":"function","function":{"name":"local_file_read","description":"Read a local file as text from the configured working directory","parameters":{"type":"object","properties":{"path":{"type":"string","description":"Path to file to read (relative to configured working directory)"},"max_bytes":{"type":"integer","description":"Optional maximum bytes to return"}},"required":["path"]}}},{"type":"function","function":{"name":"local_file_write","description":"Write text content to a local file in the configured working directory","parameters":{"type":"object","properties":{"path":{"type":"string","description":"Path to file to write (relative to configured working directory)"},"content":{"type":"string","description":"Text content to write"},"append":{"type":"boolean","description":"When true, append to file instead of overwriting"}},"required":["path","content"]}}},{"type":"function","function":{"name":"nostr_post_readme","description":"Publish README.md as kind 30023 with deterministic d tag readme.md","parameters":{"type":"object","properties":{},"required":[]}}},{"type":"function","function":{"name":"nostr_delete","description":"Request deletion of one or more previously published events (NIP-09 kind 5)","parameters":{"type":"object","properties":{"event_ids":{"type":"array","description":"Event IDs to request deletion for","items":{"type":"string"}},"kinds":{"type":"array","description":"Optional kinds corresponding to event_ids entries","items":{"type":"integer"}},"reason":{"type":"string","description":"Optional human-readable reason"}},"required":["event_ids"]}}},{"type":"function","function":{"name":"nostr_react","description":"React to a Nostr event with like/dislike/emoji (NIP-25 kind 7)","parameters":{"type":"object","properties":{"event_id":{"type":"string","description":"Target event ID to react to"},"event_pubkey":{"type":"string","description":"Author pubkey of target event"},"event_kind":{"type":"integer","description":"Optional kind of target event"},"reaction":{"type":"string","description":"Reaction content such as +, -, ❤️, or emoji"}},"required":["event_id","event_pubkey"]}}},{"type":"function","function":{"name":"nostr_profile_get","description":"Look up a Nostr profile (kind 0 metadata) by pubkey","parameters":{"type":"object","properties":{"pubke...
[2026-03-25 09:58:47] [ERROR] [llm.c:93] [didactyl] llm http request failed: status=401
[2026-03-25 09:58:47] [WARN ] [llm.c:98] [didactyl] llm error response: {"error":{"code":"authentication_error","message":"Invalid Anthropic API Key","type":"invalid_request_error","param":null}}
[2026-03-25 10:15:30] [INFO ] [nostr_handler.c:848] [didactyl] relay state changed: wss://relay.damus.io connected -> disconnected
[2026-03-25 10:15:30] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] SEND relay.damus.io:443: ["REQ", "pool_7_1774447041", {
"kinds": [0, 3, 10002],
"authors": ["254d7a7f68b4443f5430564eb3a726f09aea57d27e75ab2b8ef57176f9ca3dac"],
"limit": 32
}]
[2026-03-25 10:15:30] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] SEND relay.damus.io:443: ["REQ", "pool_8_1774447041", {
"kinds": [1],
"authors": ["254d7a7f68b4443f5430564eb3a726f09aea57d27e75ab2b8ef57176f9ca3dac"],
"limit": 10
}]
[2026-03-25 10:15:30] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] SEND relay.damus.io:443: ["REQ", "pool_9_1774447041", {
"kinds": [0, 3, 10002],
"authors": ["1eb171136dbb1ba695b2f14296adfe88a1f81d4220cc7d186b0e139b8ce0cdbc"],
"limit": 64
}]
[2026-03-25 10:15:30] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] SEND relay.damus.io:443: ["REQ", "pool_10_1774447041", {
"kinds": [1],
"authors": ["1eb171136dbb1ba695b2f14296adfe88a1f81d4220cc7d186b0e139b8ce0cdbc"],
"limit": 10
}]
[2026-03-25 10:15:30] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] SEND relay.damus.io:443: ["REQ", "pool_11_1774447041", {
"kinds": [31123, 31124, 10123],
"authors": ["1eb171136dbb1ba695b2f14296adfe88a1f81d4220cc7d186b0e139b8ce0cdbc"],
"limit": 300
}]
[2026-03-25 10:15:30] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] SEND relay.damus.io:443: ["REQ", "pool_12_1774447041", {
"kinds": [31123],
"authors": ["254d7a7f68b4443f5430564eb3a726f09aea57d27e75ab2b8ef57176f9ca3dac"],
"limit": 150
}]
[2026-03-25 10:15:30] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] SEND relay.damus.io:443: ["REQ", "pool_13_1774447041", {
"kinds": [4],
"#p": ["1eb171136dbb1ba695b2f14296adfe88a1f81d4220cc7d186b0e139b8ce0cdbc"],
"since": 1774447038,
"limit": 100
}]
[2026-03-25 10:15:30] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] SEND relay.damus.io:443: ["REQ", "pool_14_1774447041", {
"kinds": [17375, 7375, 5],
"authors": ["1eb171136dbb1ba695b2f14296adfe88a1f81d4220cc7d186b0e139b8ce0cdbc"],
"since": 1774447038,
"limit": 500
}]
[2026-03-25 10:15:30] [INFO ] [nostr_handler.c:848] [didactyl] relay state changed: wss://relay.damus.io disconnected -> connected
[2026-03-25 13:47:38] [INFO ] [llm.c:76] [didactyl] llm request: method=POST url=https://api.anthropic.com/v1/chat/completions body_bytes=27520 body_preview={"model":"claude-haiku-4.5","max_tokens":512,"temperature":0.3,"messages":[{"role":"system","content":"# Test Agent\n\nYou are a test agent. Respond to requests and use tools when needed."},{"role":"user","content":"Hello, what is your name?"},{"role":"user","content":"Hello, what is your name?","_ts":1774460858}],"tools":[{"type":"function","function":{"name":"nostr_post","description":"Publish a Nostr event to connected relays","parameters":{"type":"object","properties":{"kind":{"type":"integer","description":"Nostr event kind number (for example 1 for note, 7 for reaction, 30023 for longform)"},"content":{"type":"string","description":"Event content/body text to publish"},"tags":{"type":"array","description":"Optional Nostr tags array, e.g. [[\"d\",\"my-skill\"],[\"t\",\"nostr\"]]","items":{"type":"array","items":{"type":"string"}}}},"required":["kind","content"]}}},{"type":"function","function":{"name":"nostr_query","description":"Query events from relays using a Nostr filter","parameters":{"type":"object","properties":{"filter":{"type":"object","description":"Nostr filter object (authors, kinds, ids, since, until, limit, and tag filters)"},"timeout_ms":{"type":"integer","description":"Optional query timeout in milliseconds"}},"required":["filter"]}}},{"type":"function","function":{"name":"local_shell_exec","description":"Execute a shell command and return stdout/stderr","parameters":{"type":"object","properties":{"command":{"type":"string","description":"Shell command to execute in the configured working directory"}},"required":["command"]}}},{"type":"function","function":{"name":"local_file_read","description":"Read a local file as text from the configured working directory","parameters":{"type":"object","properties":{"path":{"type":"string","description":"Path to file to read (relative to configured working directory)"},"max_bytes":{"type":"integer","description":"Optional maximum bytes to return"}},"required":["path"]}}},{"type":"function","function":{"name":"local_file_write","description":"Write text content to a local file in the configured working directory","parameters":{"type":"object","properties":{"path":{"type":"string","description":"Path to file to write (relative to configured working directory)"},"content":{"type":"string","description":"Text content to write"},"append":{"type":"boolean","description":"When true, append to file instead of overwriting"}},"required":["path","content"]}}},{"type":"function","function":{"name":"nostr_post_readme","description":"Publish README.md as kind 30023 with deterministic d tag readme.md","parameters":{"type":"object","properties":{},"required":[]}}},{"type":"function","function":{"name":"nostr_delete","description":"Request deletion of one or more previously published events (NIP-09 kind 5)","parameters":{"type":"object","properties":{"event_ids":{"type":"array","description":"Event IDs to request deletion for","items":{"type":"string"}},"kinds":{"type":"array","description":"Optional kinds corresponding to event_ids entries","items":{"type":"integer"}},"reason":{"type":"string","description":"Optional human-readable reason"}},"required":["event_ids"]}}},{"type":"function","function":{"name":"nostr_react","description":"React to a Nostr event with like/dislike/emoji (NIP-25 kind 7)","parameters":{"type":"object","properties":{"event_id":{"type":"string","description":"Target event ID to react to"},"event_pubkey":{"type":"string","description":"Author pubkey of target event"},"event_kind":{"type":"integer","description":"Optional kind of target event"},"reaction":{"type":"string","description":"Reaction content such as +, -, ❤️, or emoji"}},"required":["event_id","event_pubkey"]}}},{"type":"function","function":{"name":"nostr_profile_get","description":"Look up a Nostr profile (kind 0 metadata) by pubkey","parameters":{"type":"object","properties":{"pubkey":{"type":"string","description":"Hex pubkey of the profile to fetch"}},"required":["pubkey"]}}},{"type":"functio...
[2026-03-25 13:47:39] [ERROR] [llm.c:93] [didactyl] llm http request failed: status=401
[2026-03-25 13:47:39] [WARN ] [llm.c:98] [didactyl] llm error response: {"error":{"code":"authentication_error","message":"Invalid Anthropic API Key","type":"invalid_request_error","param":null}}
[2026-03-25 13:47:39] [INFO ] [llm.c:76] [didactyl] llm request: method=POST url=https://api.anthropic.com/v1/chat/completions body_bytes=27550 body_preview={"model":"claude-haiku-4.5","max_tokens":512,"temperature":0.3,"messages":[{"role":"system","content":"# Test Agent\n\nYou are a test agent. Respond to requests and use tools when needed."},{"role":"user","content":"What are you? Describe yourself briefly."},{"role":"user","content":"What are you? Describe yourself briefly.","_ts":1774460859}],"tools":[{"type":"function","function":{"name":"nostr_post","description":"Publish a Nostr event to connected relays","parameters":{"type":"object","properties":{"kind":{"type":"integer","description":"Nostr event kind number (for example 1 for note, 7 for reaction, 30023 for longform)"},"content":{"type":"string","description":"Event content/body text to publish"},"tags":{"type":"array","description":"Optional Nostr tags array, e.g. [[\"d\",\"my-skill\"],[\"t\",\"nostr\"]]","items":{"type":"array","items":{"type":"string"}}}},"required":["kind","content"]}}},{"type":"function","function":{"name":"nostr_query","description":"Query events from relays using a Nostr filter","parameters":{"type":"object","properties":{"filter":{"type":"object","description":"Nostr filter object (authors, kinds, ids, since, until, limit, and tag filters)"},"timeout_ms":{"type":"integer","description":"Optional query timeout in milliseconds"}},"required":["filter"]}}},{"type":"function","function":{"name":"local_shell_exec","description":"Execute a shell command and return stdout/stderr","parameters":{"type":"object","properties":{"command":{"type":"string","description":"Shell command to execute in the configured working directory"}},"required":["command"]}}},{"type":"function","function":{"name":"local_file_read","description":"Read a local file as text from the configured working directory","parameters":{"type":"object","properties":{"path":{"type":"string","description":"Path to file to read (relative to configured working directory)"},"max_bytes":{"type":"integer","description":"Optional maximum bytes to return"}},"required":["path"]}}},{"type":"function","function":{"name":"local_file_write","description":"Write text content to a local file in the configured working directory","parameters":{"type":"object","properties":{"path":{"type":"string","description":"Path to file to write (relative to configured working directory)"},"content":{"type":"string","description":"Text content to write"},"append":{"type":"boolean","description":"When true, append to file instead of overwriting"}},"required":["path","content"]}}},{"type":"function","function":{"name":"nostr_post_readme","description":"Publish README.md as kind 30023 with deterministic d tag readme.md","parameters":{"type":"object","properties":{},"required":[]}}},{"type":"function","function":{"name":"nostr_delete","description":"Request deletion of one or more previously published events (NIP-09 kind 5)","parameters":{"type":"object","properties":{"event_ids":{"type":"array","description":"Event IDs to request deletion for","items":{"type":"string"}},"kinds":{"type":"array","description":"Optional kinds corresponding to event_ids entries","items":{"type":"integer"}},"reason":{"type":"string","description":"Optional human-readable reason"}},"required":["event_ids"]}}},{"type":"function","function":{"name":"nostr_react","description":"React to a Nostr event with like/dislike/emoji (NIP-25 kind 7)","parameters":{"type":"object","properties":{"event_id":{"type":"string","description":"Target event ID to react to"},"event_pubkey":{"type":"string","description":"Author pubkey of target event"},"event_kind":{"type":"integer","description":"Optional kind of target event"},"reaction":{"type":"string","description":"Reaction content such as +, -, ❤️, or emoji"}},"required":["event_id","event_pubkey"]}}},{"type":"function","function":{"name":"nostr_profile_get","description":"Look up a Nostr profile (kind 0 metadata) by pubkey","parameters":{"type":"object","properties":{"pubkey":{"type":"string","description":"Hex pubkey of the profile to fetch"}},"required":...
[2026-03-25 13:47:39] [ERROR] [llm.c:93] [didactyl] llm http request failed: status=401
[2026-03-25 13:47:39] [WARN ] [llm.c:98] [didactyl] llm error response: {"error":{"code":"authentication_error","message":"Invalid Anthropic API Key","type":"invalid_request_error","param":null}}
[2026-03-25 13:47:40] [INFO ] [llm.c:336] [didactyl] llm request sanitizer: removed 2 empty text message(s) before provider request
[2026-03-25 13:47:40] [INFO ] [llm.c:76] [didactyl] llm request: method=POST url=https://api.anthropic.com/v1/chat/completions body_bytes=27395 body_preview={"model":"claude-haiku-4.5","max_tokens":512,"temperature":0.3,"messages":[{"role":"system","content":"# Test Agent\n\nYou are a test agent. Respond to requests and use tools when needed."}],"tools":[{"type":"function","function":{"name":"nostr_post","description":"Publish a Nostr event to connected relays","parameters":{"type":"object","properties":{"kind":{"type":"integer","description":"Nostr event kind number (for example 1 for note, 7 for reaction, 30023 for longform)"},"content":{"type":"string","description":"Event content/body text to publish"},"tags":{"type":"array","description":"Optional Nostr tags array, e.g. [[\"d\",\"my-skill\"],[\"t\",\"nostr\"]]","items":{"type":"array","items":{"type":"string"}}}},"required":["kind","content"]}}},{"type":"function","function":{"name":"nostr_query","description":"Query events from relays using a Nostr filter","parameters":{"type":"object","properties":{"filter":{"type":"object","description":"Nostr filter object (authors, kinds, ids, since, until, limit, and tag filters)"},"timeout_ms":{"type":"integer","description":"Optional query timeout in milliseconds"}},"required":["filter"]}}},{"type":"function","function":{"name":"local_shell_exec","description":"Execute a shell command and return stdout/stderr","parameters":{"type":"object","properties":{"command":{"type":"string","description":"Shell command to execute in the configured working directory"}},"required":["command"]}}},{"type":"function","function":{"name":"local_file_read","description":"Read a local file as text from the configured working directory","parameters":{"type":"object","properties":{"path":{"type":"string","description":"Path to file to read (relative to configured working directory)"},"max_bytes":{"type":"integer","description":"Optional maximum bytes to return"}},"required":["path"]}}},{"type":"function","function":{"name":"local_file_write","description":"Write text content to a local file in the configured working directory","parameters":{"type":"object","properties":{"path":{"type":"string","description":"Path to file to write (relative to configured working directory)"},"content":{"type":"string","description":"Text content to write"},"append":{"type":"boolean","description":"When true, append to file instead of overwriting"}},"required":["path","content"]}}},{"type":"function","function":{"name":"nostr_post_readme","description":"Publish README.md as kind 30023 with deterministic d tag readme.md","parameters":{"type":"object","properties":{},"required":[]}}},{"type":"function","function":{"name":"nostr_delete","description":"Request deletion of one or more previously published events (NIP-09 kind 5)","parameters":{"type":"object","properties":{"event_ids":{"type":"array","description":"Event IDs to request deletion for","items":{"type":"string"}},"kinds":{"type":"array","description":"Optional kinds corresponding to event_ids entries","items":{"type":"integer"}},"reason":{"type":"string","description":"Optional human-readable reason"}},"required":["event_ids"]}}},{"type":"function","function":{"name":"nostr_react","description":"React to a Nostr event with like/dislike/emoji (NIP-25 kind 7)","parameters":{"type":"object","properties":{"event_id":{"type":"string","description":"Target event ID to react to"},"event_pubkey":{"type":"string","description":"Author pubkey of target event"},"event_kind":{"type":"integer","description":"Optional kind of target event"},"reaction":{"type":"string","description":"Reaction content such as +, -, ❤️, or emoji"}},"required":["event_id","event_pubkey"]}}},{"type":"function","function":{"name":"nostr_profile_get","description":"Look up a Nostr profile (kind 0 metadata) by pubkey","parameters":{"type":"object","properties":{"pubkey":{"type":"string","description":"Hex pubkey of the profile to fetch"}},"required":["pubkey"]}}},{"type":"function","function":{"name":"nostr_relay_status","description":"Get connection status and statistics for all relays","parameters":{...
[2026-03-25 13:47:40] [ERROR] [llm.c:93] [didactyl] llm http request failed: status=401
[2026-03-25 13:47:40] [WARN ] [llm.c:98] [didactyl] llm error response: {"error":{"code":"authentication_error","message":"Invalid Anthropic API Key","type":"invalid_request_error","param":null}}
[2026-03-25 13:47:40] [INFO ] [llm.c:76] [didactyl] llm request: method=POST url=https://api.anthropic.com/v1/chat/completions body_bytes=47470 body_preview={"model":"claude-haiku-4.5","max_tokens":512,"temperature":0.3,"messages":[{"role":"system","content":"# Test Agent\n\nYou are a test agent. Respond to requests and use tools when needed."},{"role":"user","content":"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA...
[2026-03-25 13:47:41] [ERROR] [llm.c:93] [didactyl] llm http request failed: status=401
[2026-03-25 13:47:41] [WARN ] [llm.c:98] [didactyl] llm error response: {"error":{"code":"authentication_error","message":"Invalid Anthropic API Key","type":"invalid_request_error","param":null}}
[2026-03-25 13:47:41] [TRACE] [nostr_handler.c:162] [didactyl] [nostr:websocket] RECV <large EVENT frame suppressed, bytes=462>
[2026-03-25 13:47:41] [TRACE] [nostr_handler.c:162] [didactyl] [nostr:websocket] RECV <large EVENT frame suppressed, bytes=471>
[2026-03-25 13:47:41] [TRACE] [nostr_handler.c:162] [didactyl] [nostr:websocket] RECV <large EVENT frame suppressed, bytes=540>
[2026-03-25 13:47:41] [INFO ] [nostr_handler.c:2151] [didactyl] self-skill cache received kind=10123 d_tag=- id=92e10e064611f8879a633fc11725148adc2452b899d8cade00dec822a206af54 created_at=1774460861 via wss://relay.primal.net
[2026-03-25 13:47:41] [TRACE] [nostr_handler.c:162] [didactyl] [nostr:websocket] RECV <large EVENT frame suppressed, bytes=604>
[2026-03-25 13:47:41] [INFO ] [nostr_handler.c:2151] [didactyl] self-skill cache received kind=31124 d_tag=identity_and_rules id=fac7f97a59e640152f378862fa7d16285601debbd06fe7400d5288385059b643 created_at=1774460861 via wss://relay.primal.net
[2026-03-25 13:47:41] [INFO ] [trigger_manager.c:1364] [didactyl] trigger updated d_tag=identity_and_rules action=0 enabled=1
[2026-03-25 13:47:41] [INFO ] [nostr_handler.c:1207] [didactyl] live self-skill trigger registered d_tag=identity_and_rules action=llm enabled=1
[2026-03-25 13:47:43] [INFO ] [llm.c:76] [didactyl] llm request: method=POST url=https://api.anthropic.com/v1/chat/completions body_bytes=27520 body_preview={"model":"claude-haiku-4.5","max_tokens":512,"temperature":0.3,"messages":[{"role":"system","content":"# Test Agent\n\nYou are a test agent. Respond to requests and use tools when needed."},{"role":"user","content":"After restart, say hello."},{"role":"user","content":"After restart, say hello.","_ts":1774460863}],"tools":[{"type":"function","function":{"name":"nostr_post","description":"Publish a Nostr event to connected relays","parameters":{"type":"object","properties":{"kind":{"type":"integer","description":"Nostr event kind number (for example 1 for note, 7 for reaction, 30023 for longform)"},"content":{"type":"string","description":"Event content/body text to publish"},"tags":{"type":"array","description":"Optional Nostr tags array, e.g. [[\"d\",\"my-skill\"],[\"t\",\"nostr\"]]","items":{"type":"array","items":{"type":"string"}}}},"required":["kind","content"]}}},{"type":"function","function":{"name":"nostr_query","description":"Query events from relays using a Nostr filter","parameters":{"type":"object","properties":{"filter":{"type":"object","description":"Nostr filter object (authors, kinds, ids, since, until, limit, and tag filters)"},"timeout_ms":{"type":"integer","description":"Optional query timeout in milliseconds"}},"required":["filter"]}}},{"type":"function","function":{"name":"local_shell_exec","description":"Execute a shell command and return stdout/stderr","parameters":{"type":"object","properties":{"command":{"type":"string","description":"Shell command to execute in the configured working directory"}},"required":["command"]}}},{"type":"function","function":{"name":"local_file_read","description":"Read a local file as text from the configured working directory","parameters":{"type":"object","properties":{"path":{"type":"string","description":"Path to file to read (relative to configured working directory)"},"max_bytes":{"type":"integer","description":"Optional maximum bytes to return"}},"required":["path"]}}},{"type":"function","function":{"name":"local_file_write","description":"Write text content to a local file in the configured working directory","parameters":{"type":"object","properties":{"path":{"type":"string","description":"Path to file to write (relative to configured working directory)"},"content":{"type":"string","description":"Text content to write"},"append":{"type":"boolean","description":"When true, append to file instead of overwriting"}},"required":["path","content"]}}},{"type":"function","function":{"name":"nostr_post_readme","description":"Publish README.md as kind 30023 with deterministic d tag readme.md","parameters":{"type":"object","properties":{},"required":[]}}},{"type":"function","function":{"name":"nostr_delete","description":"Request deletion of one or more previously published events (NIP-09 kind 5)","parameters":{"type":"object","properties":{"event_ids":{"type":"array","description":"Event IDs to request deletion for","items":{"type":"string"}},"kinds":{"type":"array","description":"Optional kinds corresponding to event_ids entries","items":{"type":"integer"}},"reason":{"type":"string","description":"Optional human-readable reason"}},"required":["event_ids"]}}},{"type":"function","function":{"name":"nostr_react","description":"React to a Nostr event with like/dislike/emoji (NIP-25 kind 7)","parameters":{"type":"object","properties":{"event_id":{"type":"string","description":"Target event ID to react to"},"event_pubkey":{"type":"string","description":"Author pubkey of target event"},"event_kind":{"type":"integer","description":"Optional kind of target event"},"reaction":{"type":"string","description":"Reaction content such as +, -, ❤️, or emoji"}},"required":["event_id","event_pubkey"]}}},{"type":"function","function":{"name":"nostr_profile_get","description":"Look up a Nostr profile (kind 0 metadata) by pubkey","parameters":{"type":"object","properties":{"pubkey":{"type":"string","description":"Hex pubkey of the profile to fetch"}},"required":["pubkey"]}}},{"type":"functio...
[2026-03-25 13:47:44] [ERROR] [llm.c:93] [didactyl] llm http request failed: status=401
[2026-03-25 13:47:44] [WARN ] [llm.c:98] [didactyl] llm error response: {"error":{"code":"authentication_error","message":"Invalid Anthropic API Key","type":"invalid_request_error","param":null}}
[2026-03-25 13:47:44] [INFO ] [llm.c:76] [didactyl] llm request: method=POST url=https://api.anthropic.com/v1/chat/completions body_bytes=27522 body_preview={"model":"claude-haiku-4.5","max_tokens":512,"temperature":0.3,"messages":[{"role":"system","content":"# Test Agent\n\nYou are a test agent. Respond to requests and use tools when needed."},{"role":"user","content":"Say hello in one sentence."},{"role":"user","content":"Say hello in one sentence.","_ts":1774460864}],"tools":[{"type":"function","function":{"name":"nostr_post","description":"Publish a Nostr event to connected relays","parameters":{"type":"object","properties":{"kind":{"type":"integer","description":"Nostr event kind number (for example 1 for note, 7 for reaction, 30023 for longform)"},"content":{"type":"string","description":"Event content/body text to publish"},"tags":{"type":"array","description":"Optional Nostr tags array, e.g. [[\"d\",\"my-skill\"],[\"t\",\"nostr\"]]","items":{"type":"array","items":{"type":"string"}}}},"required":["kind","content"]}}},{"type":"function","function":{"name":"nostr_query","description":"Query events from relays using a Nostr filter","parameters":{"type":"object","properties":{"filter":{"type":"object","description":"Nostr filter object (authors, kinds, ids, since, until, limit, and tag filters)"},"timeout_ms":{"type":"integer","description":"Optional query timeout in milliseconds"}},"required":["filter"]}}},{"type":"function","function":{"name":"local_shell_exec","description":"Execute a shell command and return stdout/stderr","parameters":{"type":"object","properties":{"command":{"type":"string","description":"Shell command to execute in the configured working directory"}},"required":["command"]}}},{"type":"function","function":{"name":"local_file_read","description":"Read a local file as text from the configured working directory","parameters":{"type":"object","properties":{"path":{"type":"string","description":"Path to file to read (relative to configured working directory)"},"max_bytes":{"type":"integer","description":"Optional maximum bytes to return"}},"required":["path"]}}},{"type":"function","function":{"name":"local_file_write","description":"Write text content to a local file in the configured working directory","parameters":{"type":"object","properties":{"path":{"type":"string","description":"Path to file to write (relative to configured working directory)"},"content":{"type":"string","description":"Text content to write"},"append":{"type":"boolean","description":"When true, append to file instead of overwriting"}},"required":["path","content"]}}},{"type":"function","function":{"name":"nostr_post_readme","description":"Publish README.md as kind 30023 with deterministic d tag readme.md","parameters":{"type":"object","properties":{},"required":[]}}},{"type":"function","function":{"name":"nostr_delete","description":"Request deletion of one or more previously published events (NIP-09 kind 5)","parameters":{"type":"object","properties":{"event_ids":{"type":"array","description":"Event IDs to request deletion for","items":{"type":"string"}},"kinds":{"type":"array","description":"Optional kinds corresponding to event_ids entries","items":{"type":"integer"}},"reason":{"type":"string","description":"Optional human-readable reason"}},"required":["event_ids"]}}},{"type":"function","function":{"name":"nostr_react","description":"React to a Nostr event with like/dislike/emoji (NIP-25 kind 7)","parameters":{"type":"object","properties":{"event_id":{"type":"string","description":"Target event ID to react to"},"event_pubkey":{"type":"string","description":"Author pubkey of target event"},"event_kind":{"type":"integer","description":"Optional kind of target event"},"reaction":{"type":"string","description":"Reaction content such as +, -, ❤️, or emoji"}},"required":["event_id","event_pubkey"]}}},{"type":"function","function":{"name":"nostr_profile_get","description":"Look up a Nostr profile (kind 0 metadata) by pubkey","parameters":{"type":"object","properties":{"pubkey":{"type":"string","description":"Hex pubkey of the profile to fetch"}},"required":["pubkey"]}}},{"type":"funct...
[2026-03-25 13:47:44] [ERROR] [llm.c:93] [didactyl] llm http request failed: status=401
[2026-03-25 13:47:44] [WARN ] [llm.c:98] [didactyl] llm error response: {"error":{"code":"authentication_error","message":"Invalid Anthropic API Key","type":"invalid_request_error","param":null}}
[2026-03-25 13:47:45] [INFO ] [llm.c:76] [didactyl] llm request: method=POST url=https://api.anthropic.com/v1/chat/completions body_bytes=27516 body_preview={"model":"claude-haiku-4.5","max_tokens":512,"temperature":0.3,"messages":[{"role":"system","content":"# Test Agent\n\nYou are a test agent. Respond to requests and use tools when needed."},{"role":"user","content":"List your blossom blobs"},{"role":"user","content":"List your blossom blobs","_ts":1774460865}],"tools":[{"type":"function","function":{"name":"nostr_post","description":"Publish a Nostr event to connected relays","parameters":{"type":"object","properties":{"kind":{"type":"integer","description":"Nostr event kind number (for example 1 for note, 7 for reaction, 30023 for longform)"},"content":{"type":"string","description":"Event content/body text to publish"},"tags":{"type":"array","description":"Optional Nostr tags array, e.g. [[\"d\",\"my-skill\"],[\"t\",\"nostr\"]]","items":{"type":"array","items":{"type":"string"}}}},"required":["kind","content"]}}},{"type":"function","function":{"name":"nostr_query","description":"Query events from relays using a Nostr filter","parameters":{"type":"object","properties":{"filter":{"type":"object","description":"Nostr filter object (authors, kinds, ids, since, until, limit, and tag filters)"},"timeout_ms":{"type":"integer","description":"Optional query timeout in milliseconds"}},"required":["filter"]}}},{"type":"function","function":{"name":"local_shell_exec","description":"Execute a shell command and return stdout/stderr","parameters":{"type":"object","properties":{"command":{"type":"string","description":"Shell command to execute in the configured working directory"}},"required":["command"]}}},{"type":"function","function":{"name":"local_file_read","description":"Read a local file as text from the configured working directory","parameters":{"type":"object","properties":{"path":{"type":"string","description":"Path to file to read (relative to configured working directory)"},"max_bytes":{"type":"integer","description":"Optional maximum bytes to return"}},"required":["path"]}}},{"type":"function","function":{"name":"local_file_write","description":"Write text content to a local file in the configured working directory","parameters":{"type":"object","properties":{"path":{"type":"string","description":"Path to file to write (relative to configured working directory)"},"content":{"type":"string","description":"Text content to write"},"append":{"type":"boolean","description":"When true, append to file instead of overwriting"}},"required":["path","content"]}}},{"type":"function","function":{"name":"nostr_post_readme","description":"Publish README.md as kind 30023 with deterministic d tag readme.md","parameters":{"type":"object","properties":{},"required":[]}}},{"type":"function","function":{"name":"nostr_delete","description":"Request deletion of one or more previously published events (NIP-09 kind 5)","parameters":{"type":"object","properties":{"event_ids":{"type":"array","description":"Event IDs to request deletion for","items":{"type":"string"}},"kinds":{"type":"array","description":"Optional kinds corresponding to event_ids entries","items":{"type":"integer"}},"reason":{"type":"string","description":"Optional human-readable reason"}},"required":["event_ids"]}}},{"type":"function","function":{"name":"nostr_react","description":"React to a Nostr event with like/dislike/emoji (NIP-25 kind 7)","parameters":{"type":"object","properties":{"event_id":{"type":"string","description":"Target event ID to react to"},"event_pubkey":{"type":"string","description":"Author pubkey of target event"},"event_kind":{"type":"integer","description":"Optional kind of target event"},"reaction":{"type":"string","description":"Reaction content such as +, -, ❤️, or emoji"}},"required":["event_id","event_pubkey"]}}},{"type":"function","function":{"name":"nostr_profile_get","description":"Look up a Nostr profile (kind 0 metadata) by pubkey","parameters":{"type":"object","properties":{"pubkey":{"type":"string","description":"Hex pubkey of the profile to fetch"}},"required":["pubkey"]}}},{"type":"function","...
[2026-03-25 13:47:45] [ERROR] [llm.c:93] [didactyl] llm http request failed: status=401
[2026-03-25 13:47:45] [WARN ] [llm.c:98] [didactyl] llm error response: {"error":{"code":"authentication_error","message":"Invalid Anthropic API Key","type":"invalid_request_error","param":null}}
[2026-03-25 13:47:45] [INFO ] [llm.c:76] [didactyl] llm request: method=POST url=https://api.anthropic.com/v1/chat/completions body_bytes=27532 body_preview={"model":"claude-haiku-4.5","max_tokens":512,"temperature":0.3,"messages":[{"role":"system","content":"# Test Agent\n\nYou are a test agent. Respond to requests and use tools when needed."},{"role":"user","content":"Check your cashu wallet balance"},{"role":"user","content":"Check your cashu wallet balance","_ts":1774460865}],"tools":[{"type":"function","function":{"name":"nostr_post","description":"Publish a Nostr event to connected relays","parameters":{"type":"object","properties":{"kind":{"type":"integer","description":"Nostr event kind number (for example 1 for note, 7 for reaction, 30023 for longform)"},"content":{"type":"string","description":"Event content/body text to publish"},"tags":{"type":"array","description":"Optional Nostr tags array, e.g. [[\"d\",\"my-skill\"],[\"t\",\"nostr\"]]","items":{"type":"array","items":{"type":"string"}}}},"required":["kind","content"]}}},{"type":"function","function":{"name":"nostr_query","description":"Query events from relays using a Nostr filter","parameters":{"type":"object","properties":{"filter":{"type":"object","description":"Nostr filter object (authors, kinds, ids, since, until, limit, and tag filters)"},"timeout_ms":{"type":"integer","description":"Optional query timeout in milliseconds"}},"required":["filter"]}}},{"type":"function","function":{"name":"local_shell_exec","description":"Execute a shell command and return stdout/stderr","parameters":{"type":"object","properties":{"command":{"type":"string","description":"Shell command to execute in the configured working directory"}},"required":["command"]}}},{"type":"function","function":{"name":"local_file_read","description":"Read a local file as text from the configured working directory","parameters":{"type":"object","properties":{"path":{"type":"string","description":"Path to file to read (relative to configured working directory)"},"max_bytes":{"type":"integer","description":"Optional maximum bytes to return"}},"required":["path"]}}},{"type":"function","function":{"name":"local_file_write","description":"Write text content to a local file in the configured working directory","parameters":{"type":"object","properties":{"path":{"type":"string","description":"Path to file to write (relative to configured working directory)"},"content":{"type":"string","description":"Text content to write"},"append":{"type":"boolean","description":"When true, append to file instead of overwriting"}},"required":["path","content"]}}},{"type":"function","function":{"name":"nostr_post_readme","description":"Publish README.md as kind 30023 with deterministic d tag readme.md","parameters":{"type":"object","properties":{},"required":[]}}},{"type":"function","function":{"name":"nostr_delete","description":"Request deletion of one or more previously published events (NIP-09 kind 5)","parameters":{"type":"object","properties":{"event_ids":{"type":"array","description":"Event IDs to request deletion for","items":{"type":"string"}},"kinds":{"type":"array","description":"Optional kinds corresponding to event_ids entries","items":{"type":"integer"}},"reason":{"type":"string","description":"Optional human-readable reason"}},"required":["event_ids"]}}},{"type":"function","function":{"name":"nostr_react","description":"React to a Nostr event with like/dislike/emoji (NIP-25 kind 7)","parameters":{"type":"object","properties":{"event_id":{"type":"string","description":"Target event ID to react to"},"event_pubkey":{"type":"string","description":"Author pubkey of target event"},"event_kind":{"type":"integer","description":"Optional kind of target event"},"reaction":{"type":"string","description":"Reaction content such as +, -, ❤️, or emoji"}},"required":["event_id","event_pubkey"]}}},{"type":"function","function":{"name":"nostr_profile_get","description":"Look up a Nostr profile (kind 0 metadata) by pubkey","parameters":{"type":"object","properties":{"pubkey":{"type":"string","description":"Hex pubkey of the profile to fetch"}},"required":["pubkey"]}}},{"ty...
[2026-03-25 13:47:46] [ERROR] [llm.c:93] [didactyl] llm http request failed: status=401
[2026-03-25 13:47:46] [WARN ] [llm.c:98] [didactyl] llm error response: {"error":{"code":"authentication_error","message":"Invalid Anthropic API Key","type":"invalid_request_error","param":null}}
[2026-03-25 13:47:46] [TRACE] [nostr_handler.c:162] [didactyl] [nostr:websocket] RECV <large EVENT frame suppressed, bytes=604>
[2026-03-25 13:47:46] [INFO ] [nostr_handler.c:2151] [didactyl] self-skill cache received kind=31124 d_tag=identity_and_rules id=1ae930e3355b38422c24c409b0c670975ccefcb095bd55db5d9d987dcd83027c created_at=1774460865 via wss://relay.primal.net
[2026-03-25 13:47:46] [INFO ] [trigger_manager.c:1364] [didactyl] trigger updated d_tag=identity_and_rules action=0 enabled=1
[2026-03-25 13:47:46] [INFO ] [nostr_handler.c:1207] [didactyl] live self-skill trigger registered d_tag=identity_and_rules action=llm enabled=1
[2026-03-25 13:47:46] [TRACE] [nostr_handler.c:162] [didactyl] [nostr:websocket] RECV <large EVENT frame suppressed, bytes=462>
[2026-03-25 13:47:46] [TRACE] [nostr_handler.c:162] [didactyl] [nostr:websocket] RECV <large EVENT frame suppressed, bytes=471>
[2026-03-25 13:47:46] [INFO ] [llm.c:76] [didactyl] llm request: method=POST url=https://api.anthropic.com/v1/chat/completions body_bytes=27532 body_preview={"model":"claude-haiku-4.5","max_tokens":512,"temperature":0.3,"messages":[{"role":"system","content":"# Test Agent\n\nYou are a test agent. Respond to requests and use tools when needed."},{"role":"user","content":"What is your public key in hex?"},{"role":"user","content":"What is your public key in hex?","_ts":1774460866}],"tools":[{"type":"function","function":{"name":"nostr_post","description":"Publish a Nostr event to connected relays","parameters":{"type":"object","properties":{"kind":{"type":"integer","description":"Nostr event kind number (for example 1 for note, 7 for reaction, 30023 for longform)"},"content":{"type":"string","description":"Event content/body text to publish"},"tags":{"type":"array","description":"Optional Nostr tags array, e.g. [[\"d\",\"my-skill\"],[\"t\",\"nostr\"]]","items":{"type":"array","items":{"type":"string"}}}},"required":["kind","content"]}}},{"type":"function","function":{"name":"nostr_query","description":"Query events from relays using a Nostr filter","parameters":{"type":"object","properties":{"filter":{"type":"object","description":"Nostr filter object (authors, kinds, ids, since, until, limit, and tag filters)"},"timeout_ms":{"type":"integer","description":"Optional query timeout in milliseconds"}},"required":["filter"]}}},{"type":"function","function":{"name":"local_shell_exec","description":"Execute a shell command and return stdout/stderr","parameters":{"type":"object","properties":{"command":{"type":"string","description":"Shell command to execute in the configured working directory"}},"required":["command"]}}},{"type":"function","function":{"name":"local_file_read","description":"Read a local file as text from the configured working directory","parameters":{"type":"object","properties":{"path":{"type":"string","description":"Path to file to read (relative to configured working directory)"},"max_bytes":{"type":"integer","description":"Optional maximum bytes to return"}},"required":["path"]}}},{"type":"function","function":{"name":"local_file_write","description":"Write text content to a local file in the configured working directory","parameters":{"type":"object","properties":{"path":{"type":"string","description":"Path to file to write (relative to configured working directory)"},"content":{"type":"string","description":"Text content to write"},"append":{"type":"boolean","description":"When true, append to file instead of overwriting"}},"required":["path","content"]}}},{"type":"function","function":{"name":"nostr_post_readme","description":"Publish README.md as kind 30023 with deterministic d tag readme.md","parameters":{"type":"object","properties":{},"required":[]}}},{"type":"function","function":{"name":"nostr_delete","description":"Request deletion of one or more previously published events (NIP-09 kind 5)","parameters":{"type":"object","properties":{"event_ids":{"type":"array","description":"Event IDs to request deletion for","items":{"type":"string"}},"kinds":{"type":"array","description":"Optional kinds corresponding to event_ids entries","items":{"type":"integer"}},"reason":{"type":"string","description":"Optional human-readable reason"}},"required":["event_ids"]}}},{"type":"function","function":{"name":"nostr_react","description":"React to a Nostr event with like/dislike/emoji (NIP-25 kind 7)","parameters":{"type":"object","properties":{"event_id":{"type":"string","description":"Target event ID to react to"},"event_pubkey":{"type":"string","description":"Author pubkey of target event"},"event_kind":{"type":"integer","description":"Optional kind of target event"},"reaction":{"type":"string","description":"Reaction content such as +, -, ❤️, or emoji"}},"required":["event_id","event_pubkey"]}}},{"type":"function","function":{"name":"nostr_profile_get","description":"Look up a Nostr profile (kind 0 metadata) by pubkey","parameters":{"type":"object","properties":{"pubkey":{"type":"string","description":"Hex pubkey of the profile to fetch"}},"required":["pubkey"]}}},{"ty...
[2026-03-25 13:47:46] [ERROR] [llm.c:93] [didactyl] llm http request failed: status=401
[2026-03-25 13:47:46] [WARN ] [llm.c:98] [didactyl] llm error response: {"error":{"code":"authentication_error","message":"Invalid Anthropic API Key","type":"invalid_request_error","param":null}}
[2026-03-25 13:47:46] [TRACE] [nostr_handler.c:162] [didactyl] [nostr:websocket] RECV <large EVENT frame suppressed, bytes=540>
[2026-03-25 13:47:46] [INFO ] [nostr_handler.c:2151] [didactyl] self-skill cache received kind=10123 d_tag=- id=a13b499ed99e4b8677654b43ef561820b2b36c27693cc4f9dc6bfac8895871f6 created_at=1774460865 via wss://relay.primal.net
[2026-03-25 13:47:46] [INFO ] [llm.c:76] [didactyl] llm request: method=POST url=https://api.anthropic.com/v1/chat/completions body_bytes=27506 body_preview={"model":"claude-haiku-4.5","max_tokens":512,"temperature":0.3,"messages":[{"role":"system","content":"# Test Agent\n\nYou are a test agent. Respond to requests and use tools when needed."},{"role":"user","content":"What is your npub?"},{"role":"user","content":"What is your npub?","_ts":1774460866}],"tools":[{"type":"function","function":{"name":"nostr_post","description":"Publish a Nostr event to connected relays","parameters":{"type":"object","properties":{"kind":{"type":"integer","description":"Nostr event kind number (for example 1 for note, 7 for reaction, 30023 for longform)"},"content":{"type":"string","description":"Event content/body text to publish"},"tags":{"type":"array","description":"Optional Nostr tags array, e.g. [[\"d\",\"my-skill\"],[\"t\",\"nostr\"]]","items":{"type":"array","items":{"type":"string"}}}},"required":["kind","content"]}}},{"type":"function","function":{"name":"nostr_query","description":"Query events from relays using a Nostr filter","parameters":{"type":"object","properties":{"filter":{"type":"object","description":"Nostr filter object (authors, kinds, ids, since, until, limit, and tag filters)"},"timeout_ms":{"type":"integer","description":"Optional query timeout in milliseconds"}},"required":["filter"]}}},{"type":"function","function":{"name":"local_shell_exec","description":"Execute a shell command and return stdout/stderr","parameters":{"type":"object","properties":{"command":{"type":"string","description":"Shell command to execute in the configured working directory"}},"required":["command"]}}},{"type":"function","function":{"name":"local_file_read","description":"Read a local file as text from the configured working directory","parameters":{"type":"object","properties":{"path":{"type":"string","description":"Path to file to read (relative to configured working directory)"},"max_bytes":{"type":"integer","description":"Optional maximum bytes to return"}},"required":["path"]}}},{"type":"function","function":{"name":"local_file_write","description":"Write text content to a local file in the configured working directory","parameters":{"type":"object","properties":{"path":{"type":"string","description":"Path to file to write (relative to configured working directory)"},"content":{"type":"string","description":"Text content to write"},"append":{"type":"boolean","description":"When true, append to file instead of overwriting"}},"required":["path","content"]}}},{"type":"function","function":{"name":"nostr_post_readme","description":"Publish README.md as kind 30023 with deterministic d tag readme.md","parameters":{"type":"object","properties":{},"required":[]}}},{"type":"function","function":{"name":"nostr_delete","description":"Request deletion of one or more previously published events (NIP-09 kind 5)","parameters":{"type":"object","properties":{"event_ids":{"type":"array","description":"Event IDs to request deletion for","items":{"type":"string"}},"kinds":{"type":"array","description":"Optional kinds corresponding to event_ids entries","items":{"type":"integer"}},"reason":{"type":"string","description":"Optional human-readable reason"}},"required":["event_ids"]}}},{"type":"function","function":{"name":"nostr_react","description":"React to a Nostr event with like/dislike/emoji (NIP-25 kind 7)","parameters":{"type":"object","properties":{"event_id":{"type":"string","description":"Target event ID to react to"},"event_pubkey":{"type":"string","description":"Author pubkey of target event"},"event_kind":{"type":"integer","description":"Optional kind of target event"},"reaction":{"type":"string","description":"Reaction content such as +, -, ❤️, or emoji"}},"required":["event_id","event_pubkey"]}}},{"type":"function","function":{"name":"nostr_profile_get","description":"Look up a Nostr profile (kind 0 metadata) by pubkey","parameters":{"type":"object","properties":{"pubkey":{"type":"string","description":"Hex pubkey of the profile to fetch"}},"required":["pubkey"]}}},{"type":"function","function":...
[2026-03-25 13:47:47] [ERROR] [llm.c:93] [didactyl] llm http request failed: status=401
[2026-03-25 13:47:47] [WARN ] [llm.c:98] [didactyl] llm error response: {"error":{"code":"authentication_error","message":"Invalid Anthropic API Key","type":"invalid_request_error","param":null}}
[2026-03-25 13:47:47] [INFO ] [llm.c:76] [didactyl] llm request: method=POST url=https://api.anthropic.com/v1/chat/completions body_bytes=27524 body_preview={"model":"claude-haiku-4.5","max_tokens":512,"temperature":0.3,"messages":[{"role":"system","content":"# Test Agent\n\nYou are a test agent. Respond to requests and use tools when needed."},{"role":"user","content":"Tell me about your identity"},{"role":"user","content":"Tell me about your identity","_ts":1774460867}],"tools":[{"type":"function","function":{"name":"nostr_post","description":"Publish a Nostr event to connected relays","parameters":{"type":"object","properties":{"kind":{"type":"integer","description":"Nostr event kind number (for example 1 for note, 7 for reaction, 30023 for longform)"},"content":{"type":"string","description":"Event content/body text to publish"},"tags":{"type":"array","description":"Optional Nostr tags array, e.g. [[\"d\",\"my-skill\"],[\"t\",\"nostr\"]]","items":{"type":"array","items":{"type":"string"}}}},"required":["kind","content"]}}},{"type":"function","function":{"name":"nostr_query","description":"Query events from relays using a Nostr filter","parameters":{"type":"object","properties":{"filter":{"type":"object","description":"Nostr filter object (authors, kinds, ids, since, until, limit, and tag filters)"},"timeout_ms":{"type":"integer","description":"Optional query timeout in milliseconds"}},"required":["filter"]}}},{"type":"function","function":{"name":"local_shell_exec","description":"Execute a shell command and return stdout/stderr","parameters":{"type":"object","properties":{"command":{"type":"string","description":"Shell command to execute in the configured working directory"}},"required":["command"]}}},{"type":"function","function":{"name":"local_file_read","description":"Read a local file as text from the configured working directory","parameters":{"type":"object","properties":{"path":{"type":"string","description":"Path to file to read (relative to configured working directory)"},"max_bytes":{"type":"integer","description":"Optional maximum bytes to return"}},"required":["path"]}}},{"type":"function","function":{"name":"local_file_write","description":"Write text content to a local file in the configured working directory","parameters":{"type":"object","properties":{"path":{"type":"string","description":"Path to file to write (relative to configured working directory)"},"content":{"type":"string","description":"Text content to write"},"append":{"type":"boolean","description":"When true, append to file instead of overwriting"}},"required":["path","content"]}}},{"type":"function","function":{"name":"nostr_post_readme","description":"Publish README.md as kind 30023 with deterministic d tag readme.md","parameters":{"type":"object","properties":{},"required":[]}}},{"type":"function","function":{"name":"nostr_delete","description":"Request deletion of one or more previously published events (NIP-09 kind 5)","parameters":{"type":"object","properties":{"event_ids":{"type":"array","description":"Event IDs to request deletion for","items":{"type":"string"}},"kinds":{"type":"array","description":"Optional kinds corresponding to event_ids entries","items":{"type":"integer"}},"reason":{"type":"string","description":"Optional human-readable reason"}},"required":["event_ids"]}}},{"type":"function","function":{"name":"nostr_react","description":"React to a Nostr event with like/dislike/emoji (NIP-25 kind 7)","parameters":{"type":"object","properties":{"event_id":{"type":"string","description":"Target event ID to react to"},"event_pubkey":{"type":"string","description":"Author pubkey of target event"},"event_kind":{"type":"integer","description":"Optional kind of target event"},"reaction":{"type":"string","description":"Reaction content such as +, -, ❤️, or emoji"}},"required":["event_id","event_pubkey"]}}},{"type":"function","function":{"name":"nostr_profile_get","description":"Look up a Nostr profile (kind 0 metadata) by pubkey","parameters":{"type":"object","properties":{"pubkey":{"type":"string","description":"Hex pubkey of the profile to fetch"}},"required":["pubkey"]}}},{"type":"fun...
[2026-03-25 13:47:48] [ERROR] [llm.c:93] [didactyl] llm http request failed: status=401
[2026-03-25 13:47:48] [WARN ] [llm.c:98] [didactyl] llm error response: {"error":{"code":"authentication_error","message":"Invalid Anthropic API Key","type":"invalid_request_error","param":null}}
[2026-03-25 13:47:48] [INFO ] [llm.c:76] [didactyl] llm request: method=POST url=https://api.anthropic.com/v1/chat/completions body_bytes=27512 body_preview={"model":"claude-haiku-4.5","max_tokens":512,"temperature":0.3,"messages":[{"role":"system","content":"# Test Agent\n\nYou are a test agent. Respond to requests and use tools when needed."},{"role":"user","content":"What version are you?"},{"role":"user","content":"What version are you?","_ts":1774460868}],"tools":[{"type":"function","function":{"name":"nostr_post","description":"Publish a Nostr event to connected relays","parameters":{"type":"object","properties":{"kind":{"type":"integer","description":"Nostr event kind number (for example 1 for note, 7 for reaction, 30023 for longform)"},"content":{"type":"string","description":"Event content/body text to publish"},"tags":{"type":"array","description":"Optional Nostr tags array, e.g. [[\"d\",\"my-skill\"],[\"t\",\"nostr\"]]","items":{"type":"array","items":{"type":"string"}}}},"required":["kind","content"]}}},{"type":"function","function":{"name":"nostr_query","description":"Query events from relays using a Nostr filter","parameters":{"type":"object","properties":{"filter":{"type":"object","description":"Nostr filter object (authors, kinds, ids, since, until, limit, and tag filters)"},"timeout_ms":{"type":"integer","description":"Optional query timeout in milliseconds"}},"required":["filter"]}}},{"type":"function","function":{"name":"local_shell_exec","description":"Execute a shell command and return stdout/stderr","parameters":{"type":"object","properties":{"command":{"type":"string","description":"Shell command to execute in the configured working directory"}},"required":["command"]}}},{"type":"function","function":{"name":"local_file_read","description":"Read a local file as text from the configured working directory","parameters":{"type":"object","properties":{"path":{"type":"string","description":"Path to file to read (relative to configured working directory)"},"max_bytes":{"type":"integer","description":"Optional maximum bytes to return"}},"required":["path"]}}},{"type":"function","function":{"name":"local_file_write","description":"Write text content to a local file in the configured working directory","parameters":{"type":"object","properties":{"path":{"type":"string","description":"Path to file to write (relative to configured working directory)"},"content":{"type":"string","description":"Text content to write"},"append":{"type":"boolean","description":"When true, append to file instead of overwriting"}},"required":["path","content"]}}},{"type":"function","function":{"name":"nostr_post_readme","description":"Publish README.md as kind 30023 with deterministic d tag readme.md","parameters":{"type":"object","properties":{},"required":[]}}},{"type":"function","function":{"name":"nostr_delete","description":"Request deletion of one or more previously published events (NIP-09 kind 5)","parameters":{"type":"object","properties":{"event_ids":{"type":"array","description":"Event IDs to request deletion for","items":{"type":"string"}},"kinds":{"type":"array","description":"Optional kinds corresponding to event_ids entries","items":{"type":"integer"}},"reason":{"type":"string","description":"Optional human-readable reason"}},"required":["event_ids"]}}},{"type":"function","function":{"name":"nostr_react","description":"React to a Nostr event with like/dislike/emoji (NIP-25 kind 7)","parameters":{"type":"object","properties":{"event_id":{"type":"string","description":"Target event ID to react to"},"event_pubkey":{"type":"string","description":"Author pubkey of target event"},"event_kind":{"type":"integer","description":"Optional kind of target event"},"reaction":{"type":"string","description":"Reaction content such as +, -, ❤️, or emoji"}},"required":["event_id","event_pubkey"]}}},{"type":"function","function":{"name":"nostr_profile_get","description":"Look up a Nostr profile (kind 0 metadata) by pubkey","parameters":{"type":"object","properties":{"pubkey":{"type":"string","description":"Hex pubkey of the profile to fetch"}},"required":["pubkey"]}}},{"type":"function","func...
[2026-03-25 13:47:48] [ERROR] [llm.c:93] [didactyl] llm http request failed: status=401
[2026-03-25 13:47:48] [WARN ] [llm.c:98] [didactyl] llm error response: {"error":{"code":"authentication_error","message":"Invalid Anthropic API Key","type":"invalid_request_error","param":null}}
[2026-03-25 13:47:48] [INFO ] [llm.c:76] [didactyl] llm request: method=POST url=https://api.anthropic.com/v1/chat/completions body_bytes=27522 body_preview={"model":"claude-haiku-4.5","max_tokens":512,"temperature":0.3,"messages":[{"role":"system","content":"# Test Agent\n\nYou are a test agent. Respond to requests and use tools when needed."},{"role":"user","content":"Who is your administrator?"},{"role":"user","content":"Who is your administrator?","_ts":1774460868}],"tools":[{"type":"function","function":{"name":"nostr_post","description":"Publish a Nostr event to connected relays","parameters":{"type":"object","properties":{"kind":{"type":"integer","description":"Nostr event kind number (for example 1 for note, 7 for reaction, 30023 for longform)"},"content":{"type":"string","description":"Event content/body text to publish"},"tags":{"type":"array","description":"Optional Nostr tags array, e.g. [[\"d\",\"my-skill\"],[\"t\",\"nostr\"]]","items":{"type":"array","items":{"type":"string"}}}},"required":["kind","content"]}}},{"type":"function","function":{"name":"nostr_query","description":"Query events from relays using a Nostr filter","parameters":{"type":"object","properties":{"filter":{"type":"object","description":"Nostr filter object (authors, kinds, ids, since, until, limit, and tag filters)"},"timeout_ms":{"type":"integer","description":"Optional query timeout in milliseconds"}},"required":["filter"]}}},{"type":"function","function":{"name":"local_shell_exec","description":"Execute a shell command and return stdout/stderr","parameters":{"type":"object","properties":{"command":{"type":"string","description":"Shell command to execute in the configured working directory"}},"required":["command"]}}},{"type":"function","function":{"name":"local_file_read","description":"Read a local file as text from the configured working directory","parameters":{"type":"object","properties":{"path":{"type":"string","description":"Path to file to read (relative to configured working directory)"},"max_bytes":{"type":"integer","description":"Optional maximum bytes to return"}},"required":["path"]}}},{"type":"function","function":{"name":"local_file_write","description":"Write text content to a local file in the configured working directory","parameters":{"type":"object","properties":{"path":{"type":"string","description":"Path to file to write (relative to configured working directory)"},"content":{"type":"string","description":"Text content to write"},"append":{"type":"boolean","description":"When true, append to file instead of overwriting"}},"required":["path","content"]}}},{"type":"function","function":{"name":"nostr_post_readme","description":"Publish README.md as kind 30023 with deterministic d tag readme.md","parameters":{"type":"object","properties":{},"required":[]}}},{"type":"function","function":{"name":"nostr_delete","description":"Request deletion of one or more previously published events (NIP-09 kind 5)","parameters":{"type":"object","properties":{"event_ids":{"type":"array","description":"Event IDs to request deletion for","items":{"type":"string"}},"kinds":{"type":"array","description":"Optional kinds corresponding to event_ids entries","items":{"type":"integer"}},"reason":{"type":"string","description":"Optional human-readable reason"}},"required":["event_ids"]}}},{"type":"function","function":{"name":"nostr_react","description":"React to a Nostr event with like/dislike/emoji (NIP-25 kind 7)","parameters":{"type":"object","properties":{"event_id":{"type":"string","description":"Target event ID to react to"},"event_pubkey":{"type":"string","description":"Author pubkey of target event"},"event_kind":{"type":"integer","description":"Optional kind of target event"},"reaction":{"type":"string","description":"Reaction content such as +, -, ❤️, or emoji"}},"required":["event_id","event_pubkey"]}}},{"type":"function","function":{"name":"nostr_profile_get","description":"Look up a Nostr profile (kind 0 metadata) by pubkey","parameters":{"type":"object","properties":{"pubkey":{"type":"string","description":"Hex pubkey of the profile to fetch"}},"required":["pubkey"]}}},{"type":"funct...
[2026-03-25 13:47:49] [ERROR] [llm.c:93] [didactyl] llm http request failed: status=401
[2026-03-25 13:47:49] [WARN ] [llm.c:98] [didactyl] llm error response: {"error":{"code":"authentication_error","message":"Invalid Anthropic API Key","type":"invalid_request_error","param":null}}
[2026-03-25 13:47:49] [INFO ] [llm.c:76] [didactyl] llm request: method=POST url=https://api.anthropic.com/v1/chat/completions body_bytes=27530 body_preview={"model":"claude-haiku-4.5","max_tokens":512,"temperature":0.3,"messages":[{"role":"system","content":"# Test Agent\n\nYou are a test agent. Respond to requests and use tools when needed."},{"role":"user","content":"Show me your current task list"},{"role":"user","content":"Show me your current task list","_ts":1774460869}],"tools":[{"type":"function","function":{"name":"nostr_post","description":"Publish a Nostr event to connected relays","parameters":{"type":"object","properties":{"kind":{"type":"integer","description":"Nostr event kind number (for example 1 for note, 7 for reaction, 30023 for longform)"},"content":{"type":"string","description":"Event content/body text to publish"},"tags":{"type":"array","description":"Optional Nostr tags array, e.g. [[\"d\",\"my-skill\"],[\"t\",\"nostr\"]]","items":{"type":"array","items":{"type":"string"}}}},"required":["kind","content"]}}},{"type":"function","function":{"name":"nostr_query","description":"Query events from relays using a Nostr filter","parameters":{"type":"object","properties":{"filter":{"type":"object","description":"Nostr filter object (authors, kinds, ids, since, until, limit, and tag filters)"},"timeout_ms":{"type":"integer","description":"Optional query timeout in milliseconds"}},"required":["filter"]}}},{"type":"function","function":{"name":"local_shell_exec","description":"Execute a shell command and return stdout/stderr","parameters":{"type":"object","properties":{"command":{"type":"string","description":"Shell command to execute in the configured working directory"}},"required":["command"]}}},{"type":"function","function":{"name":"local_file_read","description":"Read a local file as text from the configured working directory","parameters":{"type":"object","properties":{"path":{"type":"string","description":"Path to file to read (relative to configured working directory)"},"max_bytes":{"type":"integer","description":"Optional maximum bytes to return"}},"required":["path"]}}},{"type":"function","function":{"name":"local_file_write","description":"Write text content to a local file in the configured working directory","parameters":{"type":"object","properties":{"path":{"type":"string","description":"Path to file to write (relative to configured working directory)"},"content":{"type":"string","description":"Text content to write"},"append":{"type":"boolean","description":"When true, append to file instead of overwriting"}},"required":["path","content"]}}},{"type":"function","function":{"name":"nostr_post_readme","description":"Publish README.md as kind 30023 with deterministic d tag readme.md","parameters":{"type":"object","properties":{},"required":[]}}},{"type":"function","function":{"name":"nostr_delete","description":"Request deletion of one or more previously published events (NIP-09 kind 5)","parameters":{"type":"object","properties":{"event_ids":{"type":"array","description":"Event IDs to request deletion for","items":{"type":"string"}},"kinds":{"type":"array","description":"Optional kinds corresponding to event_ids entries","items":{"type":"integer"}},"reason":{"type":"string","description":"Optional human-readable reason"}},"required":["event_ids"]}}},{"type":"function","function":{"name":"nostr_react","description":"React to a Nostr event with like/dislike/emoji (NIP-25 kind 7)","parameters":{"type":"object","properties":{"event_id":{"type":"string","description":"Target event ID to react to"},"event_pubkey":{"type":"string","description":"Author pubkey of target event"},"event_kind":{"type":"integer","description":"Optional kind of target event"},"reaction":{"type":"string","description":"Reaction content such as +, -, ❤️, or emoji"}},"required":["event_id","event_pubkey"]}}},{"type":"function","function":{"name":"nostr_profile_get","description":"Look up a Nostr profile (kind 0 metadata) by pubkey","parameters":{"type":"object","properties":{"pubkey":{"type":"string","description":"Hex pubkey of the profile to fetch"}},"required":["pubkey"]}}},{"type...
[2026-03-25 13:47:49] [ERROR] [llm.c:93] [didactyl] llm http request failed: status=401
[2026-03-25 13:47:49] [WARN ] [llm.c:98] [didactyl] llm error response: {"error":{"code":"authentication_error","message":"Invalid Anthropic API Key","type":"invalid_request_error","param":null}}
[2026-03-25 13:47:49] [INFO ] [llm.c:76] [didactyl] llm request: method=POST url=https://api.anthropic.com/v1/chat/completions body_bytes=27568 body_preview={"model":"claude-haiku-4.5","max_tokens":512,"temperature":0.3,"messages":[{"role":"system","content":"# Test Agent\n\nYou are a test agent. Respond to requests and use tools when needed."},{"role":"user","content":"Add a task test harness probe task then remove it"},{"role":"user","content":"Add a task test harness probe task then remove it","_ts":1774460869}],"tools":[{"type":"function","function":{"name":"nostr_post","description":"Publish a Nostr event to connected relays","parameters":{"type":"object","properties":{"kind":{"type":"integer","description":"Nostr event kind number (for example 1 for note, 7 for reaction, 30023 for longform)"},"content":{"type":"string","description":"Event content/body text to publish"},"tags":{"type":"array","description":"Optional Nostr tags array, e.g. [[\"d\",\"my-skill\"],[\"t\",\"nostr\"]]","items":{"type":"array","items":{"type":"string"}}}},"required":["kind","content"]}}},{"type":"function","function":{"name":"nostr_query","description":"Query events from relays using a Nostr filter","parameters":{"type":"object","properties":{"filter":{"type":"object","description":"Nostr filter object (authors, kinds, ids, since, until, limit, and tag filters)"},"timeout_ms":{"type":"integer","description":"Optional query timeout in milliseconds"}},"required":["filter"]}}},{"type":"function","function":{"name":"local_shell_exec","description":"Execute a shell command and return stdout/stderr","parameters":{"type":"object","properties":{"command":{"type":"string","description":"Shell command to execute in the configured working directory"}},"required":["command"]}}},{"type":"function","function":{"name":"local_file_read","description":"Read a local file as text from the configured working directory","parameters":{"type":"object","properties":{"path":{"type":"string","description":"Path to file to read (relative to configured working directory)"},"max_bytes":{"type":"integer","description":"Optional maximum bytes to return"}},"required":["path"]}}},{"type":"function","function":{"name":"local_file_write","description":"Write text content to a local file in the configured working directory","parameters":{"type":"object","properties":{"path":{"type":"string","description":"Path to file to write (relative to configured working directory)"},"content":{"type":"string","description":"Text content to write"},"append":{"type":"boolean","description":"When true, append to file instead of overwriting"}},"required":["path","content"]}}},{"type":"function","function":{"name":"nostr_post_readme","description":"Publish README.md as kind 30023 with deterministic d tag readme.md","parameters":{"type":"object","properties":{},"required":[]}}},{"type":"function","function":{"name":"nostr_delete","description":"Request deletion of one or more previously published events (NIP-09 kind 5)","parameters":{"type":"object","properties":{"event_ids":{"type":"array","description":"Event IDs to request deletion for","items":{"type":"string"}},"kinds":{"type":"array","description":"Optional kinds corresponding to event_ids entries","items":{"type":"integer"}},"reason":{"type":"string","description":"Optional human-readable reason"}},"required":["event_ids"]}}},{"type":"function","function":{"name":"nostr_react","description":"React to a Nostr event with like/dislike/emoji (NIP-25 kind 7)","parameters":{"type":"object","properties":{"event_id":{"type":"string","description":"Target event ID to react to"},"event_pubkey":{"type":"string","description":"Author pubkey of target event"},"event_kind":{"type":"integer","description":"Optional kind of target event"},"reaction":{"type":"string","description":"Reaction content such as +, -, ❤️, or emoji"}},"required":["event_id","event_pubkey"]}}},{"type":"function","function":{"name":"nostr_profile_get","description":"Look up a Nostr profile (kind 0 metadata) by pubkey","parameters":{"type":"object","properties":{"pubkey":{"type":"string","description":"Hex pubkey of the profile to fe...
[2026-03-25 13:47:50] [ERROR] [llm.c:93] [didactyl] llm http request failed: status=401
[2026-03-25 13:47:50] [WARN ] [llm.c:98] [didactyl] llm error response: {"error":{"code":"authentication_error","message":"Invalid Anthropic API Key","type":"invalid_request_error","param":null}}
[2026-03-25 13:47:50] [INFO ] [llm.c:76] [didactyl] llm request: method=POST url=https://api.anthropic.com/v1/chat/completions body_bytes=27586 body_preview={"model":"claude-haiku-4.5","max_tokens":512,"temperature":0.3,"messages":[{"role":"system","content":"# Test Agent\n\nYou are a test agent. Respond to requests and use tools when needed."},{"role":"user","content":"Save test harness probe to memory, then recall your memory"},{"role":"user","content":"Save test harness probe to memory, then recall your memory","_ts":1774460870}],"tools":[{"type":"function","function":{"name":"nostr_post","description":"Publish a Nostr event to connected relays","parameters":{"type":"object","properties":{"kind":{"type":"integer","description":"Nostr event kind number (for example 1 for note, 7 for reaction, 30023 for longform)"},"content":{"type":"string","description":"Event content/body text to publish"},"tags":{"type":"array","description":"Optional Nostr tags array, e.g. [[\"d\",\"my-skill\"],[\"t\",\"nostr\"]]","items":{"type":"array","items":{"type":"string"}}}},"required":["kind","content"]}}},{"type":"function","function":{"name":"nostr_query","description":"Query events from relays using a Nostr filter","parameters":{"type":"object","properties":{"filter":{"type":"object","description":"Nostr filter object (authors, kinds, ids, since, until, limit, and tag filters)"},"timeout_ms":{"type":"integer","description":"Optional query timeout in milliseconds"}},"required":["filter"]}}},{"type":"function","function":{"name":"local_shell_exec","description":"Execute a shell command and return stdout/stderr","parameters":{"type":"object","properties":{"command":{"type":"string","description":"Shell command to execute in the configured working directory"}},"required":["command"]}}},{"type":"function","function":{"name":"local_file_read","description":"Read a local file as text from the configured working directory","parameters":{"type":"object","properties":{"path":{"type":"string","description":"Path to file to read (relative to configured working directory)"},"max_bytes":{"type":"integer","description":"Optional maximum bytes to return"}},"required":["path"]}}},{"type":"function","function":{"name":"local_file_write","description":"Write text content to a local file in the configured working directory","parameters":{"type":"object","properties":{"path":{"type":"string","description":"Path to file to write (relative to configured working directory)"},"content":{"type":"string","description":"Text content to write"},"append":{"type":"boolean","description":"When true, append to file instead of overwriting"}},"required":["path","content"]}}},{"type":"function","function":{"name":"nostr_post_readme","description":"Publish README.md as kind 30023 with deterministic d tag readme.md","parameters":{"type":"object","properties":{},"required":[]}}},{"type":"function","function":{"name":"nostr_delete","description":"Request deletion of one or more previously published events (NIP-09 kind 5)","parameters":{"type":"object","properties":{"event_ids":{"type":"array","description":"Event IDs to request deletion for","items":{"type":"string"}},"kinds":{"type":"array","description":"Optional kinds corresponding to event_ids entries","items":{"type":"integer"}},"reason":{"type":"string","description":"Optional human-readable reason"}},"required":["event_ids"]}}},{"type":"function","function":{"name":"nostr_react","description":"React to a Nostr event with like/dislike/emoji (NIP-25 kind 7)","parameters":{"type":"object","properties":{"event_id":{"type":"string","description":"Target event ID to react to"},"event_pubkey":{"type":"string","description":"Author pubkey of target event"},"event_kind":{"type":"integer","description":"Optional kind of target event"},"reaction":{"type":"string","description":"Reaction content such as +, -, ❤️, or emoji"}},"required":["event_id","event_pubkey"]}}},{"type":"function","function":{"name":"nostr_profile_get","description":"Look up a Nostr profile (kind 0 metadata) by pubkey","parameters":{"type":"object","properties":{"pubkey":{"type":"string","description":"Hex pubkey of...
[2026-03-25 13:47:50] [ERROR] [llm.c:93] [didactyl] llm http request failed: status=401
[2026-03-25 13:47:50] [WARN ] [llm.c:98] [didactyl] llm error response: {"error":{"code":"authentication_error","message":"Invalid Anthropic API Key","type":"invalid_request_error","param":null}}
[2026-03-25 13:47:51] [INFO ] [llm.c:76] [didactyl] llm request: method=POST url=https://api.anthropic.com/v1/chat/completions body_bytes=27556 body_preview={"model":"claude-haiku-4.5","max_tokens":512,"temperature":0.3,"messages":[{"role":"system","content":"# Test Agent\n\nYou are a test agent. Respond to requests and use tools when needed."},{"role":"user","content":"Post a test note saying Automated test post"},{"role":"user","content":"Post a test note saying Automated test post","_ts":1774460871}],"tools":[{"type":"function","function":{"name":"nostr_post","description":"Publish a Nostr event to connected relays","parameters":{"type":"object","properties":{"kind":{"type":"integer","description":"Nostr event kind number (for example 1 for note, 7 for reaction, 30023 for longform)"},"content":{"type":"string","description":"Event content/body text to publish"},"tags":{"type":"array","description":"Optional Nostr tags array, e.g. [[\"d\",\"my-skill\"],[\"t\",\"nostr\"]]","items":{"type":"array","items":{"type":"string"}}}},"required":["kind","content"]}}},{"type":"function","function":{"name":"nostr_query","description":"Query events from relays using a Nostr filter","parameters":{"type":"object","properties":{"filter":{"type":"object","description":"Nostr filter object (authors, kinds, ids, since, until, limit, and tag filters)"},"timeout_ms":{"type":"integer","description":"Optional query timeout in milliseconds"}},"required":["filter"]}}},{"type":"function","function":{"name":"local_shell_exec","description":"Execute a shell command and return stdout/stderr","parameters":{"type":"object","properties":{"command":{"type":"string","description":"Shell command to execute in the configured working directory"}},"required":["command"]}}},{"type":"function","function":{"name":"local_file_read","description":"Read a local file as text from the configured working directory","parameters":{"type":"object","properties":{"path":{"type":"string","description":"Path to file to read (relative to configured working directory)"},"max_bytes":{"type":"integer","description":"Optional maximum bytes to return"}},"required":["path"]}}},{"type":"function","function":{"name":"local_file_write","description":"Write text content to a local file in the configured working directory","parameters":{"type":"object","properties":{"path":{"type":"string","description":"Path to file to write (relative to configured working directory)"},"content":{"type":"string","description":"Text content to write"},"append":{"type":"boolean","description":"When true, append to file instead of overwriting"}},"required":["path","content"]}}},{"type":"function","function":{"name":"nostr_post_readme","description":"Publish README.md as kind 30023 with deterministic d tag readme.md","parameters":{"type":"object","properties":{},"required":[]}}},{"type":"function","function":{"name":"nostr_delete","description":"Request deletion of one or more previously published events (NIP-09 kind 5)","parameters":{"type":"object","properties":{"event_ids":{"type":"array","description":"Event IDs to request deletion for","items":{"type":"string"}},"kinds":{"type":"array","description":"Optional kinds corresponding to event_ids entries","items":{"type":"integer"}},"reason":{"type":"string","description":"Optional human-readable reason"}},"required":["event_ids"]}}},{"type":"function","function":{"name":"nostr_react","description":"React to a Nostr event with like/dislike/emoji (NIP-25 kind 7)","parameters":{"type":"object","properties":{"event_id":{"type":"string","description":"Target event ID to react to"},"event_pubkey":{"type":"string","description":"Author pubkey of target event"},"event_kind":{"type":"integer","description":"Optional kind of target event"},"reaction":{"type":"string","description":"Reaction content such as +, -, ❤️, or emoji"}},"required":["event_id","event_pubkey"]}}},{"type":"function","function":{"name":"nostr_profile_get","description":"Look up a Nostr profile (kind 0 metadata) by pubkey","parameters":{"type":"object","properties":{"pubkey":{"type":"string","description":"Hex pubkey of the profile to fetch"}},"requ...
[2026-03-25 13:47:51] [ERROR] [llm.c:93] [didactyl] llm http request failed: status=401
[2026-03-25 13:47:51] [WARN ] [llm.c:98] [didactyl] llm error response: {"error":{"code":"authentication_error","message":"Invalid Anthropic API Key","type":"invalid_request_error","param":null}}
[2026-03-25 13:47:51] [INFO ] [llm.c:76] [didactyl] llm request: method=POST url=https://api.anthropic.com/v1/chat/completions body_bytes=27574 body_preview={"model":"claude-haiku-4.5","max_tokens":512,"temperature":0.3,"messages":[{"role":"system","content":"# Test Agent\n\nYou are a test agent. Respond to requests and use tools when needed."},{"role":"user","content":"Query the 3 most recent kind 1 notes from any author"},{"role":"user","content":"Query the 3 most recent kind 1 notes from any author","_ts":1774460871}],"tools":[{"type":"function","function":{"name":"nostr_post","description":"Publish a Nostr event to connected relays","parameters":{"type":"object","properties":{"kind":{"type":"integer","description":"Nostr event kind number (for example 1 for note, 7 for reaction, 30023 for longform)"},"content":{"type":"string","description":"Event content/body text to publish"},"tags":{"type":"array","description":"Optional Nostr tags array, e.g. [[\"d\",\"my-skill\"],[\"t\",\"nostr\"]]","items":{"type":"array","items":{"type":"string"}}}},"required":["kind","content"]}}},{"type":"function","function":{"name":"nostr_query","description":"Query events from relays using a Nostr filter","parameters":{"type":"object","properties":{"filter":{"type":"object","description":"Nostr filter object (authors, kinds, ids, since, until, limit, and tag filters)"},"timeout_ms":{"type":"integer","description":"Optional query timeout in milliseconds"}},"required":["filter"]}}},{"type":"function","function":{"name":"local_shell_exec","description":"Execute a shell command and return stdout/stderr","parameters":{"type":"object","properties":{"command":{"type":"string","description":"Shell command to execute in the configured working directory"}},"required":["command"]}}},{"type":"function","function":{"name":"local_file_read","description":"Read a local file as text from the configured working directory","parameters":{"type":"object","properties":{"path":{"type":"string","description":"Path to file to read (relative to configured working directory)"},"max_bytes":{"type":"integer","description":"Optional maximum bytes to return"}},"required":["path"]}}},{"type":"function","function":{"name":"local_file_write","description":"Write text content to a local file in the configured working directory","parameters":{"type":"object","properties":{"path":{"type":"string","description":"Path to file to write (relative to configured working directory)"},"content":{"type":"string","description":"Text content to write"},"append":{"type":"boolean","description":"When true, append to file instead of overwriting"}},"required":["path","content"]}}},{"type":"function","function":{"name":"nostr_post_readme","description":"Publish README.md as kind 30023 with deterministic d tag readme.md","parameters":{"type":"object","properties":{},"required":[]}}},{"type":"function","function":{"name":"nostr_delete","description":"Request deletion of one or more previously published events (NIP-09 kind 5)","parameters":{"type":"object","properties":{"event_ids":{"type":"array","description":"Event IDs to request deletion for","items":{"type":"string"}},"kinds":{"type":"array","description":"Optional kinds corresponding to event_ids entries","items":{"type":"integer"}},"reason":{"type":"string","description":"Optional human-readable reason"}},"required":["event_ids"]}}},{"type":"function","function":{"name":"nostr_react","description":"React to a Nostr event with like/dislike/emoji (NIP-25 kind 7)","parameters":{"type":"object","properties":{"event_id":{"type":"string","description":"Target event ID to react to"},"event_pubkey":{"type":"string","description":"Author pubkey of target event"},"event_kind":{"type":"integer","description":"Optional kind of target event"},"reaction":{"type":"string","description":"Reaction content such as +, -, ❤️, or emoji"}},"required":["event_id","event_pubkey"]}}},{"type":"function","function":{"name":"nostr_profile_get","description":"Look up a Nostr profile (kind 0 metadata) by pubkey","parameters":{"type":"object","properties":{"pubkey":{"type":"string","description":"Hex pubkey of the profile...
[2026-03-25 13:47:52] [ERROR] [llm.c:93] [didactyl] llm http request failed: status=401
[2026-03-25 13:47:52] [WARN ] [llm.c:98] [didactyl] llm error response: {"error":{"code":"authentication_error","message":"Invalid Anthropic API Key","type":"invalid_request_error","param":null}}
[2026-03-25 13:47:52] [INFO ] [llm.c:76] [didactyl] llm request: method=POST url=https://api.anthropic.com/v1/chat/completions body_bytes=27516 body_preview={"model":"claude-haiku-4.5","max_tokens":512,"temperature":0.3,"messages":[{"role":"system","content":"# Test Agent\n\nYou are a test agent. Respond to requests and use tools when needed."},{"role":"user","content":"List your recent events"},{"role":"user","content":"List your recent events","_ts":1774460872}],"tools":[{"type":"function","function":{"name":"nostr_post","description":"Publish a Nostr event to connected relays","parameters":{"type":"object","properties":{"kind":{"type":"integer","description":"Nostr event kind number (for example 1 for note, 7 for reaction, 30023 for longform)"},"content":{"type":"string","description":"Event content/body text to publish"},"tags":{"type":"array","description":"Optional Nostr tags array, e.g. [[\"d\",\"my-skill\"],[\"t\",\"nostr\"]]","items":{"type":"array","items":{"type":"string"}}}},"required":["kind","content"]}}},{"type":"function","function":{"name":"nostr_query","description":"Query events from relays using a Nostr filter","parameters":{"type":"object","properties":{"filter":{"type":"object","description":"Nostr filter object (authors, kinds, ids, since, until, limit, and tag filters)"},"timeout_ms":{"type":"integer","description":"Optional query timeout in milliseconds"}},"required":["filter"]}}},{"type":"function","function":{"name":"local_shell_exec","description":"Execute a shell command and return stdout/stderr","parameters":{"type":"object","properties":{"command":{"type":"string","description":"Shell command to execute in the configured working directory"}},"required":["command"]}}},{"type":"function","function":{"name":"local_file_read","description":"Read a local file as text from the configured working directory","parameters":{"type":"object","properties":{"path":{"type":"string","description":"Path to file to read (relative to configured working directory)"},"max_bytes":{"type":"integer","description":"Optional maximum bytes to return"}},"required":["path"]}}},{"type":"function","function":{"name":"local_file_write","description":"Write text content to a local file in the configured working directory","parameters":{"type":"object","properties":{"path":{"type":"string","description":"Path to file to write (relative to configured working directory)"},"content":{"type":"string","description":"Text content to write"},"append":{"type":"boolean","description":"When true, append to file instead of overwriting"}},"required":["path","content"]}}},{"type":"function","function":{"name":"nostr_post_readme","description":"Publish README.md as kind 30023 with deterministic d tag readme.md","parameters":{"type":"object","properties":{},"required":[]}}},{"type":"function","function":{"name":"nostr_delete","description":"Request deletion of one or more previously published events (NIP-09 kind 5)","parameters":{"type":"object","properties":{"event_ids":{"type":"array","description":"Event IDs to request deletion for","items":{"type":"string"}},"kinds":{"type":"array","description":"Optional kinds corresponding to event_ids entries","items":{"type":"integer"}},"reason":{"type":"string","description":"Optional human-readable reason"}},"required":["event_ids"]}}},{"type":"function","function":{"name":"nostr_react","description":"React to a Nostr event with like/dislike/emoji (NIP-25 kind 7)","parameters":{"type":"object","properties":{"event_id":{"type":"string","description":"Target event ID to react to"},"event_pubkey":{"type":"string","description":"Author pubkey of target event"},"event_kind":{"type":"integer","description":"Optional kind of target event"},"reaction":{"type":"string","description":"Reaction content such as +, -, ❤️, or emoji"}},"required":["event_id","event_pubkey"]}}},{"type":"function","function":{"name":"nostr_profile_get","description":"Look up a Nostr profile (kind 0 metadata) by pubkey","parameters":{"type":"object","properties":{"pubkey":{"type":"string","description":"Hex pubkey of the profile to fetch"}},"required":["pubkey"]}}},{"type":"function","...
[2026-03-25 13:47:52] [ERROR] [llm.c:93] [didactyl] llm http request failed: status=401
[2026-03-25 13:47:52] [WARN ] [llm.c:98] [didactyl] llm error response: {"error":{"code":"authentication_error","message":"Invalid Anthropic API Key","type":"invalid_request_error","param":null}}
[2026-03-25 13:47:52] [INFO ] [llm.c:76] [didactyl] llm request: method=POST url=https://api.anthropic.com/v1/chat/completions body_bytes=27560 body_preview={"model":"claude-haiku-4.5","max_tokens":512,"temperature":0.3,"messages":[{"role":"system","content":"# Test Agent\n\nYou are a test agent. Respond to requests and use tools when needed."},{"role":"user","content":"What is the status of your relay connections?"},{"role":"user","content":"What is the status of your relay connections?","_ts":1774460872}],"tools":[{"type":"function","function":{"name":"nostr_post","description":"Publish a Nostr event to connected relays","parameters":{"type":"object","properties":{"kind":{"type":"integer","description":"Nostr event kind number (for example 1 for note, 7 for reaction, 30023 for longform)"},"content":{"type":"string","description":"Event content/body text to publish"},"tags":{"type":"array","description":"Optional Nostr tags array, e.g. [[\"d\",\"my-skill\"],[\"t\",\"nostr\"]]","items":{"type":"array","items":{"type":"string"}}}},"required":["kind","content"]}}},{"type":"function","function":{"name":"nostr_query","description":"Query events from relays using a Nostr filter","parameters":{"type":"object","properties":{"filter":{"type":"object","description":"Nostr filter object (authors, kinds, ids, since, until, limit, and tag filters)"},"timeout_ms":{"type":"integer","description":"Optional query timeout in milliseconds"}},"required":["filter"]}}},{"type":"function","function":{"name":"local_shell_exec","description":"Execute a shell command and return stdout/stderr","parameters":{"type":"object","properties":{"command":{"type":"string","description":"Shell command to execute in the configured working directory"}},"required":["command"]}}},{"type":"function","function":{"name":"local_file_read","description":"Read a local file as text from the configured working directory","parameters":{"type":"object","properties":{"path":{"type":"string","description":"Path to file to read (relative to configured working directory)"},"max_bytes":{"type":"integer","description":"Optional maximum bytes to return"}},"required":["path"]}}},{"type":"function","function":{"name":"local_file_write","description":"Write text content to a local file in the configured working directory","parameters":{"type":"object","properties":{"path":{"type":"string","description":"Path to file to write (relative to configured working directory)"},"content":{"type":"string","description":"Text content to write"},"append":{"type":"boolean","description":"When true, append to file instead of overwriting"}},"required":["path","content"]}}},{"type":"function","function":{"name":"nostr_post_readme","description":"Publish README.md as kind 30023 with deterministic d tag readme.md","parameters":{"type":"object","properties":{},"required":[]}}},{"type":"function","function":{"name":"nostr_delete","description":"Request deletion of one or more previously published events (NIP-09 kind 5)","parameters":{"type":"object","properties":{"event_ids":{"type":"array","description":"Event IDs to request deletion for","items":{"type":"string"}},"kinds":{"type":"array","description":"Optional kinds corresponding to event_ids entries","items":{"type":"integer"}},"reason":{"type":"string","description":"Optional human-readable reason"}},"required":["event_ids"]}}},{"type":"function","function":{"name":"nostr_react","description":"React to a Nostr event with like/dislike/emoji (NIP-25 kind 7)","parameters":{"type":"object","properties":{"event_id":{"type":"string","description":"Target event ID to react to"},"event_pubkey":{"type":"string","description":"Author pubkey of target event"},"event_kind":{"type":"integer","description":"Optional kind of target event"},"reaction":{"type":"string","description":"Reaction content such as +, -, ❤️, or emoji"}},"required":["event_id","event_pubkey"]}}},{"type":"function","function":{"name":"nostr_profile_get","description":"Look up a Nostr profile (kind 0 metadata) by pubkey","parameters":{"type":"object","properties":{"pubkey":{"type":"string","description":"Hex pubkey of the profile to fetch"}},"...
[2026-03-25 13:47:53] [ERROR] [llm.c:93] [didactyl] llm http request failed: status=401
[2026-03-25 13:47:53] [WARN ] [llm.c:98] [didactyl] llm error response: {"error":{"code":"authentication_error","message":"Invalid Anthropic API Key","type":"invalid_request_error","param":null}}
[2026-03-25 13:47:53] [INFO ] [llm.c:76] [didactyl] llm request: method=POST url=https://api.anthropic.com/v1/chat/completions body_bytes=27522 body_preview={"model":"claude-haiku-4.5","max_tokens":512,"temperature":0.3,"messages":[{"role":"system","content":"# Test Agent\n\nYou are a test agent. Respond to requests and use tools when needed."},{"role":"user","content":"Send a test DM to yourself"},{"role":"user","content":"Send a test DM to yourself","_ts":1774460873}],"tools":[{"type":"function","function":{"name":"nostr_post","description":"Publish a Nostr event to connected relays","parameters":{"type":"object","properties":{"kind":{"type":"integer","description":"Nostr event kind number (for example 1 for note, 7 for reaction, 30023 for longform)"},"content":{"type":"string","description":"Event content/body text to publish"},"tags":{"type":"array","description":"Optional Nostr tags array, e.g. [[\"d\",\"my-skill\"],[\"t\",\"nostr\"]]","items":{"type":"array","items":{"type":"string"}}}},"required":["kind","content"]}}},{"type":"function","function":{"name":"nostr_query","description":"Query events from relays using a Nostr filter","parameters":{"type":"object","properties":{"filter":{"type":"object","description":"Nostr filter object (authors, kinds, ids, since, until, limit, and tag filters)"},"timeout_ms":{"type":"integer","description":"Optional query timeout in milliseconds"}},"required":["filter"]}}},{"type":"function","function":{"name":"local_shell_exec","description":"Execute a shell command and return stdout/stderr","parameters":{"type":"object","properties":{"command":{"type":"string","description":"Shell command to execute in the configured working directory"}},"required":["command"]}}},{"type":"function","function":{"name":"local_file_read","description":"Read a local file as text from the configured working directory","parameters":{"type":"object","properties":{"path":{"type":"string","description":"Path to file to read (relative to configured working directory)"},"max_bytes":{"type":"integer","description":"Optional maximum bytes to return"}},"required":["path"]}}},{"type":"function","function":{"name":"local_file_write","description":"Write text content to a local file in the configured working directory","parameters":{"type":"object","properties":{"path":{"type":"string","description":"Path to file to write (relative to configured working directory)"},"content":{"type":"string","description":"Text content to write"},"append":{"type":"boolean","description":"When true, append to file instead of overwriting"}},"required":["path","content"]}}},{"type":"function","function":{"name":"nostr_post_readme","description":"Publish README.md as kind 30023 with deterministic d tag readme.md","parameters":{"type":"object","properties":{},"required":[]}}},{"type":"function","function":{"name":"nostr_delete","description":"Request deletion of one or more previously published events (NIP-09 kind 5)","parameters":{"type":"object","properties":{"event_ids":{"type":"array","description":"Event IDs to request deletion for","items":{"type":"string"}},"kinds":{"type":"array","description":"Optional kinds corresponding to event_ids entries","items":{"type":"integer"}},"reason":{"type":"string","description":"Optional human-readable reason"}},"required":["event_ids"]}}},{"type":"function","function":{"name":"nostr_react","description":"React to a Nostr event with like/dislike/emoji (NIP-25 kind 7)","parameters":{"type":"object","properties":{"event_id":{"type":"string","description":"Target event ID to react to"},"event_pubkey":{"type":"string","description":"Author pubkey of target event"},"event_kind":{"type":"integer","description":"Optional kind of target event"},"reaction":{"type":"string","description":"Reaction content such as +, -, ❤️, or emoji"}},"required":["event_id","event_pubkey"]}}},{"type":"function","function":{"name":"nostr_profile_get","description":"Look up a Nostr profile (kind 0 metadata) by pubkey","parameters":{"type":"object","properties":{"pubkey":{"type":"string","description":"Hex pubkey of the profile to fetch"}},"required":["pubkey"]}}},{"type":"funct...
[2026-03-25 13:47:54] [ERROR] [llm.c:93] [didactyl] llm http request failed: status=401
[2026-03-25 13:47:54] [WARN ] [llm.c:98] [didactyl] llm error response: {"error":{"code":"authentication_error","message":"Invalid Anthropic API Key","type":"invalid_request_error","param":null}}
[2026-03-25 13:47:54] [INFO ] [llm.c:76] [didactyl] llm request: method=POST url=https://api.anthropic.com/v1/chat/completions body_bytes=27528 body_preview={"model":"claude-haiku-4.5","max_tokens":512,"temperature":0.3,"messages":[{"role":"system","content":"# Test Agent\n\nYou are a test agent. Respond to requests and use tools when needed."},{"role":"user","content":"Encode your pubkey as an npub"},{"role":"user","content":"Encode your pubkey as an npub","_ts":1774460874}],"tools":[{"type":"function","function":{"name":"nostr_post","description":"Publish a Nostr event to connected relays","parameters":{"type":"object","properties":{"kind":{"type":"integer","description":"Nostr event kind number (for example 1 for note, 7 for reaction, 30023 for longform)"},"content":{"type":"string","description":"Event content/body text to publish"},"tags":{"type":"array","description":"Optional Nostr tags array, e.g. [[\"d\",\"my-skill\"],[\"t\",\"nostr\"]]","items":{"type":"array","items":{"type":"string"}}}},"required":["kind","content"]}}},{"type":"function","function":{"name":"nostr_query","description":"Query events from relays using a Nostr filter","parameters":{"type":"object","properties":{"filter":{"type":"object","description":"Nostr filter object (authors, kinds, ids, since, until, limit, and tag filters)"},"timeout_ms":{"type":"integer","description":"Optional query timeout in milliseconds"}},"required":["filter"]}}},{"type":"function","function":{"name":"local_shell_exec","description":"Execute a shell command and return stdout/stderr","parameters":{"type":"object","properties":{"command":{"type":"string","description":"Shell command to execute in the configured working directory"}},"required":["command"]}}},{"type":"function","function":{"name":"local_file_read","description":"Read a local file as text from the configured working directory","parameters":{"type":"object","properties":{"path":{"type":"string","description":"Path to file to read (relative to configured working directory)"},"max_bytes":{"type":"integer","description":"Optional maximum bytes to return"}},"required":["path"]}}},{"type":"function","function":{"name":"local_file_write","description":"Write text content to a local file in the configured working directory","parameters":{"type":"object","properties":{"path":{"type":"string","description":"Path to file to write (relative to configured working directory)"},"content":{"type":"string","description":"Text content to write"},"append":{"type":"boolean","description":"When true, append to file instead of overwriting"}},"required":["path","content"]}}},{"type":"function","function":{"name":"nostr_post_readme","description":"Publish README.md as kind 30023 with deterministic d tag readme.md","parameters":{"type":"object","properties":{},"required":[]}}},{"type":"function","function":{"name":"nostr_delete","description":"Request deletion of one or more previously published events (NIP-09 kind 5)","parameters":{"type":"object","properties":{"event_ids":{"type":"array","description":"Event IDs to request deletion for","items":{"type":"string"}},"kinds":{"type":"array","description":"Optional kinds corresponding to event_ids entries","items":{"type":"integer"}},"reason":{"type":"string","description":"Optional human-readable reason"}},"required":["event_ids"]}}},{"type":"function","function":{"name":"nostr_react","description":"React to a Nostr event with like/dislike/emoji (NIP-25 kind 7)","parameters":{"type":"object","properties":{"event_id":{"type":"string","description":"Target event ID to react to"},"event_pubkey":{"type":"string","description":"Author pubkey of target event"},"event_kind":{"type":"integer","description":"Optional kind of target event"},"reaction":{"type":"string","description":"Reaction content such as +, -, ❤️, or emoji"}},"required":["event_id","event_pubkey"]}}},{"type":"function","function":{"name":"nostr_profile_get","description":"Look up a Nostr profile (kind 0 metadata) by pubkey","parameters":{"type":"object","properties":{"pubkey":{"type":"string","description":"Hex pubkey of the profile to fetch"}},"required":["pubkey"]}}},{"type":...
[2026-03-25 13:47:54] [ERROR] [llm.c:93] [didactyl] llm http request failed: status=401
[2026-03-25 13:47:54] [WARN ] [llm.c:98] [didactyl] llm error response: {"error":{"code":"authentication_error","message":"Invalid Anthropic API Key","type":"invalid_request_error","param":null}}
[2026-03-25 13:47:54] [INFO ] [llm.c:76] [didactyl] llm request: method=POST url=https://api.anthropic.com/v1/chat/completions body_bytes=27530 body_preview={"model":"claude-haiku-4.5","max_tokens":512,"temperature":0.3,"messages":[{"role":"system","content":"# Test Agent\n\nYou are a test agent. Respond to requests and use tools when needed."},{"role":"user","content":"Look up your own Nostr profile"},{"role":"user","content":"Look up your own Nostr profile","_ts":1774460874}],"tools":[{"type":"function","function":{"name":"nostr_post","description":"Publish a Nostr event to connected relays","parameters":{"type":"object","properties":{"kind":{"type":"integer","description":"Nostr event kind number (for example 1 for note, 7 for reaction, 30023 for longform)"},"content":{"type":"string","description":"Event content/body text to publish"},"tags":{"type":"array","description":"Optional Nostr tags array, e.g. [[\"d\",\"my-skill\"],[\"t\",\"nostr\"]]","items":{"type":"array","items":{"type":"string"}}}},"required":["kind","content"]}}},{"type":"function","function":{"name":"nostr_query","description":"Query events from relays using a Nostr filter","parameters":{"type":"object","properties":{"filter":{"type":"object","description":"Nostr filter object (authors, kinds, ids, since, until, limit, and tag filters)"},"timeout_ms":{"type":"integer","description":"Optional query timeout in milliseconds"}},"required":["filter"]}}},{"type":"function","function":{"name":"local_shell_exec","description":"Execute a shell command and return stdout/stderr","parameters":{"type":"object","properties":{"command":{"type":"string","description":"Shell command to execute in the configured working directory"}},"required":["command"]}}},{"type":"function","function":{"name":"local_file_read","description":"Read a local file as text from the configured working directory","parameters":{"type":"object","properties":{"path":{"type":"string","description":"Path to file to read (relative to configured working directory)"},"max_bytes":{"type":"integer","description":"Optional maximum bytes to return"}},"required":["path"]}}},{"type":"function","function":{"name":"local_file_write","description":"Write text content to a local file in the configured working directory","parameters":{"type":"object","properties":{"path":{"type":"string","description":"Path to file to write (relative to configured working directory)"},"content":{"type":"string","description":"Text content to write"},"append":{"type":"boolean","description":"When true, append to file instead of overwriting"}},"required":["path","content"]}}},{"type":"function","function":{"name":"nostr_post_readme","description":"Publish README.md as kind 30023 with deterministic d tag readme.md","parameters":{"type":"object","properties":{},"required":[]}}},{"type":"function","function":{"name":"nostr_delete","description":"Request deletion of one or more previously published events (NIP-09 kind 5)","parameters":{"type":"object","properties":{"event_ids":{"type":"array","description":"Event IDs to request deletion for","items":{"type":"string"}},"kinds":{"type":"array","description":"Optional kinds corresponding to event_ids entries","items":{"type":"integer"}},"reason":{"type":"string","description":"Optional human-readable reason"}},"required":["event_ids"]}}},{"type":"function","function":{"name":"nostr_react","description":"React to a Nostr event with like/dislike/emoji (NIP-25 kind 7)","parameters":{"type":"object","properties":{"event_id":{"type":"string","description":"Target event ID to react to"},"event_pubkey":{"type":"string","description":"Author pubkey of target event"},"event_kind":{"type":"integer","description":"Optional kind of target event"},"reaction":{"type":"string","description":"Reaction content such as +, -, ❤️, or emoji"}},"required":["event_id","event_pubkey"]}}},{"type":"function","function":{"name":"nostr_profile_get","description":"Look up a Nostr profile (kind 0 metadata) by pubkey","parameters":{"type":"object","properties":{"pubkey":{"type":"string","description":"Hex pubkey of the profile to fetch"}},"required":["pubkey"]}}},{"type...
[2026-03-25 13:47:55] [ERROR] [llm.c:93] [didactyl] llm http request failed: status=401
[2026-03-25 13:47:55] [WARN ] [llm.c:98] [didactyl] llm error response: {"error":{"code":"authentication_error","message":"Invalid Anthropic API Key","type":"invalid_request_error","param":null}}
[2026-03-25 13:47:55] [INFO ] [llm.c:76] [didactyl] llm request: method=POST url=https://api.anthropic.com/v1/chat/completions body_bytes=27522 body_preview={"model":"claude-haiku-4.5","max_tokens":512,"temperature":0.3,"messages":[{"role":"system","content":"# Test Agent\n\nYou are a test agent. Respond to requests and use tools when needed."},{"role":"user","content":"List your available skills"},{"role":"user","content":"List your available skills","_ts":1774460875}],"tools":[{"type":"function","function":{"name":"nostr_post","description":"Publish a Nostr event to connected relays","parameters":{"type":"object","properties":{"kind":{"type":"integer","description":"Nostr event kind number (for example 1 for note, 7 for reaction, 30023 for longform)"},"content":{"type":"string","description":"Event content/body text to publish"},"tags":{"type":"array","description":"Optional Nostr tags array, e.g. [[\"d\",\"my-skill\"],[\"t\",\"nostr\"]]","items":{"type":"array","items":{"type":"string"}}}},"required":["kind","content"]}}},{"type":"function","function":{"name":"nostr_query","description":"Query events from relays using a Nostr filter","parameters":{"type":"object","properties":{"filter":{"type":"object","description":"Nostr filter object (authors, kinds, ids, since, until, limit, and tag filters)"},"timeout_ms":{"type":"integer","description":"Optional query timeout in milliseconds"}},"required":["filter"]}}},{"type":"function","function":{"name":"local_shell_exec","description":"Execute a shell command and return stdout/stderr","parameters":{"type":"object","properties":{"command":{"type":"string","description":"Shell command to execute in the configured working directory"}},"required":["command"]}}},{"type":"function","function":{"name":"local_file_read","description":"Read a local file as text from the configured working directory","parameters":{"type":"object","properties":{"path":{"type":"string","description":"Path to file to read (relative to configured working directory)"},"max_bytes":{"type":"integer","description":"Optional maximum bytes to return"}},"required":["path"]}}},{"type":"function","function":{"name":"local_file_write","description":"Write text content to a local file in the configured working directory","parameters":{"type":"object","properties":{"path":{"type":"string","description":"Path to file to write (relative to configured working directory)"},"content":{"type":"string","description":"Text content to write"},"append":{"type":"boolean","description":"When true, append to file instead of overwriting"}},"required":["path","content"]}}},{"type":"function","function":{"name":"nostr_post_readme","description":"Publish README.md as kind 30023 with deterministic d tag readme.md","parameters":{"type":"object","properties":{},"required":[]}}},{"type":"function","function":{"name":"nostr_delete","description":"Request deletion of one or more previously published events (NIP-09 kind 5)","parameters":{"type":"object","properties":{"event_ids":{"type":"array","description":"Event IDs to request deletion for","items":{"type":"string"}},"kinds":{"type":"array","description":"Optional kinds corresponding to event_ids entries","items":{"type":"integer"}},"reason":{"type":"string","description":"Optional human-readable reason"}},"required":["event_ids"]}}},{"type":"function","function":{"name":"nostr_react","description":"React to a Nostr event with like/dislike/emoji (NIP-25 kind 7)","parameters":{"type":"object","properties":{"event_id":{"type":"string","description":"Target event ID to react to"},"event_pubkey":{"type":"string","description":"Author pubkey of target event"},"event_kind":{"type":"integer","description":"Optional kind of target event"},"reaction":{"type":"string","description":"Reaction content such as +, -, ❤️, or emoji"}},"required":["event_id","event_pubkey"]}}},{"type":"function","function":{"name":"nostr_profile_get","description":"Look up a Nostr profile (kind 0 metadata) by pubkey","parameters":{"type":"object","properties":{"pubkey":{"type":"string","description":"Hex pubkey of the profile to fetch"}},"required":["pubkey"]}}},{"type":"funct...
[2026-03-25 13:47:55] [ERROR] [llm.c:93] [didactyl] llm http request failed: status=401
[2026-03-25 13:47:55] [WARN ] [llm.c:98] [didactyl] llm error response: {"error":{"code":"authentication_error","message":"Invalid Anthropic API Key","type":"invalid_request_error","param":null}}
[2026-03-25 13:47:55] [INFO ] [llm.c:76] [didactyl] llm request: method=POST url=https://api.anthropic.com/v1/chat/completions body_bytes=27520 body_preview={"model":"claude-haiku-4.5","max_tokens":512,"temperature":0.3,"messages":[{"role":"system","content":"# Test Agent\n\nYou are a test agent. Respond to requests and use tools when needed."},{"role":"user","content":"List your active triggers"},{"role":"user","content":"List your active triggers","_ts":1774460875}],"tools":[{"type":"function","function":{"name":"nostr_post","description":"Publish a Nostr event to connected relays","parameters":{"type":"object","properties":{"kind":{"type":"integer","description":"Nostr event kind number (for example 1 for note, 7 for reaction, 30023 for longform)"},"content":{"type":"string","description":"Event content/body text to publish"},"tags":{"type":"array","description":"Optional Nostr tags array, e.g. [[\"d\",\"my-skill\"],[\"t\",\"nostr\"]]","items":{"type":"array","items":{"type":"string"}}}},"required":["kind","content"]}}},{"type":"function","function":{"name":"nostr_query","description":"Query events from relays using a Nostr filter","parameters":{"type":"object","properties":{"filter":{"type":"object","description":"Nostr filter object (authors, kinds, ids, since, until, limit, and tag filters)"},"timeout_ms":{"type":"integer","description":"Optional query timeout in milliseconds"}},"required":["filter"]}}},{"type":"function","function":{"name":"local_shell_exec","description":"Execute a shell command and return stdout/stderr","parameters":{"type":"object","properties":{"command":{"type":"string","description":"Shell command to execute in the configured working directory"}},"required":["command"]}}},{"type":"function","function":{"name":"local_file_read","description":"Read a local file as text from the configured working directory","parameters":{"type":"object","properties":{"path":{"type":"string","description":"Path to file to read (relative to configured working directory)"},"max_bytes":{"type":"integer","description":"Optional maximum bytes to return"}},"required":["path"]}}},{"type":"function","function":{"name":"local_file_write","description":"Write text content to a local file in the configured working directory","parameters":{"type":"object","properties":{"path":{"type":"string","description":"Path to file to write (relative to configured working directory)"},"content":{"type":"string","description":"Text content to write"},"append":{"type":"boolean","description":"When true, append to file instead of overwriting"}},"required":["path","content"]}}},{"type":"function","function":{"name":"nostr_post_readme","description":"Publish README.md as kind 30023 with deterministic d tag readme.md","parameters":{"type":"object","properties":{},"required":[]}}},{"type":"function","function":{"name":"nostr_delete","description":"Request deletion of one or more previously published events (NIP-09 kind 5)","parameters":{"type":"object","properties":{"event_ids":{"type":"array","description":"Event IDs to request deletion for","items":{"type":"string"}},"kinds":{"type":"array","description":"Optional kinds corresponding to event_ids entries","items":{"type":"integer"}},"reason":{"type":"string","description":"Optional human-readable reason"}},"required":["event_ids"]}}},{"type":"function","function":{"name":"nostr_react","description":"React to a Nostr event with like/dislike/emoji (NIP-25 kind 7)","parameters":{"type":"object","properties":{"event_id":{"type":"string","description":"Target event ID to react to"},"event_pubkey":{"type":"string","description":"Author pubkey of target event"},"event_kind":{"type":"integer","description":"Optional kind of target event"},"reaction":{"type":"string","description":"Reaction content such as +, -, ❤️, or emoji"}},"required":["event_id","event_pubkey"]}}},{"type":"function","function":{"name":"nostr_profile_get","description":"Look up a Nostr profile (kind 0 metadata) by pubkey","parameters":{"type":"object","properties":{"pubkey":{"type":"string","description":"Hex pubkey of the profile to fetch"}},"required":["pubkey"]}}},{"type":"functio...
[2026-03-25 13:47:56] [ERROR] [llm.c:93] [didactyl] llm http request failed: status=401
[2026-03-25 13:47:56] [WARN ] [llm.c:98] [didactyl] llm error response: {"error":{"code":"authentication_error","message":"Invalid Anthropic API Key","type":"invalid_request_error","param":null}}
[2026-03-25 13:47:56] [INFO ] [llm.c:76] [didactyl] llm request: method=POST url=https://api.anthropic.com/v1/chat/completions body_bytes=27638 body_preview={"model":"claude-haiku-4.5","max_tokens":512,"temperature":0.3,"messages":[{"role":"system","content":"# Test Agent\n\nYou are a test agent. Respond to requests and use tools when needed."},{"role":"user","content":"Create a test skill called test-harness-probe with content Test skill then remove it"},{"role":"user","content":"Create a test skill called test-harness-probe with content Test skill then remove it","_ts":1774460876}],"tools":[{"type":"function","function":{"name":"nostr_post","description":"Publish a Nostr event to connected relays","parameters":{"type":"object","properties":{"kind":{"type":"integer","description":"Nostr event kind number (for example 1 for note, 7 for reaction, 30023 for longform)"},"content":{"type":"string","description":"Event content/body text to publish"},"tags":{"type":"array","description":"Optional Nostr tags array, e.g. [[\"d\",\"my-skill\"],[\"t\",\"nostr\"]]","items":{"type":"array","items":{"type":"string"}}}},"required":["kind","content"]}}},{"type":"function","function":{"name":"nostr_query","description":"Query events from relays using a Nostr filter","parameters":{"type":"object","properties":{"filter":{"type":"object","description":"Nostr filter object (authors, kinds, ids, since, until, limit, and tag filters)"},"timeout_ms":{"type":"integer","description":"Optional query timeout in milliseconds"}},"required":["filter"]}}},{"type":"function","function":{"name":"local_shell_exec","description":"Execute a shell command and return stdout/stderr","parameters":{"type":"object","properties":{"command":{"type":"string","description":"Shell command to execute in the configured working directory"}},"required":["command"]}}},{"type":"function","function":{"name":"local_file_read","description":"Read a local file as text from the configured working directory","parameters":{"type":"object","properties":{"path":{"type":"string","description":"Path to file to read (relative to configured working directory)"},"max_bytes":{"type":"integer","description":"Optional maximum bytes to return"}},"required":["path"]}}},{"type":"function","function":{"name":"local_file_write","description":"Write text content to a local file in the configured working directory","parameters":{"type":"object","properties":{"path":{"type":"string","description":"Path to file to write (relative to configured working directory)"},"content":{"type":"string","description":"Text content to write"},"append":{"type":"boolean","description":"When true, append to file instead of overwriting"}},"required":["path","content"]}}},{"type":"function","function":{"name":"nostr_post_readme","description":"Publish README.md as kind 30023 with deterministic d tag readme.md","parameters":{"type":"object","properties":{},"required":[]}}},{"type":"function","function":{"name":"nostr_delete","description":"Request deletion of one or more previously published events (NIP-09 kind 5)","parameters":{"type":"object","properties":{"event_ids":{"type":"array","description":"Event IDs to request deletion for","items":{"type":"string"}},"kinds":{"type":"array","description":"Optional kinds corresponding to event_ids entries","items":{"type":"integer"}},"reason":{"type":"string","description":"Optional human-readable reason"}},"required":["event_ids"]}}},{"type":"function","function":{"name":"nostr_react","description":"React to a Nostr event with like/dislike/emoji (NIP-25 kind 7)","parameters":{"type":"object","properties":{"event_id":{"type":"string","description":"Target event ID to react to"},"event_pubkey":{"type":"string","description":"Author pubkey of target event"},"event_kind":{"type":"integer","description":"Optional kind of target event"},"reaction":{"type":"string","description":"Reaction content such as +, -, ❤️, or emoji"}},"required":["event_id","event_pubkey"]}}},{"type":"function","function":{"name":"nostr_profile_get","description":"Look up a Nostr profile (kind 0 metadata) by pubkey","parameters":{"type":"object","properties":{"p...
[2026-03-25 13:47:56] [ERROR] [llm.c:93] [didactyl] llm http request failed: status=401
[2026-03-25 13:47:56] [WARN ] [llm.c:98] [didactyl] llm error response: {"error":{"code":"authentication_error","message":"Invalid Anthropic API Key","type":"invalid_request_error","param":null}}
[2026-03-25 13:47:57] [INFO ] [llm.c:76] [didactyl] llm request: method=POST url=https://api.anthropic.com/v1/chat/completions body_bytes=27528 body_preview={"model":"claude-haiku-4.5","max_tokens":512,"temperature":0.3,"messages":[{"role":"system","content":"# Test Agent\n\nYou are a test agent. Respond to requests and use tools when needed."},{"role":"user","content":"List all your available tools"},{"role":"user","content":"List all your available tools","_ts":1774460877}],"tools":[{"type":"function","function":{"name":"nostr_post","description":"Publish a Nostr event to connected relays","parameters":{"type":"object","properties":{"kind":{"type":"integer","description":"Nostr event kind number (for example 1 for note, 7 for reaction, 30023 for longform)"},"content":{"type":"string","description":"Event content/body text to publish"},"tags":{"type":"array","description":"Optional Nostr tags array, e.g. [[\"d\",\"my-skill\"],[\"t\",\"nostr\"]]","items":{"type":"array","items":{"type":"string"}}}},"required":["kind","content"]}}},{"type":"function","function":{"name":"nostr_query","description":"Query events from relays using a Nostr filter","parameters":{"type":"object","properties":{"filter":{"type":"object","description":"Nostr filter object (authors, kinds, ids, since, until, limit, and tag filters)"},"timeout_ms":{"type":"integer","description":"Optional query timeout in milliseconds"}},"required":["filter"]}}},{"type":"function","function":{"name":"local_shell_exec","description":"Execute a shell command and return stdout/stderr","parameters":{"type":"object","properties":{"command":{"type":"string","description":"Shell command to execute in the configured working directory"}},"required":["command"]}}},{"type":"function","function":{"name":"local_file_read","description":"Read a local file as text from the configured working directory","parameters":{"type":"object","properties":{"path":{"type":"string","description":"Path to file to read (relative to configured working directory)"},"max_bytes":{"type":"integer","description":"Optional maximum bytes to return"}},"required":["path"]}}},{"type":"function","function":{"name":"local_file_write","description":"Write text content to a local file in the configured working directory","parameters":{"type":"object","properties":{"path":{"type":"string","description":"Path to file to write (relative to configured working directory)"},"content":{"type":"string","description":"Text content to write"},"append":{"type":"boolean","description":"When true, append to file instead of overwriting"}},"required":["path","content"]}}},{"type":"function","function":{"name":"nostr_post_readme","description":"Publish README.md as kind 30023 with deterministic d tag readme.md","parameters":{"type":"object","properties":{},"required":[]}}},{"type":"function","function":{"name":"nostr_delete","description":"Request deletion of one or more previously published events (NIP-09 kind 5)","parameters":{"type":"object","properties":{"event_ids":{"type":"array","description":"Event IDs to request deletion for","items":{"type":"string"}},"kinds":{"type":"array","description":"Optional kinds corresponding to event_ids entries","items":{"type":"integer"}},"reason":{"type":"string","description":"Optional human-readable reason"}},"required":["event_ids"]}}},{"type":"function","function":{"name":"nostr_react","description":"React to a Nostr event with like/dislike/emoji (NIP-25 kind 7)","parameters":{"type":"object","properties":{"event_id":{"type":"string","description":"Target event ID to react to"},"event_pubkey":{"type":"string","description":"Author pubkey of target event"},"event_kind":{"type":"integer","description":"Optional kind of target event"},"reaction":{"type":"string","description":"Reaction content such as +, -, ❤️, or emoji"}},"required":["event_id","event_pubkey"]}}},{"type":"function","function":{"name":"nostr_profile_get","description":"Look up a Nostr profile (kind 0 metadata) by pubkey","parameters":{"type":"object","properties":{"pubkey":{"type":"string","description":"Hex pubkey of the profile to fetch"}},"required":["pubkey"]}}},{"type":...
[2026-03-25 13:47:57] [ERROR] [llm.c:93] [didactyl] llm http request failed: status=401
[2026-03-25 13:47:57] [WARN ] [llm.c:98] [didactyl] llm error response: {"error":{"code":"authentication_error","message":"Invalid Anthropic API Key","type":"invalid_request_error","param":null}}
[2026-03-25 13:47:57] [INFO ] [llm.c:76] [didactyl] llm request: method=POST url=https://api.anthropic.com/v1/chat/completions body_bytes=27540 body_preview={"model":"claude-haiku-4.5","max_tokens":512,"temperature":0.3,"messages":[{"role":"system","content":"# Test Agent\n\nYou are a test agent. Respond to requests and use tools when needed."},{"role":"user","content":"What model are you currently using?"},{"role":"user","content":"What model are you currently using?","_ts":1774460877}],"tools":[{"type":"function","function":{"name":"nostr_post","description":"Publish a Nostr event to connected relays","parameters":{"type":"object","properties":{"kind":{"type":"integer","description":"Nostr event kind number (for example 1 for note, 7 for reaction, 30023 for longform)"},"content":{"type":"string","description":"Event content/body text to publish"},"tags":{"type":"array","description":"Optional Nostr tags array, e.g. [[\"d\",\"my-skill\"],[\"t\",\"nostr\"]]","items":{"type":"array","items":{"type":"string"}}}},"required":["kind","content"]}}},{"type":"function","function":{"name":"nostr_query","description":"Query events from relays using a Nostr filter","parameters":{"type":"object","properties":{"filter":{"type":"object","description":"Nostr filter object (authors, kinds, ids, since, until, limit, and tag filters)"},"timeout_ms":{"type":"integer","description":"Optional query timeout in milliseconds"}},"required":["filter"]}}},{"type":"function","function":{"name":"local_shell_exec","description":"Execute a shell command and return stdout/stderr","parameters":{"type":"object","properties":{"command":{"type":"string","description":"Shell command to execute in the configured working directory"}},"required":["command"]}}},{"type":"function","function":{"name":"local_file_read","description":"Read a local file as text from the configured working directory","parameters":{"type":"object","properties":{"path":{"type":"string","description":"Path to file to read (relative to configured working directory)"},"max_bytes":{"type":"integer","description":"Optional maximum bytes to return"}},"required":["path"]}}},{"type":"function","function":{"name":"local_file_write","description":"Write text content to a local file in the configured working directory","parameters":{"type":"object","properties":{"path":{"type":"string","description":"Path to file to write (relative to configured working directory)"},"content":{"type":"string","description":"Text content to write"},"append":{"type":"boolean","description":"When true, append to file instead of overwriting"}},"required":["path","content"]}}},{"type":"function","function":{"name":"nostr_post_readme","description":"Publish README.md as kind 30023 with deterministic d tag readme.md","parameters":{"type":"object","properties":{},"required":[]}}},{"type":"function","function":{"name":"nostr_delete","description":"Request deletion of one or more previously published events (NIP-09 kind 5)","parameters":{"type":"object","properties":{"event_ids":{"type":"array","description":"Event IDs to request deletion for","items":{"type":"string"}},"kinds":{"type":"array","description":"Optional kinds corresponding to event_ids entries","items":{"type":"integer"}},"reason":{"type":"string","description":"Optional human-readable reason"}},"required":["event_ids"]}}},{"type":"function","function":{"name":"nostr_react","description":"React to a Nostr event with like/dislike/emoji (NIP-25 kind 7)","parameters":{"type":"object","properties":{"event_id":{"type":"string","description":"Target event ID to react to"},"event_pubkey":{"type":"string","description":"Author pubkey of target event"},"event_kind":{"type":"integer","description":"Optional kind of target event"},"reaction":{"type":"string","description":"Reaction content such as +, -, ❤️, or emoji"}},"required":["event_id","event_pubkey"]}}},{"type":"function","function":{"name":"nostr_profile_get","description":"Look up a Nostr profile (kind 0 metadata) by pubkey","parameters":{"type":"object","properties":{"pubkey":{"type":"string","description":"Hex pubkey of the profile to fetch"}},"required":["pubkey"]...
[2026-03-25 13:47:58] [ERROR] [llm.c:93] [didactyl] llm http request failed: status=401
[2026-03-25 13:47:58] [WARN ] [llm.c:98] [didactyl] llm error response: {"error":{"code":"authentication_error","message":"Invalid Anthropic API Key","type":"invalid_request_error","param":null}}
[2026-03-25 13:47:58] [INFO ] [llm.c:76] [didactyl] llm request: method=POST url=https://api.anthropic.com/v1/chat/completions body_bytes=27512 body_preview={"model":"claude-haiku-4.5","max_tokens":512,"temperature":0.3,"messages":[{"role":"system","content":"# Test Agent\n\nYou are a test agent. Respond to requests and use tools when needed."},{"role":"user","content":"List available models"},{"role":"user","content":"List available models","_ts":1774460878}],"tools":[{"type":"function","function":{"name":"nostr_post","description":"Publish a Nostr event to connected relays","parameters":{"type":"object","properties":{"kind":{"type":"integer","description":"Nostr event kind number (for example 1 for note, 7 for reaction, 30023 for longform)"},"content":{"type":"string","description":"Event content/body text to publish"},"tags":{"type":"array","description":"Optional Nostr tags array, e.g. [[\"d\",\"my-skill\"],[\"t\",\"nostr\"]]","items":{"type":"array","items":{"type":"string"}}}},"required":["kind","content"]}}},{"type":"function","function":{"name":"nostr_query","description":"Query events from relays using a Nostr filter","parameters":{"type":"object","properties":{"filter":{"type":"object","description":"Nostr filter object (authors, kinds, ids, since, until, limit, and tag filters)"},"timeout_ms":{"type":"integer","description":"Optional query timeout in milliseconds"}},"required":["filter"]}}},{"type":"function","function":{"name":"local_shell_exec","description":"Execute a shell command and return stdout/stderr","parameters":{"type":"object","properties":{"command":{"type":"string","description":"Shell command to execute in the configured working directory"}},"required":["command"]}}},{"type":"function","function":{"name":"local_file_read","description":"Read a local file as text from the configured working directory","parameters":{"type":"object","properties":{"path":{"type":"string","description":"Path to file to read (relative to configured working directory)"},"max_bytes":{"type":"integer","description":"Optional maximum bytes to return"}},"required":["path"]}}},{"type":"function","function":{"name":"local_file_write","description":"Write text content to a local file in the configured working directory","parameters":{"type":"object","properties":{"path":{"type":"string","description":"Path to file to write (relative to configured working directory)"},"content":{"type":"string","description":"Text content to write"},"append":{"type":"boolean","description":"When true, append to file instead of overwriting"}},"required":["path","content"]}}},{"type":"function","function":{"name":"nostr_post_readme","description":"Publish README.md as kind 30023 with deterministic d tag readme.md","parameters":{"type":"object","properties":{},"required":[]}}},{"type":"function","function":{"name":"nostr_delete","description":"Request deletion of one or more previously published events (NIP-09 kind 5)","parameters":{"type":"object","properties":{"event_ids":{"type":"array","description":"Event IDs to request deletion for","items":{"type":"string"}},"kinds":{"type":"array","description":"Optional kinds corresponding to event_ids entries","items":{"type":"integer"}},"reason":{"type":"string","description":"Optional human-readable reason"}},"required":["event_ids"]}}},{"type":"function","function":{"name":"nostr_react","description":"React to a Nostr event with like/dislike/emoji (NIP-25 kind 7)","parameters":{"type":"object","properties":{"event_id":{"type":"string","description":"Target event ID to react to"},"event_pubkey":{"type":"string","description":"Author pubkey of target event"},"event_kind":{"type":"integer","description":"Optional kind of target event"},"reaction":{"type":"string","description":"Reaction content such as +, -, ❤️, or emoji"}},"required":["event_id","event_pubkey"]}}},{"type":"function","function":{"name":"nostr_profile_get","description":"Look up a Nostr profile (kind 0 metadata) by pubkey","parameters":{"type":"object","properties":{"pubkey":{"type":"string","description":"Hex pubkey of the profile to fetch"}},"required":["pubkey"]}}},{"type":"function","func...
[2026-03-25 13:47:58] [ERROR] [llm.c:93] [didactyl] llm http request failed: status=401
[2026-03-25 13:47:58] [WARN ] [llm.c:98] [didactyl] llm error response: {"error":{"code":"authentication_error","message":"Invalid Anthropic API Key","type":"invalid_request_error","param":null}}
[2026-03-25 13:47:58] [INFO ] [llm.c:76] [didactyl] llm request: method=POST url=https://api.anthropic.com/v1/chat/completions body_bytes=27528 body_preview={"model":"claude-haiku-4.5","max_tokens":512,"temperature":0.3,"messages":[{"role":"system","content":"# Test Agent\n\nYou are a test agent. Respond to requests and use tools when needed."},{"role":"user","content":"Fetch https://httpbin.org/get"},{"role":"user","content":"Fetch https://httpbin.org/get","_ts":1774460878}],"tools":[{"type":"function","function":{"name":"nostr_post","description":"Publish a Nostr event to connected relays","parameters":{"type":"object","properties":{"kind":{"type":"integer","description":"Nostr event kind number (for example 1 for note, 7 for reaction, 30023 for longform)"},"content":{"type":"string","description":"Event content/body text to publish"},"tags":{"type":"array","description":"Optional Nostr tags array, e.g. [[\"d\",\"my-skill\"],[\"t\",\"nostr\"]]","items":{"type":"array","items":{"type":"string"}}}},"required":["kind","content"]}}},{"type":"function","function":{"name":"nostr_query","description":"Query events from relays using a Nostr filter","parameters":{"type":"object","properties":{"filter":{"type":"object","description":"Nostr filter object (authors, kinds, ids, since, until, limit, and tag filters)"},"timeout_ms":{"type":"integer","description":"Optional query timeout in milliseconds"}},"required":["filter"]}}},{"type":"function","function":{"name":"local_shell_exec","description":"Execute a shell command and return stdout/stderr","parameters":{"type":"object","properties":{"command":{"type":"string","description":"Shell command to execute in the configured working directory"}},"required":["command"]}}},{"type":"function","function":{"name":"local_file_read","description":"Read a local file as text from the configured working directory","parameters":{"type":"object","properties":{"path":{"type":"string","description":"Path to file to read (relative to configured working directory)"},"max_bytes":{"type":"integer","description":"Optional maximum bytes to return"}},"required":["path"]}}},{"type":"function","function":{"name":"local_file_write","description":"Write text content to a local file in the configured working directory","parameters":{"type":"object","properties":{"path":{"type":"string","description":"Path to file to write (relative to configured working directory)"},"content":{"type":"string","description":"Text content to write"},"append":{"type":"boolean","description":"When true, append to file instead of overwriting"}},"required":["path","content"]}}},{"type":"function","function":{"name":"nostr_post_readme","description":"Publish README.md as kind 30023 with deterministic d tag readme.md","parameters":{"type":"object","properties":{},"required":[]}}},{"type":"function","function":{"name":"nostr_delete","description":"Request deletion of one or more previously published events (NIP-09 kind 5)","parameters":{"type":"object","properties":{"event_ids":{"type":"array","description":"Event IDs to request deletion for","items":{"type":"string"}},"kinds":{"type":"array","description":"Optional kinds corresponding to event_ids entries","items":{"type":"integer"}},"reason":{"type":"string","description":"Optional human-readable reason"}},"required":["event_ids"]}}},{"type":"function","function":{"name":"nostr_react","description":"React to a Nostr event with like/dislike/emoji (NIP-25 kind 7)","parameters":{"type":"object","properties":{"event_id":{"type":"string","description":"Target event ID to react to"},"event_pubkey":{"type":"string","description":"Author pubkey of target event"},"event_kind":{"type":"integer","description":"Optional kind of target event"},"reaction":{"type":"string","description":"Reaction content such as +, -, ❤️, or emoji"}},"required":["event_id","event_pubkey"]}}},{"type":"function","function":{"name":"nostr_profile_get","description":"Look up a Nostr profile (kind 0 metadata) by pubkey","parameters":{"type":"object","properties":{"pubkey":{"type":"string","description":"Hex pubkey of the profile to fetch"}},"required":["pubkey"]}}},{"type":...
[2026-03-25 13:47:59] [ERROR] [llm.c:93] [didactyl] llm http request failed: status=401
[2026-03-25 13:47:59] [WARN ] [llm.c:98] [didactyl] llm error response: {"error":{"code":"authentication_error","message":"Invalid Anthropic API Key","type":"invalid_request_error","param":null}}
[2026-03-25 13:47:59] [INFO ] [llm.c:76] [didactyl] llm request: method=POST url=https://api.anthropic.com/v1/chat/completions body_bytes=27634 body_preview={"model":"claude-haiku-4.5","max_tokens":512,"temperature":0.3,"messages":[{"role":"system","content":"# Test Agent\n\nYou are a test agent. Respond to requests and use tools when needed."},{"role":"user","content":"Store a test config with d_tag test_harness_probe containing hello, then recall it"},{"role":"user","content":"Store a test config with d_tag test_harness_probe containing hello, then recall it","_ts":1774460879}],"tools":[{"type":"function","function":{"name":"nostr_post","description":"Publish a Nostr event to connected relays","parameters":{"type":"object","properties":{"kind":{"type":"integer","description":"Nostr event kind number (for example 1 for note, 7 for reaction, 30023 for longform)"},"content":{"type":"string","description":"Event content/body text to publish"},"tags":{"type":"array","description":"Optional Nostr tags array, e.g. [[\"d\",\"my-skill\"],[\"t\",\"nostr\"]]","items":{"type":"array","items":{"type":"string"}}}},"required":["kind","content"]}}},{"type":"function","function":{"name":"nostr_query","description":"Query events from relays using a Nostr filter","parameters":{"type":"object","properties":{"filter":{"type":"object","description":"Nostr filter object (authors, kinds, ids, since, until, limit, and tag filters)"},"timeout_ms":{"type":"integer","description":"Optional query timeout in milliseconds"}},"required":["filter"]}}},{"type":"function","function":{"name":"local_shell_exec","description":"Execute a shell command and return stdout/stderr","parameters":{"type":"object","properties":{"command":{"type":"string","description":"Shell command to execute in the configured working directory"}},"required":["command"]}}},{"type":"function","function":{"name":"local_file_read","description":"Read a local file as text from the configured working directory","parameters":{"type":"object","properties":{"path":{"type":"string","description":"Path to file to read (relative to configured working directory)"},"max_bytes":{"type":"integer","description":"Optional maximum bytes to return"}},"required":["path"]}}},{"type":"function","function":{"name":"local_file_write","description":"Write text content to a local file in the configured working directory","parameters":{"type":"object","properties":{"path":{"type":"string","description":"Path to file to write (relative to configured working directory)"},"content":{"type":"string","description":"Text content to write"},"append":{"type":"boolean","description":"When true, append to file instead of overwriting"}},"required":["path","content"]}}},{"type":"function","function":{"name":"nostr_post_readme","description":"Publish README.md as kind 30023 with deterministic d tag readme.md","parameters":{"type":"object","properties":{},"required":[]}}},{"type":"function","function":{"name":"nostr_delete","description":"Request deletion of one or more previously published events (NIP-09 kind 5)","parameters":{"type":"object","properties":{"event_ids":{"type":"array","description":"Event IDs to request deletion for","items":{"type":"string"}},"kinds":{"type":"array","description":"Optional kinds corresponding to event_ids entries","items":{"type":"integer"}},"reason":{"type":"string","description":"Optional human-readable reason"}},"required":["event_ids"]}}},{"type":"function","function":{"name":"nostr_react","description":"React to a Nostr event with like/dislike/emoji (NIP-25 kind 7)","parameters":{"type":"object","properties":{"event_id":{"type":"string","description":"Target event ID to react to"},"event_pubkey":{"type":"string","description":"Author pubkey of target event"},"event_kind":{"type":"integer","description":"Optional kind of target event"},"reaction":{"type":"string","description":"Reaction content such as +, -, ❤️, or emoji"}},"required":["event_id","event_pubkey"]}}},{"type":"function","function":{"name":"nostr_profile_get","description":"Look up a Nostr profile (kind 0 metadata) by pubkey","parameters":{"type":"object","properties":{"pubke...
[2026-03-25 13:47:59] [ERROR] [llm.c:93] [didactyl] llm http request failed: status=401
[2026-03-25 13:47:59] [WARN ] [llm.c:98] [didactyl] llm error response: {"error":{"code":"authentication_error","message":"Invalid Anthropic API Key","type":"invalid_request_error","param":null}}
[2026-03-25 13:53:33] [INFO ] [main.c:1584] [didactyl] shutting down
[2026-03-25 13:53:33] [INFO ] [trigger_manager.c:1602] [didactyl] trigger manager cleaned up
[2026-03-25 13:53:33] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] SEND relay.damus.io:443: ["CLOSE", "pool_7_1774447041"]
[2026-03-25 13:53:33] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] SEND relay.primal.net:443: ["CLOSE", "pool_7_1774447041"]
[2026-03-25 13:53:33] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] SEND relay.damus.io:443: ["CLOSE", "pool_8_1774447041"]
[2026-03-25 13:53:33] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] SEND relay.primal.net:443: ["CLOSE", "pool_8_1774447041"]
[2026-03-25 13:53:33] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] SEND relay.damus.io:443: ["CLOSE", "pool_9_1774447041"]
[2026-03-25 13:53:33] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] SEND relay.primal.net:443: ["CLOSE", "pool_9_1774447041"]
[2026-03-25 13:53:33] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] SEND relay.damus.io:443: ["CLOSE", "pool_10_1774447041"]
[2026-03-25 13:53:33] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] SEND relay.primal.net:443: ["CLOSE", "pool_10_1774447041"]
[2026-03-25 13:53:33] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] SEND relay.damus.io:443: ["CLOSE", "pool_11_1774447041"]
[2026-03-25 13:53:33] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] SEND relay.primal.net:443: ["CLOSE", "pool_11_1774447041"]
[2026-03-25 13:53:33] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] SEND relay.damus.io:443: ["CLOSE", "pool_12_1774447041"]
[2026-03-25 13:53:33] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] SEND relay.primal.net:443: ["CLOSE", "pool_12_1774447041"]
[2026-03-25 13:53:33] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] SEND relay.damus.io:443: ["CLOSE", "pool_13_1774447041"]
[2026-03-25 13:53:33] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] SEND relay.primal.net:443: ["CLOSE", "pool_13_1774447041"]
[2026-03-25 13:53:33] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] SEND relay.damus.io:443: ["CLOSE", "pool_14_1774447041"]
[2026-03-25 13:53:33] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] SEND relay.primal.net:443: ["CLOSE", "pool_14_1774447041"]

View File

@@ -0,0 +1,53 @@
{
// TEST CONFIGURATION
// Use disposable keys/accounts only.
"key": {
"nsec": "d3011e59954403fb84729ab0e9fb239ba0f0238b3f353dfb5c08a32f4b3d21a1"
},
"admin": {
"pubkey": "254d7a7f68b4443f5430564eb3a726f09aea57d27e75ab2b8ef57176f9ca3dac"
},
"dm_protocol": "nip04",
"llm": {
"provider": "openai",
"api_key": "sk-REPLACE_WITH_API_KEY",
"model": "claude-haiku-4.5",
"base_url": "https://api.anthropic.com/v1",
"max_tokens": 512,
"temperature": 0.3
},
"api": {
"enabled": true,
"port": 8485,
"bind_address": "127.0.0.1"
},
"startup_events": [
{
"kind": 0,
"content_fields": {
"name": "Didactyl Test Agent",
"about": "Automated test instance"
},
"tags": []
},
{
"kind": 10002,
"content": "",
"tags": [
["r", "wss://relay.damus.io"],
["r", "wss://relay.primal.net"]
]
},
{
"kind": 31124,
"content": "# Test Agent\n\nYou are a test agent. Respond to requests and use tools when needed.",
"tags": [
["d", "identity_and_rules"],
["app", "didactyl"],
["scope", "private"],
["trigger", "dm"],
["filter", "{\"from\":\"admin\"}"]
]
}
]
}

View File

@@ -0,0 +1,796 @@
[2026-03-25 09:58:19] [INFO ] [main.c:1016] Didactyl v0.2.19 starting
[2026-03-25 09:58:19] [INFO ] [nostr_handler.c:2207] [didactyl] initializing relay pool with 2 relays
[2026-03-25 09:58:19] [INFO ] [nostr_handler.c:2231] [didactyl] added relay: wss://relay.damus.io
[2026-03-25 09:58:19] [INFO ] [nostr_handler.c:2231] [didactyl] added relay: wss://relay.primal.net
[2026-03-25 09:58:20] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] SEND relay.damus.io:443: ["REQ", "pool_1_1774447099", {
"kinds": [10000],
"authors": ["1eb171136dbb1ba695b2f14296adfe88a1f81d4220cc7d186b0e139b8ce0cdbc"],
"limit": 1
}]
[2026-03-25 09:58:21] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] SEND relay.primal.net:443: ["REQ", "pool_1_1774447099", {
"kinds": [10000],
"authors": ["1eb171136dbb1ba695b2f14296adfe88a1f81d4220cc7d186b0e139b8ce0cdbc"],
"limit": 1
}]
[2026-03-25 09:58:21] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] RECV relay.damus.io:443: ["EOSE","pool_1_1774447099"]
[2026-03-25 09:58:21] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] RECV relay.primal.net:443: ["EOSE","pool_1_1774447099"]
[2026-03-25 09:58:21] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] SEND relay.damus.io:443: ["CLOSE", "pool_1_1774447099"]
[2026-03-25 09:58:21] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] SEND relay.primal.net:443: ["CLOSE", "pool_1_1774447099"]
[2026-03-25 09:58:21] [INFO ] [main.c:248] [didactyl] startup checklist [01] Relay connectivity: begin
[2026-03-25 09:58:21] [INFO ] [main.c:255] [didactyl] startup checklist [01] Relay connectivity: ok (connected relays: 2/2)
[2026-03-25 09:58:21] [INFO ] [main.c:248] [didactyl] startup checklist [02] Recover runtime config from Nostr: begin
[2026-03-25 09:58:21] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] SEND relay.damus.io:443: ["REQ", "pool_2_1774447101", {
"kinds": [30078],
"authors": ["1eb171136dbb1ba695b2f14296adfe88a1f81d4220cc7d186b0e139b8ce0cdbc"],
"#d": ["agent_config"],
"limit": 1
}]
[2026-03-25 09:58:21] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] SEND relay.primal.net:443: ["REQ", "pool_2_1774447101", {
"kinds": [30078],
"authors": ["1eb171136dbb1ba695b2f14296adfe88a1f81d4220cc7d186b0e139b8ce0cdbc"],
"#d": ["agent_config"],
"limit": 1
}]
[2026-03-25 09:58:21] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] RECV relay.damus.io:443: ["EOSE","pool_2_1774447101"]
[2026-03-25 09:58:21] [TRACE] [nostr_handler.c:162] [didactyl] [nostr:websocket] RECV <large EVENT frame suppressed, bytes=702>
[2026-03-25 09:58:21] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] RECV relay.primal.net:443: ["EOSE","pool_2_1774447101"]
[2026-03-25 09:58:21] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] SEND relay.damus.io:443: ["CLOSE", "pool_2_1774447101"]
[2026-03-25 09:58:21] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] SEND relay.primal.net:443: ["CLOSE", "pool_2_1774447101"]
[2026-03-25 09:58:21] [INFO ] [main.c:258] [didactyl] startup checklist [02] Recover runtime config from Nostr: ok
[2026-03-25 09:58:21] [INFO ] [main.c:248] [didactyl] startup checklist [03] Validate LLM config: begin
[2026-03-25 09:58:21] [INFO ] [main.c:258] [didactyl] startup checklist [03] Validate LLM config: ok
[2026-03-25 09:58:21] [INFO ] [main.c:248] [didactyl] startup checklist [04] Validate admin config: begin
[2026-03-25 09:58:21] [INFO ] [main.c:258] [didactyl] startup checklist [04] Validate admin config: ok
[2026-03-25 09:58:21] [INFO ] [main.c:248] [didactyl] startup checklist [05] Initialize LLM client: begin
[2026-03-25 09:58:21] [INFO ] [main.c:258] [didactyl] startup checklist [05] Initialize LLM client: ok
[2026-03-25 09:58:21] [INFO ] [main.c:248] [didactyl] startup checklist [06] Detect first run via kind 10002: begin
[2026-03-25 09:58:21] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] SEND relay.damus.io:443: ["REQ", "pool_3_1774447101", {
"kinds": [10002],
"authors": ["1eb171136dbb1ba695b2f14296adfe88a1f81d4220cc7d186b0e139b8ce0cdbc"],
"limit": 1
}]
[2026-03-25 09:58:21] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] SEND relay.primal.net:443: ["REQ", "pool_3_1774447101", {
"kinds": [10002],
"authors": ["1eb171136dbb1ba695b2f14296adfe88a1f81d4220cc7d186b0e139b8ce0cdbc"],
"limit": 1
}]
[2026-03-25 09:58:21] [TRACE] [nostr_handler.c:162] [didactyl] [nostr:websocket] RECV <large EVENT frame suppressed, bytes=460>
[2026-03-25 09:58:21] [TRACE] [nostr_handler.c:162] [didactyl] [nostr:websocket] RECV <large EVENT frame suppressed, bytes=462>
[2026-03-25 09:58:21] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] RECV relay.damus.io:443: ["EOSE","pool_3_1774447101"]
[2026-03-25 09:58:21] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] RECV relay.primal.net:443: ["EOSE","pool_3_1774447101"]
[2026-03-25 09:58:21] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] SEND relay.damus.io:443: ["CLOSE", "pool_3_1774447101"]
[2026-03-25 09:58:21] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] SEND relay.primal.net:443: ["CLOSE", "pool_3_1774447101"]
[2026-03-25 09:58:21] [INFO ] [main.c:1245] [didactyl] startup phase: first-run detection via kind 10002 => subsequent-run
[2026-03-25 09:58:21] [INFO ] [main.c:255] [didactyl] startup checklist [06] Detect first run via kind 10002: ok (subsequent-run)
[2026-03-25 09:58:21] [INFO ] [main.c:248] [didactyl] startup checklist [07] Reconcile/persist startup state: begin
[2026-03-25 09:58:21] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] SEND relay.damus.io:443: ["REQ", "pool_4_1774447101", {
"kinds": [1],
"authors": ["1eb171136dbb1ba695b2f14296adfe88a1f81d4220cc7d186b0e139b8ce0cdbc"],
"limit": 1
}]
[2026-03-25 09:58:21] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] SEND relay.primal.net:443: ["REQ", "pool_4_1774447101", {
"kinds": [1],
"authors": ["1eb171136dbb1ba695b2f14296adfe88a1f81d4220cc7d186b0e139b8ce0cdbc"],
"limit": 1
}]
[2026-03-25 09:58:22] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] RECV relay.damus.io:443: ["EOSE","pool_4_1774447101"]
[2026-03-25 09:58:22] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] RECV relay.primal.net:443: ["EOSE","pool_4_1774447101"]
[2026-03-25 09:58:22] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] SEND relay.damus.io:443: ["CLOSE", "pool_4_1774447101"]
[2026-03-25 09:58:22] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] SEND relay.primal.net:443: ["CLOSE", "pool_4_1774447101"]
[2026-03-25 09:58:22] [TRACE] [nostr_handler.c:162] [didactyl] [nostr:websocket] SEND <large EVENT frame suppressed, bytes=480>
[2026-03-25 09:58:22] [INFO ] [nostr_handler.c:2949] [didactyl] kind 0 event published to wss://relay.damus.io (async, reason=startup_reconcile)
[2026-03-25 09:58:22] [TRACE] [nostr_handler.c:162] [didactyl] [nostr:websocket] SEND <large EVENT frame suppressed, bytes=474>
[2026-03-25 09:58:22] [INFO ] [nostr_handler.c:2949] [didactyl] kind 10002 event published to wss://relay.damus.io (async, reason=startup_reconcile)
[2026-03-25 09:58:22] [TRACE] [nostr_handler.c:162] [didactyl] [nostr:websocket] SEND <large EVENT frame suppressed, bytes=621>
[2026-03-25 09:58:22] [INFO ] [nostr_handler.c:2949] [didactyl] kind 31124 event published to wss://relay.damus.io (async, reason=startup_reconcile)
[2026-03-25 09:58:22] [TRACE] [nostr_handler.c:162] [didactyl] [nostr:websocket] SEND <large EVENT frame suppressed, bytes=553>
[2026-03-25 09:58:22] [INFO ] [nostr_handler.c:2949] [didactyl] kind 10123 event published to wss://relay.damus.io (async, reason=startup_reconcile)
[2026-03-25 09:58:22] [TRACE] [nostr_handler.c:162] [didactyl] [nostr:websocket] SEND <large EVENT frame suppressed, bytes=482>
[2026-03-25 09:58:22] [INFO ] [nostr_handler.c:2949] [didactyl] kind 0 event published to wss://relay.primal.net (async, reason=startup_reconcile)
[2026-03-25 09:58:22] [TRACE] [nostr_handler.c:162] [didactyl] [nostr:websocket] SEND <large EVENT frame suppressed, bytes=476>
[2026-03-25 09:58:22] [INFO ] [nostr_handler.c:2949] [didactyl] kind 10002 event published to wss://relay.primal.net (async, reason=startup_reconcile)
[2026-03-25 09:58:22] [TRACE] [nostr_handler.c:162] [didactyl] [nostr:websocket] SEND <large EVENT frame suppressed, bytes=623>
[2026-03-25 09:58:22] [INFO ] [nostr_handler.c:2949] [didactyl] kind 31124 event published to wss://relay.primal.net (async, reason=startup_reconcile)
[2026-03-25 09:58:22] [TRACE] [nostr_handler.c:162] [didactyl] [nostr:websocket] SEND <large EVENT frame suppressed, bytes=555>
[2026-03-25 09:58:22] [INFO ] [nostr_handler.c:2949] [didactyl] kind 10123 event published to wss://relay.primal.net (async, reason=startup_reconcile)
[2026-03-25 09:58:22] [INFO ] [nostr_handler.c:3285] [didactyl] startup publish detail: kind=0 (profile) -> wss://relay.damus.io, wss://relay.primal.net
[2026-03-25 09:58:22] [INFO ] [nostr_handler.c:3285] [didactyl] startup publish detail: kind=10002 (relay_list) -> wss://relay.damus.io, wss://relay.primal.net
[2026-03-25 09:58:22] [INFO ] [nostr_handler.c:3285] [didactyl] startup publish detail: kind=31124 (skill) -> wss://relay.damus.io, wss://relay.primal.net
[2026-03-25 09:58:22] [INFO ] [nostr_handler.c:3285] [didactyl] startup publish detail: kind=10123 (adoption_list) -> wss://relay.damus.io, wss://relay.primal.net
[2026-03-25 09:58:22] [INFO ] [nostr_handler.c:3297] [didactyl] startup publish summary: 4/4 event(s) published to at least one relay; relays used=2/2
[2026-03-25 09:58:22] [INFO ] [nostr_handler.c:906] [didactyl] publish kind event target relays (2):
[2026-03-25 09:58:22] [INFO ] [nostr_handler.c:908] [didactyl] -> wss://relay.damus.io
[2026-03-25 09:58:22] [INFO ] [nostr_handler.c:908] [didactyl] -> wss://relay.primal.net
[2026-03-25 09:58:22] [TRACE] [nostr_handler.c:162] [didactyl] [nostr:websocket] SEND <large EVENT frame suppressed, bytes=800>
[2026-03-25 09:58:22] [TRACE] [nostr_handler.c:162] [didactyl] [nostr:websocket] SEND <large EVENT frame suppressed, bytes=802>
[2026-03-25 09:58:22] [INFO ] [nostr_handler.c:2949] [didactyl] kind 30078 event published to wss://relay.damus.io (async, reason=manual_publish)
[2026-03-25 09:58:22] [INFO ] [nostr_handler.c:2949] [didactyl] kind 30078 event published to wss://relay.primal.net (async, reason=manual_publish)
[2026-03-25 09:58:22] [INFO ] [nostr_handler.c:3012] [didactyl] published kind 30078 event via 2 connected relay(s)
[2026-03-25 09:58:22] [INFO ] [nostr_handler.c:906] [didactyl] publish kind event target relays (2):
[2026-03-25 09:58:22] [INFO ] [nostr_handler.c:908] [didactyl] -> wss://relay.damus.io
[2026-03-25 09:58:22] [INFO ] [nostr_handler.c:908] [didactyl] -> wss://relay.primal.net
[2026-03-25 09:58:22] [TRACE] [nostr_handler.c:162] [didactyl] [nostr:websocket] SEND <large EVENT frame suppressed, bytes=714>
[2026-03-25 09:58:22] [TRACE] [nostr_handler.c:162] [didactyl] [nostr:websocket] SEND <large EVENT frame suppressed, bytes=716>
[2026-03-25 09:58:22] [INFO ] [nostr_handler.c:2949] [didactyl] kind 30078 event published to wss://relay.damus.io (async, reason=manual_publish)
[2026-03-25 09:58:22] [INFO ] [nostr_handler.c:2949] [didactyl] kind 30078 event published to wss://relay.primal.net (async, reason=manual_publish)
[2026-03-25 09:58:22] [INFO ] [nostr_handler.c:3012] [didactyl] published kind 30078 event via 2 connected relay(s)
[2026-03-25 09:58:22] [INFO ] [main.c:1267] [didactyl] startup phase: persisted encrypted runtime config to Nostr
[2026-03-25 09:58:22] [INFO ] [main.c:258] [didactyl] startup checklist [07] Reconcile/persist startup state: ok
[2026-03-25 09:58:22] [INFO ] [main.c:248] [didactyl] startup checklist [08] Initialize agent: begin
[2026-03-25 09:58:22] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] SEND relay.damus.io:443: ["REQ", "pool_5_1774447102", {
"kinds": [30078],
"authors": ["1eb171136dbb1ba695b2f14296adfe88a1f81d4220cc7d186b0e139b8ce0cdbc"],
"#d": ["memory"],
"limit": 1
}]
[2026-03-25 09:58:22] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] SEND relay.primal.net:443: ["REQ", "pool_5_1774447102", {
"kinds": [30078],
"authors": ["1eb171136dbb1ba695b2f14296adfe88a1f81d4220cc7d186b0e139b8ce0cdbc"],
"#d": ["memory"],
"limit": 1
}]
[2026-03-25 09:58:22] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] RECV relay.primal.net:443: ["OK","81c4d21d745b7da146490d655be24b808c1349e5fc42db5b8b74c24421a2a549",true,""]
[2026-03-25 09:58:22] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] RECV relay.damus.io:443: ["OK","81c4d21d745b7da146490d655be24b808c1349e5fc42db5b8b74c24421a2a549",true,""]
[2026-03-25 09:58:22] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] RECV relay.primal.net:443: ["OK","82c974f1ea158c6067868c9f90179d367f4cf45f77dad5737ee161b63bc3f115",true,""]
[2026-03-25 09:58:22] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] RECV relay.damus.io:443: ["OK","82c974f1ea158c6067868c9f90179d367f4cf45f77dad5737ee161b63bc3f115",true,""]
[2026-03-25 09:58:22] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] RECV relay.primal.net:443: ["OK","832e2a43d2325d8e538fb4fec67dfcdb9f42223cd43a289a477c3fd1bd0ae259",true,""]
[2026-03-25 09:58:22] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] RECV relay.damus.io:443: ["OK","832e2a43d2325d8e538fb4fec67dfcdb9f42223cd43a289a477c3fd1bd0ae259",true,""]
[2026-03-25 09:58:22] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] RECV relay.primal.net:443: ["OK","d1fc3cfb4b7db93639baee6726e7203105ac4bc630446feb62f0e9d03cd694d2",true,""]
[2026-03-25 09:58:22] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] RECV relay.damus.io:443: ["OK","d1fc3cfb4b7db93639baee6726e7203105ac4bc630446feb62f0e9d03cd694d2",true,""]
[2026-03-25 09:58:22] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] RECV relay.primal.net:443: ["EOSE","pool_5_1774447102"]
[2026-03-25 09:58:22] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] RECV relay.damus.io:443: ["EOSE","pool_5_1774447102"]
[2026-03-25 09:58:22] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] RECV relay.primal.net:443: ["OK","13a4851fae898a5feb18d927080c35a38e3d3db27ea08180b9fa73fdc43db237",true,""]
[2026-03-25 09:58:22] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] SEND relay.damus.io:443: ["CLOSE", "pool_5_1774447102"]
[2026-03-25 09:58:22] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] SEND relay.primal.net:443: ["CLOSE", "pool_5_1774447102"]
[2026-03-25 09:58:22] [INFO ] [main.c:258] [didactyl] startup checklist [08] Initialize agent: ok
[2026-03-25 09:58:22] [INFO ] [main.c:248] [didactyl] startup checklist [09] Initialize trigger manager: begin
[2026-03-25 09:58:22] [INFO ] [trigger_manager.c:814] [didactyl] trigger manager initialized (capacity=16)
[2026-03-25 09:58:22] [INFO ] [main.c:258] [didactyl] startup checklist [09] Initialize trigger manager: ok
[2026-03-25 09:58:22] [INFO ] [main.c:1308] [didactyl] startup phase: deferred trigger load will run after self-skill EOSE
[2026-03-25 09:58:22] [INFO ] [main.c:248] [didactyl] startup checklist [10] Load startup triggers: begin
[2026-03-25 09:58:22] [INFO ] [main.c:1311] [didactyl] startup phase: startup-config trigger load begin
[2026-03-25 09:58:22] [INFO ] [trigger_manager.c:1138] [didactyl] trigger added d_tag=identity_and_rules action=0 enabled=1
[2026-03-25 09:58:22] [INFO ] [trigger_manager.c:1021] [didactyl] startup trigger registered d_tag=identity_and_rules action=llm enabled=1
[2026-03-25 09:58:22] [INFO ] [trigger_manager.c:1029] [didactyl] trigger manager loaded 1 trigger(s) from startup config (considered=1)
[2026-03-25 09:58:22] [INFO ] [main.c:1315] [didactyl] startup phase: startup-config trigger load end
[2026-03-25 09:58:22] [INFO ] [main.c:258] [didactyl] startup checklist [10] Load startup triggers: ok
[2026-03-25 09:58:22] [INFO ] [main.c:248] [didactyl] startup checklist [11] Discover self relay list via kind 10002: begin
[2026-03-25 09:58:22] [INFO ] [main.c:327] [didactyl] kind10002 query begin: timeout_ms=5000 author=1eb171136dbb1ba6... relay_count=2
[2026-03-25 09:58:22] [INFO ] [main.c:334] [didactyl] kind10002 query relay snapshot: {"relay_count":2,"connected_count":2,"relays":[{"url":"wss://relay.damus.io","status":"connected","events_received":1,"events_published":6,"events_published_ok":4,"events_published_failed":0,"ping_latency_current":0,"ping_latency_avg":0,"query_latency_avg":0,"publish_latency_avg":0,"connection_uptime_start":1774447099,"last_event_time":1774447102},{"url":"wss://relay.primal.net","status":"connected","events_received":1,"events_published":6,"events_published_ok":5,"events_published_failed":0,"ping_latency_current":0,"ping_latency_avg":0,"query_latency_avg":0,"publish_latency_avg":0,"connection_uptime_start":1774447099,"last_event_time":1774447102}]}
[2026-03-25 09:58:22] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] SEND relay.damus.io:443: ["REQ", "pool_6_1774447102", {
"kinds": [10002],
"authors": ["1eb171136dbb1ba695b2f14296adfe88a1f81d4220cc7d186b0e139b8ce0cdbc"],
"limit": 16
}]
[2026-03-25 09:58:22] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] SEND relay.primal.net:443: ["REQ", "pool_6_1774447102", {
"kinds": [10002],
"authors": ["1eb171136dbb1ba695b2f14296adfe88a1f81d4220cc7d186b0e139b8ce0cdbc"],
"limit": 16
}]
[2026-03-25 09:58:22] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] RECV relay.damus.io:443: ["OK","13a4851fae898a5feb18d927080c35a38e3d3db27ea08180b9fa73fdc43db237",false,"rate-limited: you are noting too much"]
[2026-03-25 09:58:22] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] RECV relay.primal.net:443: ["OK","8d0da07c478e967a1cd8a07fc9f52bfe1718acbc18cba85d028a3afb4c106571",true,""]
[2026-03-25 09:58:22] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] RECV relay.damus.io:443: ["OK","8d0da07c478e967a1cd8a07fc9f52bfe1718acbc18cba85d028a3afb4c106571",true,""]
[2026-03-25 09:58:22] [TRACE] [nostr_handler.c:162] [didactyl] [nostr:websocket] RECV <large EVENT frame suppressed, bytes=462>
[2026-03-25 09:58:22] [TRACE] [nostr_handler.c:162] [didactyl] [nostr:websocket] RECV <large EVENT frame suppressed, bytes=460>
[2026-03-25 09:58:22] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] RECV relay.primal.net:443: ["EOSE","pool_6_1774447102"]
[2026-03-25 09:58:22] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] RECV relay.damus.io:443: ["EOSE","pool_6_1774447102"]
[2026-03-25 09:58:22] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] SEND relay.damus.io:443: ["CLOSE", "pool_6_1774447102"]
[2026-03-25 09:58:22] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] SEND relay.primal.net:443: ["CLOSE", "pool_6_1774447102"]
[2026-03-25 09:58:22] [INFO ] [main.c:354] [didactyl] kind10002 query received event_count=1
[2026-03-25 09:58:22] [INFO ] [main.c:451] [didactyl] kind10002 query extracted relays=["wss://relay.damus.io","wss://relay.primal.net"]
[2026-03-25 09:58:22] [INFO ] [main.c:556] [didactyl] kind10002 wait success: relay_count=2
[2026-03-25 09:58:22] [INFO ] [main.c:558] [didactyl] kind10002 relay[0]=wss://relay.damus.io
[2026-03-25 09:58:22] [INFO ] [main.c:558] [didactyl] kind10002 relay[1]=wss://relay.primal.net
[2026-03-25 09:58:22] [INFO ] [main.c:562] [didactyl] kind10002 wait success relay snapshot: {"relay_count":2,"connected_count":2,"relays":[{"url":"wss://relay.damus.io","status":"connected","events_received":1,"events_published":6,"events_published_ok":5,"events_published_failed":1,"ping_latency_current":0,"ping_latency_avg":0,"query_latency_avg":0,"publish_latency_avg":0,"connection_uptime_start":1774447099,"last_event_time":1774447102,"last_publish_error":"rate-limited: you are noting too much"},{"url":"wss://relay.primal.net","status":"connected","events_received":2,"events_published":6,"events_published_ok":6,"events_published_failed":0,"ping_latency_current":0,"ping_latency_avg":0,"query_latency_avg":0,"publish_latency_avg":0,"connection_uptime_start":1774447099,"last_event_time":1774447102}]}
[2026-03-25 09:58:22] [INFO ] [main.c:255] [didactyl] startup checklist [11] Discover self relay list via kind 10002: ok (kind10002=2 added=0 connected=2/2)
[2026-03-25 09:58:22] [INFO ] [main.c:248] [didactyl] startup checklist [12] Subscribe admin context: begin
[2026-03-25 09:58:22] [INFO ] [main.c:1366] [didactyl] startup phase: subscribe admin context begin
[2026-03-25 09:58:22] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] SEND relay.damus.io:443: ["REQ", "pool_7_1774447102", {
"kinds": [0, 3, 10002],
"authors": ["254d7a7f68b4443f5430564eb3a726f09aea57d27e75ab2b8ef57176f9ca3dac"],
"limit": 32
}]
[2026-03-25 09:58:22] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] SEND relay.primal.net:443: ["REQ", "pool_7_1774447102", {
"kinds": [0, 3, 10002],
"authors": ["254d7a7f68b4443f5430564eb3a726f09aea57d27e75ab2b8ef57176f9ca3dac"],
"limit": 32
}]
[2026-03-25 09:58:22] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] SEND relay.damus.io:443: ["REQ", "pool_8_1774447102", {
"kinds": [1],
"authors": ["254d7a7f68b4443f5430564eb3a726f09aea57d27e75ab2b8ef57176f9ca3dac"],
"limit": 10
}]
[2026-03-25 09:58:22] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] SEND relay.primal.net:443: ["REQ", "pool_8_1774447102", {
"kinds": [1],
"authors": ["254d7a7f68b4443f5430564eb3a726f09aea57d27e75ab2b8ef57176f9ca3dac"],
"limit": 10
}]
[2026-03-25 09:58:22] [INFO ] [nostr_handler.c:2352] [didactyl] admin context subscriptions active for admin 254d7a7f68b4443f...
[2026-03-25 09:58:22] [INFO ] [main.c:1370] [didactyl] startup phase: subscribe admin context end
[2026-03-25 09:58:22] [INFO ] [main.c:258] [didactyl] startup checklist [12] Subscribe admin context: ok
[2026-03-25 09:58:22] [INFO ] [main.c:248] [didactyl] startup checklist [13] Subscribe agent self context: begin
[2026-03-25 09:58:22] [INFO ] [main.c:1374] [didactyl] startup phase: subscribe agent self context begin
[2026-03-25 09:58:22] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] SEND relay.damus.io:443: ["REQ", "pool_9_1774447102", {
"kinds": [0, 3, 10002],
"authors": ["1eb171136dbb1ba695b2f14296adfe88a1f81d4220cc7d186b0e139b8ce0cdbc"],
"limit": 64
}]
[2026-03-25 09:58:22] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] SEND relay.primal.net:443: ["REQ", "pool_9_1774447102", {
"kinds": [0, 3, 10002],
"authors": ["1eb171136dbb1ba695b2f14296adfe88a1f81d4220cc7d186b0e139b8ce0cdbc"],
"limit": 64
}]
[2026-03-25 09:58:22] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] SEND relay.damus.io:443: ["REQ", "pool_10_1774447102", {
"kinds": [1],
"authors": ["1eb171136dbb1ba695b2f14296adfe88a1f81d4220cc7d186b0e139b8ce0cdbc"],
"limit": 10
}]
[2026-03-25 09:58:22] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] SEND relay.primal.net:443: ["REQ", "pool_10_1774447102", {
"kinds": [1],
"authors": ["1eb171136dbb1ba695b2f14296adfe88a1f81d4220cc7d186b0e139b8ce0cdbc"],
"limit": 10
}]
[2026-03-25 09:58:22] [INFO ] [nostr_handler.c:2440] [didactyl] agent self-context subscriptions active for pubkey 1eb171136dbb1ba6...
[2026-03-25 09:58:22] [INFO ] [main.c:1378] [didactyl] startup phase: subscribe agent self context end
[2026-03-25 09:58:22] [INFO ] [main.c:258] [didactyl] startup checklist [13] Subscribe agent self context: ok
[2026-03-25 09:58:22] [INFO ] [main.c:248] [didactyl] startup checklist [14] Subscribe self-skill cache: begin
[2026-03-25 09:58:22] [INFO ] [main.c:1382] [didactyl] startup phase: subscribe self skill cache begin
[2026-03-25 09:58:22] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] SEND relay.damus.io:443: ["REQ", "pool_11_1774447102", {
"kinds": [31123, 31124, 10123],
"authors": ["1eb171136dbb1ba695b2f14296adfe88a1f81d4220cc7d186b0e139b8ce0cdbc"],
"limit": 300
}]
[2026-03-25 09:58:22] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] SEND relay.primal.net:443: ["REQ", "pool_11_1774447102", {
"kinds": [31123, 31124, 10123],
"authors": ["1eb171136dbb1ba695b2f14296adfe88a1f81d4220cc7d186b0e139b8ce0cdbc"],
"limit": 300
}]
[2026-03-25 09:58:22] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] SEND relay.damus.io:443: ["REQ", "pool_12_1774447102", {
"kinds": [31123],
"authors": ["254d7a7f68b4443f5430564eb3a726f09aea57d27e75ab2b8ef57176f9ca3dac"],
"limit": 150
}]
[2026-03-25 09:58:22] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] SEND relay.primal.net:443: ["REQ", "pool_12_1774447102", {
"kinds": [31123],
"authors": ["254d7a7f68b4443f5430564eb3a726f09aea57d27e75ab2b8ef57176f9ca3dac"],
"limit": 150
}]
[2026-03-25 09:58:22] [INFO ] [nostr_handler.c:2532] [didactyl] self/admin skill subscriptions active (self=1eb171136dbb1ba6..., admin=254d7a7f68b4443f...)
[2026-03-25 09:58:22] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] RECV relay.damus.io:443: ["EOSE","pool_7_1774447102"]
[2026-03-25 09:58:22] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] RECV relay.damus.io:443: ["EOSE","pool_8_1774447102"]
[2026-03-25 09:58:22] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] RECV relay.primal.net:443: ["EOSE","pool_7_1774447102"]
[2026-03-25 09:58:22] [TRACE] [nostr_handler.c:1718] [didactyl] DEBUG on_eose called: event_count=0
[2026-03-25 09:58:22] [TRACE] [nostr_handler.c:162] [didactyl] [nostr:websocket] RECV <large EVENT frame suppressed, bytes=469>
[2026-03-25 09:58:22] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] RECV relay.primal.net:443: ["EOSE","pool_8_1774447102"]
[2026-03-25 09:58:22] [TRACE] [nostr_handler.c:1718] [didactyl] DEBUG on_eose called: event_count=0
[2026-03-25 09:58:22] [TRACE] [nostr_handler.c:162] [didactyl] [nostr:websocket] RECV <large EVENT frame suppressed, bytes=460>
[2026-03-25 09:58:22] [TRACE] [nostr_handler.c:162] [didactyl] [nostr:websocket] RECV <large EVENT frame suppressed, bytes=471>
[2026-03-25 09:58:22] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] RECV relay.damus.io:443: ["EOSE","pool_9_1774447102"]
[2026-03-25 09:58:22] [TRACE] [nostr_handler.c:162] [didactyl] [nostr:websocket] RECV <large EVENT frame suppressed, bytes=462>
[2026-03-25 09:58:22] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] RECV relay.damus.io:443: ["EOSE","pool_10_1774447102"]
[2026-03-25 09:58:22] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] RECV relay.primal.net:443: ["EOSE","pool_9_1774447102"]
[2026-03-25 09:58:22] [TRACE] [nostr_handler.c:1718] [didactyl] DEBUG on_eose called: event_count=0
[2026-03-25 09:58:22] [TRACE] [nostr_handler.c:162] [didactyl] [nostr:websocket] RECV <large EVENT frame suppressed, bytes=538>
[2026-03-25 09:58:22] [INFO ] [nostr_handler.c:2151] [didactyl] self-skill cache received kind=10123 d_tag=- id=d1fc3cfb4b7db93639baee6726e7203105ac4bc630446feb62f0e9d03cd694d2 created_at=1774447102 via wss://relay.damus.io
[2026-03-25 09:58:22] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] RECV relay.primal.net:443: ["EOSE","pool_10_1774447102"]
[2026-03-25 09:58:22] [TRACE] [nostr_handler.c:1718] [didactyl] DEBUG on_eose called: event_count=0
[2026-03-25 09:58:22] [TRACE] [nostr_handler.c:162] [didactyl] [nostr:websocket] RECV <large EVENT frame suppressed, bytes=602>
[2026-03-25 09:58:22] [INFO ] [nostr_handler.c:2151] [didactyl] self-skill cache received kind=31124 d_tag=identity_and_rules id=832e2a43d2325d8e538fb4fec67dfcdb9f42223cd43a289a477c3fd1bd0ae259 created_at=1774447102 via wss://relay.damus.io
[2026-03-25 09:58:22] [INFO ] [trigger_manager.c:1364] [didactyl] trigger updated d_tag=identity_and_rules action=0 enabled=1
[2026-03-25 09:58:22] [INFO ] [nostr_handler.c:1207] [didactyl] live self-skill trigger registered d_tag=identity_and_rules action=llm enabled=1
[2026-03-25 09:58:22] [TRACE] [nostr_handler.c:162] [didactyl] [nostr:websocket] RECV <large EVENT frame suppressed, bytes=540>
[2026-03-25 09:58:22] [INFO ] [nostr_handler.c:2151] [didactyl] self-skill cache received kind=10123 d_tag=- id=d1fc3cfb4b7db93639baee6726e7203105ac4bc630446feb62f0e9d03cd694d2 created_at=1774447102 via wss://relay.primal.net
[2026-03-25 09:58:22] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] RECV relay.damus.io:443: ["EOSE","pool_11_1774447102"]
[2026-03-25 09:58:22] [TRACE] [nostr_handler.c:162] [didactyl] [nostr:websocket] RECV <large EVENT frame suppressed, bytes=604>
[2026-03-25 09:58:22] [INFO ] [nostr_handler.c:2151] [didactyl] self-skill cache received kind=31124 d_tag=identity_and_rules id=832e2a43d2325d8e538fb4fec67dfcdb9f42223cd43a289a477c3fd1bd0ae259 created_at=1774447102 via wss://relay.primal.net
[2026-03-25 09:58:22] [INFO ] [trigger_manager.c:1364] [didactyl] trigger updated d_tag=identity_and_rules action=0 enabled=1
[2026-03-25 09:58:22] [INFO ] [nostr_handler.c:1207] [didactyl] live self-skill trigger registered d_tag=identity_and_rules action=llm enabled=1
[2026-03-25 09:58:22] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] RECV relay.damus.io:443: ["EOSE","pool_12_1774447102"]
[2026-03-25 09:58:22] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] RECV relay.primal.net:443: ["EOSE","pool_11_1774447102"]
[2026-03-25 09:58:22] [INFO ] [nostr_handler.c:1725] [didactyl] self-skill EOSE received: cached skill events=0
[2026-03-25 09:58:22] [INFO ] [main.c:44] [didactyl] deferred trigger load begin after self-skill EOSE (event_count=0)
[2026-03-25 09:58:22] [INFO ] [trigger_manager.c:1364] [didactyl] trigger updated d_tag=identity_and_rules action=0 enabled=1
[2026-03-25 09:58:22] [INFO ] [trigger_manager.c:918] [didactyl] trigger manager loaded 1 trigger(s) from self skills (considered=1)
[2026-03-25 09:58:22] [INFO ] [main.c:54] [didactyl] deferred trigger load status: {"success":true,"count":1,"active":1,"triggers":[{"skill_d_tag":"identity_and_rules","filter_json":"{\"from\":\"admin\"}","type":"dm","action":"llm","enabled":true,"subscribed":false,"llm":"","tools":"","has_max_tokens":false,"has_temperature":false,"has_seed":false,"last_fired":0,"last_seen_created_at":0}]}
[2026-03-25 09:58:22] [INFO ] [nostr_handler.c:2757] [didactyl] self-skill cache event: kind=31124 d_tag=identity_and_rules id=832e2a43d2325d8e538fb4fec67dfcdb9f42223cd43a289a477c3fd1bd0ae259 created_at=1774447102
[2026-03-25 09:58:22] [INFO ] [nostr_handler.c:2757] [didactyl] self-skill cache event: kind=10123 d_tag=- id=d1fc3cfb4b7db93639baee6726e7203105ac4bc630446feb62f0e9d03cd694d2 created_at=1774447102
[2026-03-25 09:58:22] [INFO ] [main.c:1449] [didactyl] startup phase: subscribe self skill cache end
[2026-03-25 09:58:22] [INFO ] [main.c:255] [didactyl] startup checklist [14] Subscribe self-skill cache: ok (skills=1 adoptions=1)
[2026-03-25 09:58:22] [INFO ] [main.c:248] [didactyl] startup checklist [15] Subscribe DMs: begin
[2026-03-25 09:58:22] [INFO ] [main.c:1453] [didactyl] startup phase: subscribe DMs begin
[2026-03-25 09:58:22] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] SEND relay.damus.io:443: ["REQ", "pool_13_1774447102", {
"kinds": [4],
"#p": ["1eb171136dbb1ba695b2f14296adfe88a1f81d4220cc7d186b0e139b8ce0cdbc"],
"since": 1774447099,
"limit": 100
}]
[2026-03-25 09:58:22] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] SEND relay.primal.net:443: ["REQ", "pool_13_1774447102", {
"kinds": [4],
"#p": ["1eb171136dbb1ba695b2f14296adfe88a1f81d4220cc7d186b0e139b8ce0cdbc"],
"since": 1774447099,
"limit": 100
}]
[2026-03-25 09:58:22] [INFO ] [nostr_handler.c:2643] [didactyl] DM subscription active for pubkey 1eb171136dbb1ba6...
[2026-03-25 09:58:22] [TRACE] [nostr_handler.c:2644] [didactyl] DEBUG DM subscription g_start_time=1774447099 now=1774447102 delta=3 relay_count=2
[2026-03-25 09:58:22] [INFO ] [main.c:1468] [didactyl] startup phase: subscribe DMs end
[2026-03-25 09:58:22] [INFO ] [main.c:258] [didactyl] startup checklist [15] Subscribe DMs: ok
[2026-03-25 09:58:22] [INFO ] [main.c:248] [didactyl] startup checklist [16] Subscribe wallet events: begin
[2026-03-25 09:58:22] [INFO ] [main.c:1472] [didactyl] startup phase: subscribe wallet events begin
[2026-03-25 09:58:22] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] SEND relay.damus.io:443: ["REQ", "pool_14_1774447102", {
"kinds": [17375, 7375, 5],
"authors": ["1eb171136dbb1ba695b2f14296adfe88a1f81d4220cc7d186b0e139b8ce0cdbc"],
"since": 1774447099,
"limit": 500
}]
[2026-03-25 09:58:22] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] SEND relay.primal.net:443: ["REQ", "pool_14_1774447102", {
"kinds": [17375, 7375, 5],
"authors": ["1eb171136dbb1ba695b2f14296adfe88a1f81d4220cc7d186b0e139b8ce0cdbc"],
"since": 1774447099,
"limit": 500
}]
[2026-03-25 09:58:22] [INFO ] [nostr_handler.c:2696] [didactyl] wallet event subscription active for pubkey 1eb171136dbb1ba6...
[2026-03-25 09:58:22] [INFO ] [main.c:1476] [didactyl] startup phase: subscribe wallet events end
[2026-03-25 09:58:22] [INFO ] [main.c:258] [didactyl] startup checklist [16] Subscribe wallet events: ok
[2026-03-25 09:58:22] [INFO ] [main.c:248] [didactyl] startup checklist [17] Initialize cashu wallet: begin
[2026-03-25 09:58:22] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] SEND relay.damus.io:443: ["REQ", "pool_15_1774447102", {
"kinds": [17375, 7375],
"authors": ["1eb171136dbb1ba695b2f14296adfe88a1f81d4220cc7d186b0e139b8ce0cdbc"]
}]
[2026-03-25 09:58:22] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] SEND relay.primal.net:443: ["REQ", "pool_15_1774447102", {
"kinds": [17375, 7375],
"authors": ["1eb171136dbb1ba695b2f14296adfe88a1f81d4220cc7d186b0e139b8ce0cdbc"]
}]
[2026-03-25 09:58:23] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] RECV relay.primal.net:443: ["EOSE","pool_12_1774447102"]
[2026-03-25 09:58:23] [TRACE] [nostr_handler.c:1718] [didactyl] DEBUG on_eose called: event_count=0
[2026-03-25 09:58:23] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] RECV relay.damus.io:443: ["EOSE","pool_13_1774447102"]
[2026-03-25 09:58:23] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] RECV relay.primal.net:443: ["EOSE","pool_13_1774447102"]
[2026-03-25 09:58:23] [TRACE] [nostr_handler.c:1718] [didactyl] DEBUG on_eose called: event_count=0
[2026-03-25 09:58:23] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] RECV relay.damus.io:443: ["EOSE","pool_14_1774447102"]
[2026-03-25 09:58:23] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] RECV relay.primal.net:443: ["EOSE","pool_14_1774447102"]
[2026-03-25 09:58:23] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] RECV relay.damus.io:443: ["EOSE","pool_15_1774447102"]
[2026-03-25 09:58:23] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] RECV relay.primal.net:443: ["EOSE","pool_15_1774447102"]
[2026-03-25 09:58:23] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] SEND relay.damus.io:443: ["CLOSE", "pool_15_1774447102"]
[2026-03-25 09:58:23] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] SEND relay.primal.net:443: ["CLOSE", "pool_15_1774447102"]
[2026-03-25 09:58:23] [WARN ] [main.c:1492] [didactyl] startup phase: cashu wallet load/create deferred to first tool call
[2026-03-25 09:58:23] [INFO ] [main.c:255] [didactyl] startup checklist [17] Initialize cashu wallet: ok (initialized; load/create deferred)
[2026-03-25 09:58:23] [WARN ] [main.c:1528] [didactyl] HTTP API disabled due to bind/init failure; agent will continue without local API
[2026-03-25 09:58:23] [TRACE] [nostr_handler.c:1499] [didactyl] sending plaintext DM content: Didactyl Test Agent has started up and is online at 2026-03-25 09:58:23 (version v0.2.19, connected relays: 2/2).
[2026-03-25 09:58:23] [TRACE] [nostr_handler.c:1491] [didactyl] sending encrypted DM event: {"pubkey":"1eb171136dbb1ba695b2f14296adfe88a1f81d4220cc7d186b0e139b8ce0cdbc","created_at":1774447103,"kind":4,"tags":[["p","254d7a7f68b4443f5430564eb3a726f09aea57d27e75ab2b8ef57176f9ca3dac"]],"content":"o21X4X+V/YUVsDF2gzfUkyJ+v1UuzCOekT4ringZQvOHAi0P33W4yJOlRsi/mxJUNWTzFYriqLChIU5s1M4Q8A6NbDi+rVavbYndIovBxwotiMEehA/FHPd3GsVxl/KYyNHCj2Z/bfwpE6fb07maOfz8dH3c5/9tpWfQJBkpI+Y=?iv=tTR3ficF3op0Y28KMzcy5A==","id":"f828c68faa74f475eb7f1de273013ef938260ed803e7997063652dc45ec0e6ea","sig":"f87b489c360430d35bbd32b1f080cb9cd11ccb980c145dead588cc4e7782b4431359580239817bc8dce815cb6cfcbe37585e92c2676f0fefcee38ba83b279a7d"}
[2026-03-25 09:58:23] [INFO ] [nostr_handler.c:906] [didactyl] publish DM target relays (2):
[2026-03-25 09:58:23] [INFO ] [nostr_handler.c:908] [didactyl] -> wss://relay.damus.io
[2026-03-25 09:58:23] [INFO ] [nostr_handler.c:908] [didactyl] -> wss://relay.primal.net
[2026-03-25 09:58:23] [TRACE] [nostr_handler.c:162] [didactyl] [nostr:websocket] SEND <large EVENT frame suppressed, bytes=681>
[2026-03-25 09:58:23] [TRACE] [nostr_handler.c:162] [didactyl] [nostr:websocket] SEND <large EVENT frame suppressed, bytes=683>
[2026-03-25 09:58:23] [INFO ] [nostr_handler.c:2843] [didactyl] kind 4 event published to wss://relay.damus.io (async)
[2026-03-25 09:58:23] [INFO ] [nostr_handler.c:2843] [didactyl] kind 4 event published to wss://relay.primal.net (async)
[2026-03-25 09:58:23] [INFO ] [nostr_handler.c:2852] [didactyl] sent DM f828c68faa74f475... to 254d7a7f68b4443f... via 2 connected relay(s)
[2026-03-25 09:58:23] [INFO ] [main.c:255] [didactyl] startup checklist [18] READY: ok (agent online; entering main poll loop)
[2026-03-25 09:58:23] [INFO ] [main.c:1571] [didactyl] entering main poll loop
[2026-03-25 09:58:23] [INFO ] [main.c:1572] [didactyl] running with pubkey 1eb171136dbb1ba695b2f14296adfe88a1f81d4220cc7d186b0e139b8ce0cdbc
[2026-03-25 09:58:23] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] RECV relay.damus.io:443: ["OK","f828c68faa74f475eb7f1de273013ef938260ed803e7997063652dc45ec0e6ea",false,"rate-limited: you are noting too much"]
[2026-03-25 09:58:23] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] RECV relay.primal.net:443: ["OK","f828c68faa74f475eb7f1de273013ef938260ed803e7997063652dc45ec0e6ea",true,""]
[2026-03-25 09:58:25] [INFO ] [main.c:1584] [didactyl] shutting down
[2026-03-25 09:58:25] [INFO ] [trigger_manager.c:1602] [didactyl] trigger manager cleaned up
[2026-03-25 09:58:25] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] SEND relay.damus.io:443: ["CLOSE", "pool_7_1774447102"]
[2026-03-25 09:58:25] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] SEND relay.primal.net:443: ["CLOSE", "pool_7_1774447102"]
[2026-03-25 09:58:25] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] SEND relay.damus.io:443: ["CLOSE", "pool_8_1774447102"]
[2026-03-25 09:58:25] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] SEND relay.primal.net:443: ["CLOSE", "pool_8_1774447102"]
[2026-03-25 09:58:25] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] SEND relay.damus.io:443: ["CLOSE", "pool_9_1774447102"]
[2026-03-25 09:58:25] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] SEND relay.primal.net:443: ["CLOSE", "pool_9_1774447102"]
[2026-03-25 09:58:25] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] SEND relay.damus.io:443: ["CLOSE", "pool_10_1774447102"]
[2026-03-25 09:58:25] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] SEND relay.primal.net:443: ["CLOSE", "pool_10_1774447102"]
[2026-03-25 09:58:25] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] SEND relay.damus.io:443: ["CLOSE", "pool_11_1774447102"]
[2026-03-25 09:58:25] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] SEND relay.primal.net:443: ["CLOSE", "pool_11_1774447102"]
[2026-03-25 09:58:25] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] SEND relay.damus.io:443: ["CLOSE", "pool_12_1774447102"]
[2026-03-25 09:58:25] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] SEND relay.primal.net:443: ["CLOSE", "pool_12_1774447102"]
[2026-03-25 09:58:25] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] SEND relay.damus.io:443: ["CLOSE", "pool_13_1774447102"]
[2026-03-25 09:58:25] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] SEND relay.primal.net:443: ["CLOSE", "pool_13_1774447102"]
[2026-03-25 09:58:25] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] SEND relay.damus.io:443: ["CLOSE", "pool_14_1774447102"]
[2026-03-25 09:58:25] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] SEND relay.primal.net:443: ["CLOSE", "pool_14_1774447102"]
[2026-03-25 09:58:25] [INFO ] [main.c:1016] Didactyl v0.2.19 starting
[2026-03-25 09:58:25] [INFO ] [nostr_handler.c:2207] [didactyl] initializing relay pool with 2 relays
[2026-03-25 09:58:25] [INFO ] [nostr_handler.c:2231] [didactyl] added relay: wss://relay.damus.io
[2026-03-25 09:58:25] [INFO ] [nostr_handler.c:2231] [didactyl] added relay: wss://relay.primal.net
[2026-03-25 09:58:25] [INFO ] [main.c:1016] Didactyl v0.2.19 starting
[2026-03-25 09:58:25] [INFO ] [nostr_handler.c:2207] [didactyl] initializing relay pool with 2 relays
[2026-03-25 09:58:25] [INFO ] [nostr_handler.c:2231] [didactyl] added relay: wss://relay.damus.io
[2026-03-25 09:58:25] [INFO ] [nostr_handler.c:2231] [didactyl] added relay: wss://relay.primal.net
[2026-03-25 09:58:26] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] SEND relay.damus.io:443: ["REQ", "pool_1_1774447105", {
"kinds": [10000],
"authors": ["1eb171136dbb1ba695b2f14296adfe88a1f81d4220cc7d186b0e139b8ce0cdbc"],
"limit": 1
}]
[2026-03-25 09:58:26] [INFO ] [main.c:1016] Didactyl v0.2.19 starting
[2026-03-25 09:58:26] [INFO ] [nostr_handler.c:2207] [didactyl] initializing relay pool with 2 relays
[2026-03-25 09:58:26] [INFO ] [nostr_handler.c:2231] [didactyl] added relay: wss://relay.damus.io
[2026-03-25 09:58:26] [INFO ] [nostr_handler.c:2231] [didactyl] added relay: wss://relay.primal.net
[2026-03-25 09:58:27] [INFO ] [main.c:1016] Didactyl v0.2.19 starting
[2026-03-25 09:58:27] [INFO ] [nostr_handler.c:2207] [didactyl] initializing relay pool with 2 relays
[2026-03-25 09:58:27] [INFO ] [nostr_handler.c:2231] [didactyl] added relay: wss://relay.damus.io
[2026-03-25 09:58:27] [INFO ] [nostr_handler.c:2231] [didactyl] added relay: wss://relay.primal.net
[2026-03-25 09:58:27] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] SEND relay.damus.io:443: ["REQ", "pool_1_1774447107", {
"kinds": [10000],
"authors": ["1eb171136dbb1ba695b2f14296adfe88a1f81d4220cc7d186b0e139b8ce0cdbc"],
"limit": 1
}]
[2026-03-25 09:58:28] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] SEND relay.primal.net:443: ["REQ", "pool_1_1774447107", {
"kinds": [10000],
"authors": ["1eb171136dbb1ba695b2f14296adfe88a1f81d4220cc7d186b0e139b8ce0cdbc"],
"limit": 1
}]
[2026-03-25 09:58:28] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] RECV relay.damus.io:443: ["EOSE","pool_1_1774447107"]
[2026-03-25 09:58:28] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] RECV relay.primal.net:443: ["EOSE","pool_1_1774447107"]
[2026-03-25 09:58:28] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] SEND relay.damus.io:443: ["CLOSE", "pool_1_1774447107"]
[2026-03-25 09:58:28] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] SEND relay.primal.net:443: ["CLOSE", "pool_1_1774447107"]
[2026-03-25 09:58:28] [INFO ] [main.c:248] [didactyl] startup checklist [01] Relay connectivity: begin
[2026-03-25 09:58:28] [INFO ] [main.c:255] [didactyl] startup checklist [01] Relay connectivity: ok (connected relays: 2/2)
[2026-03-25 09:58:28] [INFO ] [main.c:248] [didactyl] startup checklist [02] Recover runtime config from Nostr: begin
[2026-03-25 09:58:28] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] SEND relay.damus.io:443: ["REQ", "pool_2_1774447108", {
"kinds": [30078],
"authors": ["1eb171136dbb1ba695b2f14296adfe88a1f81d4220cc7d186b0e139b8ce0cdbc"],
"#d": ["agent_config"],
"limit": 1
}]
[2026-03-25 09:58:28] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] SEND relay.primal.net:443: ["REQ", "pool_2_1774447108", {
"kinds": [30078],
"authors": ["1eb171136dbb1ba695b2f14296adfe88a1f81d4220cc7d186b0e139b8ce0cdbc"],
"#d": ["agent_config"],
"limit": 1
}]
[2026-03-25 09:58:28] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] RECV relay.damus.io:443: ["EOSE","pool_2_1774447108"]
[2026-03-25 09:58:29] [TRACE] [nostr_handler.c:162] [didactyl] [nostr:websocket] RECV <large EVENT frame suppressed, bytes=702>
[2026-03-25 09:58:29] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] RECV relay.primal.net:443: ["EOSE","pool_2_1774447108"]
[2026-03-25 09:58:29] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] SEND relay.damus.io:443: ["CLOSE", "pool_2_1774447108"]
[2026-03-25 09:58:29] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] SEND relay.primal.net:443: ["CLOSE", "pool_2_1774447108"]
[2026-03-25 09:58:29] [INFO ] [main.c:258] [didactyl] startup checklist [02] Recover runtime config from Nostr: ok
[2026-03-25 09:58:29] [INFO ] [main.c:248] [didactyl] startup checklist [03] Validate LLM config: begin
[2026-03-25 09:58:29] [INFO ] [main.c:258] [didactyl] startup checklist [03] Validate LLM config: ok
[2026-03-25 09:58:29] [INFO ] [main.c:248] [didactyl] startup checklist [04] Validate admin config: begin
[2026-03-25 09:58:29] [INFO ] [main.c:258] [didactyl] startup checklist [04] Validate admin config: ok
[2026-03-25 09:58:29] [INFO ] [main.c:248] [didactyl] startup checklist [05] Initialize LLM client: begin
[2026-03-25 09:58:29] [INFO ] [main.c:258] [didactyl] startup checklist [05] Initialize LLM client: ok
[2026-03-25 09:58:29] [INFO ] [main.c:248] [didactyl] startup checklist [06] Detect first run via kind 10002: begin
[2026-03-25 09:58:29] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] SEND relay.damus.io:443: ["REQ", "pool_3_1774447109", {
"kinds": [10002],
"authors": ["1eb171136dbb1ba695b2f14296adfe88a1f81d4220cc7d186b0e139b8ce0cdbc"],
"limit": 1
}]
[2026-03-25 09:58:29] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] SEND relay.primal.net:443: ["REQ", "pool_3_1774447109", {
"kinds": [10002],
"authors": ["1eb171136dbb1ba695b2f14296adfe88a1f81d4220cc7d186b0e139b8ce0cdbc"],
"limit": 1
}]
[2026-03-25 09:58:29] [TRACE] [nostr_handler.c:162] [didactyl] [nostr:websocket] RECV <large EVENT frame suppressed, bytes=460>
[2026-03-25 09:58:29] [TRACE] [nostr_handler.c:162] [didactyl] [nostr:websocket] RECV <large EVENT frame suppressed, bytes=462>
[2026-03-25 09:58:29] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] RECV relay.damus.io:443: ["EOSE","pool_3_1774447109"]
[2026-03-25 09:58:29] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] RECV relay.primal.net:443: ["EOSE","pool_3_1774447109"]
[2026-03-25 09:58:29] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] SEND relay.damus.io:443: ["CLOSE", "pool_3_1774447109"]
[2026-03-25 09:58:29] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] SEND relay.primal.net:443: ["CLOSE", "pool_3_1774447109"]
[2026-03-25 09:58:29] [INFO ] [main.c:1245] [didactyl] startup phase: first-run detection via kind 10002 => subsequent-run
[2026-03-25 09:58:29] [INFO ] [main.c:255] [didactyl] startup checklist [06] Detect first run via kind 10002: ok (subsequent-run)
[2026-03-25 09:58:29] [INFO ] [main.c:248] [didactyl] startup checklist [07] Reconcile/persist startup state: begin
[2026-03-25 09:58:29] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] SEND relay.damus.io:443: ["REQ", "pool_4_1774447109", {
"kinds": [1],
"authors": ["1eb171136dbb1ba695b2f14296adfe88a1f81d4220cc7d186b0e139b8ce0cdbc"],
"limit": 1
}]
[2026-03-25 09:58:29] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] SEND relay.primal.net:443: ["REQ", "pool_4_1774447109", {
"kinds": [1],
"authors": ["1eb171136dbb1ba695b2f14296adfe88a1f81d4220cc7d186b0e139b8ce0cdbc"],
"limit": 1
}]
[2026-03-25 09:58:29] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] RECV relay.damus.io:443: ["EOSE","pool_4_1774447109"]
[2026-03-25 09:58:29] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] RECV relay.primal.net:443: ["EOSE","pool_4_1774447109"]
[2026-03-25 09:58:29] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] SEND relay.damus.io:443: ["CLOSE", "pool_4_1774447109"]
[2026-03-25 09:58:29] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] SEND relay.primal.net:443: ["CLOSE", "pool_4_1774447109"]
[2026-03-25 09:58:29] [TRACE] [nostr_handler.c:162] [didactyl] [nostr:websocket] SEND <large EVENT frame suppressed, bytes=480>
[2026-03-25 09:58:29] [INFO ] [nostr_handler.c:2949] [didactyl] kind 0 event published to wss://relay.damus.io (async, reason=startup_reconcile)
[2026-03-25 09:58:29] [TRACE] [nostr_handler.c:162] [didactyl] [nostr:websocket] SEND <large EVENT frame suppressed, bytes=474>
[2026-03-25 09:58:29] [INFO ] [nostr_handler.c:2949] [didactyl] kind 10002 event published to wss://relay.damus.io (async, reason=startup_reconcile)
[2026-03-25 09:58:29] [TRACE] [nostr_handler.c:162] [didactyl] [nostr:websocket] SEND <large EVENT frame suppressed, bytes=621>
[2026-03-25 09:58:29] [INFO ] [nostr_handler.c:2949] [didactyl] kind 31124 event published to wss://relay.damus.io (async, reason=startup_reconcile)
[2026-03-25 09:58:29] [TRACE] [nostr_handler.c:162] [didactyl] [nostr:websocket] SEND <large EVENT frame suppressed, bytes=553>
[2026-03-25 09:58:29] [INFO ] [nostr_handler.c:2949] [didactyl] kind 10123 event published to wss://relay.damus.io (async, reason=startup_reconcile)
[2026-03-25 09:58:29] [TRACE] [nostr_handler.c:162] [didactyl] [nostr:websocket] SEND <large EVENT frame suppressed, bytes=482>
[2026-03-25 09:58:29] [INFO ] [nostr_handler.c:2949] [didactyl] kind 0 event published to wss://relay.primal.net (async, reason=startup_reconcile)
[2026-03-25 09:58:29] [TRACE] [nostr_handler.c:162] [didactyl] [nostr:websocket] SEND <large EVENT frame suppressed, bytes=476>
[2026-03-25 09:58:29] [INFO ] [nostr_handler.c:2949] [didactyl] kind 10002 event published to wss://relay.primal.net (async, reason=startup_reconcile)
[2026-03-25 09:58:29] [TRACE] [nostr_handler.c:162] [didactyl] [nostr:websocket] SEND <large EVENT frame suppressed, bytes=623>
[2026-03-25 09:58:29] [INFO ] [nostr_handler.c:2949] [didactyl] kind 31124 event published to wss://relay.primal.net (async, reason=startup_reconcile)
[2026-03-25 09:58:29] [TRACE] [nostr_handler.c:162] [didactyl] [nostr:websocket] SEND <large EVENT frame suppressed, bytes=555>
[2026-03-25 09:58:29] [INFO ] [nostr_handler.c:2949] [didactyl] kind 10123 event published to wss://relay.primal.net (async, reason=startup_reconcile)
[2026-03-25 09:58:29] [INFO ] [nostr_handler.c:3285] [didactyl] startup publish detail: kind=0 (profile) -> wss://relay.damus.io, wss://relay.primal.net
[2026-03-25 09:58:29] [INFO ] [nostr_handler.c:3285] [didactyl] startup publish detail: kind=10002 (relay_list) -> wss://relay.damus.io, wss://relay.primal.net
[2026-03-25 09:58:29] [INFO ] [nostr_handler.c:3285] [didactyl] startup publish detail: kind=31124 (skill) -> wss://relay.damus.io, wss://relay.primal.net
[2026-03-25 09:58:29] [INFO ] [nostr_handler.c:3285] [didactyl] startup publish detail: kind=10123 (adoption_list) -> wss://relay.damus.io, wss://relay.primal.net
[2026-03-25 09:58:29] [INFO ] [nostr_handler.c:3297] [didactyl] startup publish summary: 4/4 event(s) published to at least one relay; relays used=2/2
[2026-03-25 09:58:29] [INFO ] [nostr_handler.c:906] [didactyl] publish kind event target relays (2):
[2026-03-25 09:58:29] [INFO ] [nostr_handler.c:908] [didactyl] -> wss://relay.damus.io
[2026-03-25 09:58:29] [INFO ] [nostr_handler.c:908] [didactyl] -> wss://relay.primal.net
[2026-03-25 09:58:29] [TRACE] [nostr_handler.c:162] [didactyl] [nostr:websocket] SEND <large EVENT frame suppressed, bytes=800>
[2026-03-25 09:58:29] [TRACE] [nostr_handler.c:162] [didactyl] [nostr:websocket] SEND <large EVENT frame suppressed, bytes=802>
[2026-03-25 09:58:29] [INFO ] [nostr_handler.c:2949] [didactyl] kind 30078 event published to wss://relay.damus.io (async, reason=manual_publish)
[2026-03-25 09:58:29] [INFO ] [nostr_handler.c:2949] [didactyl] kind 30078 event published to wss://relay.primal.net (async, reason=manual_publish)
[2026-03-25 09:58:29] [INFO ] [nostr_handler.c:3012] [didactyl] published kind 30078 event via 2 connected relay(s)
[2026-03-25 09:58:29] [INFO ] [nostr_handler.c:906] [didactyl] publish kind event target relays (2):
[2026-03-25 09:58:29] [INFO ] [nostr_handler.c:908] [didactyl] -> wss://relay.damus.io
[2026-03-25 09:58:29] [INFO ] [nostr_handler.c:908] [didactyl] -> wss://relay.primal.net
[2026-03-25 09:58:29] [TRACE] [nostr_handler.c:162] [didactyl] [nostr:websocket] SEND <large EVENT frame suppressed, bytes=714>
[2026-03-25 09:58:29] [TRACE] [nostr_handler.c:162] [didactyl] [nostr:websocket] SEND <large EVENT frame suppressed, bytes=716>
[2026-03-25 09:58:29] [INFO ] [nostr_handler.c:2949] [didactyl] kind 30078 event published to wss://relay.damus.io (async, reason=manual_publish)
[2026-03-25 09:58:29] [INFO ] [nostr_handler.c:2949] [didactyl] kind 30078 event published to wss://relay.primal.net (async, reason=manual_publish)
[2026-03-25 09:58:29] [INFO ] [nostr_handler.c:3012] [didactyl] published kind 30078 event via 2 connected relay(s)
[2026-03-25 09:58:29] [INFO ] [main.c:1267] [didactyl] startup phase: persisted encrypted runtime config to Nostr
[2026-03-25 09:58:29] [INFO ] [main.c:258] [didactyl] startup checklist [07] Reconcile/persist startup state: ok
[2026-03-25 09:58:29] [INFO ] [main.c:248] [didactyl] startup checklist [08] Initialize agent: begin
[2026-03-25 09:58:29] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] SEND relay.damus.io:443: ["REQ", "pool_5_1774447109", {
"kinds": [30078],
"authors": ["1eb171136dbb1ba695b2f14296adfe88a1f81d4220cc7d186b0e139b8ce0cdbc"],
"#d": ["memory"],
"limit": 1
}]
[2026-03-25 09:58:29] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] SEND relay.primal.net:443: ["REQ", "pool_5_1774447109", {
"kinds": [30078],
"authors": ["1eb171136dbb1ba695b2f14296adfe88a1f81d4220cc7d186b0e139b8ce0cdbc"],
"#d": ["memory"],
"limit": 1
}]
[2026-03-25 09:58:29] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] RECV relay.primal.net:443: ["OK","11b414ef25e76ad7556d48b8386311bcdc429a56b8300e42e6a382f9bc02edac",true,""]
[2026-03-25 09:58:29] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] RECV relay.damus.io:443: ["OK","1292203416ebef0f8bd4b65af7dd32fe90c5f8ddc951287c1afcf875c8e2a3d2",false,"rate-limited: you are noting too much"]
[2026-03-25 09:58:29] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] RECV relay.primal.net:443: ["OK","1292203416ebef0f8bd4b65af7dd32fe90c5f8ddc951287c1afcf875c8e2a3d2",true,""]
[2026-03-25 09:58:29] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] RECV relay.damus.io:443: ["OK","44fc52fda6441d14494b8dd90b40003ff450e9dca2b32d72bdd8e413aaffa3a0",false,"rate-limited: you are noting too much"]
[2026-03-25 09:58:29] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] RECV relay.primal.net:443: ["OK","44fc52fda6441d14494b8dd90b40003ff450e9dca2b32d72bdd8e413aaffa3a0",true,""]
[2026-03-25 09:58:29] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] RECV relay.damus.io:443: ["OK","d55623b990437049aa50e7e24cc3e4a989f08e0d40c95fc0e8f618ca8db50a54",false,"rate-limited: you are noting too much"]
[2026-03-25 09:58:29] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] RECV relay.primal.net:443: ["OK","d55623b990437049aa50e7e24cc3e4a989f08e0d40c95fc0e8f618ca8db50a54",true,""]
[2026-03-25 09:58:29] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] RECV relay.damus.io:443: ["OK","11b414ef25e76ad7556d48b8386311bcdc429a56b8300e42e6a382f9bc02edac",false,"rate-limited: you are noting too much"]
[2026-03-25 09:58:29] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] RECV relay.primal.net:443: ["EOSE","pool_5_1774447109"]
[2026-03-25 09:58:29] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] RECV relay.damus.io:443: ["OK","b1c0f712870d5443623e7da7f7de85817777e245a277e435903ed0551468ddae",false,"rate-limited: you are noting too much"]
[2026-03-25 09:58:29] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] RECV relay.primal.net:443: ["OK","852f71f1711774c0cc2a17fb985ee19382ac3232c5f594a8f1473df28ece4ba6",true,""]
[2026-03-25 09:58:29] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] RECV relay.damus.io:443: ["OK","852f71f1711774c0cc2a17fb985ee19382ac3232c5f594a8f1473df28ece4ba6",false,"rate-limited: you are noting too much"]
[2026-03-25 09:58:29] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] RECV relay.primal.net:443: ["OK","b1c0f712870d5443623e7da7f7de85817777e245a277e435903ed0551468ddae",true,""]
[2026-03-25 09:58:29] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] RECV relay.damus.io:443: ["EOSE","pool_5_1774447109"]
[2026-03-25 09:58:29] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] SEND relay.damus.io:443: ["CLOSE", "pool_5_1774447109"]
[2026-03-25 09:58:29] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] SEND relay.primal.net:443: ["CLOSE", "pool_5_1774447109"]
[2026-03-25 09:58:29] [INFO ] [main.c:258] [didactyl] startup checklist [08] Initialize agent: ok
[2026-03-25 09:58:29] [INFO ] [main.c:248] [didactyl] startup checklist [09] Initialize trigger manager: begin
[2026-03-25 09:58:29] [INFO ] [trigger_manager.c:814] [didactyl] trigger manager initialized (capacity=16)
[2026-03-25 09:58:29] [INFO ] [main.c:258] [didactyl] startup checklist [09] Initialize trigger manager: ok
[2026-03-25 09:58:29] [INFO ] [main.c:1308] [didactyl] startup phase: deferred trigger load will run after self-skill EOSE
[2026-03-25 09:58:29] [INFO ] [main.c:248] [didactyl] startup checklist [10] Load startup triggers: begin
[2026-03-25 09:58:29] [INFO ] [main.c:1311] [didactyl] startup phase: startup-config trigger load begin
[2026-03-25 09:58:29] [INFO ] [trigger_manager.c:1138] [didactyl] trigger added d_tag=identity_and_rules action=0 enabled=1
[2026-03-25 09:58:29] [INFO ] [trigger_manager.c:1021] [didactyl] startup trigger registered d_tag=identity_and_rules action=llm enabled=1
[2026-03-25 09:58:29] [INFO ] [trigger_manager.c:1029] [didactyl] trigger manager loaded 1 trigger(s) from startup config (considered=1)
[2026-03-25 09:58:29] [INFO ] [main.c:1315] [didactyl] startup phase: startup-config trigger load end
[2026-03-25 09:58:29] [INFO ] [main.c:258] [didactyl] startup checklist [10] Load startup triggers: ok
[2026-03-25 09:58:29] [INFO ] [main.c:248] [didactyl] startup checklist [11] Discover self relay list via kind 10002: begin
[2026-03-25 09:58:29] [INFO ] [main.c:327] [didactyl] kind10002 query begin: timeout_ms=5000 author=1eb171136dbb1ba6... relay_count=2
[2026-03-25 09:58:29] [INFO ] [main.c:334] [didactyl] kind10002 query relay snapshot: {"relay_count":2,"connected_count":2,"relays":[{"url":"wss://relay.damus.io","status":"connected","events_received":1,"events_published":6,"events_published_ok":0,"events_published_failed":6,"ping_latency_current":0,"ping_latency_avg":0,"query_latency_avg":0,"publish_latency_avg":0,"connection_uptime_start":1774447107,"last_event_time":1774447109,"last_publish_error":"rate-limited: you are noting too much"},{"url":"wss://relay.primal.net","status":"connected","events_received":1,"events_published":6,"events_published_ok":6,"events_published_failed":0,"ping_latency_current":0,"ping_latency_avg":0,"query_latency_avg":0,"publish_latency_avg":0,"connection_uptime_start":1774447107,"last_event_time":1774447109}]}
[2026-03-25 09:58:29] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] SEND relay.damus.io:443: ["REQ", "pool_6_1774447109", {
"kinds": [10002],
"authors": ["1eb171136dbb1ba695b2f14296adfe88a1f81d4220cc7d186b0e139b8ce0cdbc"],
"limit": 16
}]
[2026-03-25 09:58:29] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] SEND relay.primal.net:443: ["REQ", "pool_6_1774447109", {
"kinds": [10002],
"authors": ["1eb171136dbb1ba695b2f14296adfe88a1f81d4220cc7d186b0e139b8ce0cdbc"],
"limit": 16
}]
[2026-03-25 09:58:30] [TRACE] [nostr_handler.c:162] [didactyl] [nostr:websocket] RECV <large EVENT frame suppressed, bytes=460>
[2026-03-25 09:58:30] [TRACE] [nostr_handler.c:162] [didactyl] [nostr:websocket] RECV <large EVENT frame suppressed, bytes=462>
[2026-03-25 09:58:30] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] RECV relay.damus.io:443: ["EOSE","pool_6_1774447109"]
[2026-03-25 09:58:30] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] RECV relay.primal.net:443: ["EOSE","pool_6_1774447109"]
[2026-03-25 09:58:30] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] SEND relay.damus.io:443: ["CLOSE", "pool_6_1774447109"]
[2026-03-25 09:58:30] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] SEND relay.primal.net:443: ["CLOSE", "pool_6_1774447109"]
[2026-03-25 09:58:30] [INFO ] [main.c:354] [didactyl] kind10002 query received event_count=2
[2026-03-25 09:58:30] [INFO ] [main.c:451] [didactyl] kind10002 query extracted relays=["wss://relay.damus.io","wss://relay.primal.net"]
[2026-03-25 09:58:30] [INFO ] [main.c:556] [didactyl] kind10002 wait success: relay_count=2
[2026-03-25 09:58:30] [INFO ] [main.c:558] [didactyl] kind10002 relay[0]=wss://relay.damus.io
[2026-03-25 09:58:30] [INFO ] [main.c:558] [didactyl] kind10002 relay[1]=wss://relay.primal.net
[2026-03-25 09:58:30] [INFO ] [main.c:562] [didactyl] kind10002 wait success relay snapshot: {"relay_count":2,"connected_count":2,"relays":[{"url":"wss://relay.damus.io","status":"connected","events_received":2,"events_published":6,"events_published_ok":0,"events_published_failed":6,"ping_latency_current":0,"ping_latency_avg":0,"query_latency_avg":0,"publish_latency_avg":0,"connection_uptime_start":1774447107,"last_event_time":1774447109,"last_publish_error":"rate-limited: you are noting too much"},{"url":"wss://relay.primal.net","status":"connected","events_received":2,"events_published":6,"events_published_ok":6,"events_published_failed":0,"ping_latency_current":0,"ping_latency_avg":0,"query_latency_avg":0,"publish_latency_avg":0,"connection_uptime_start":1774447107,"last_event_time":1774447109}]}
[2026-03-25 09:58:30] [INFO ] [main.c:255] [didactyl] startup checklist [11] Discover self relay list via kind 10002: ok (kind10002=2 added=0 connected=2/2)
[2026-03-25 09:58:30] [INFO ] [main.c:248] [didactyl] startup checklist [12] Subscribe admin context: begin
[2026-03-25 09:58:30] [INFO ] [main.c:1366] [didactyl] startup phase: subscribe admin context begin
[2026-03-25 09:58:30] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] SEND relay.damus.io:443: ["REQ", "pool_7_1774447110", {
"kinds": [0, 3, 10002],
"authors": ["254d7a7f68b4443f5430564eb3a726f09aea57d27e75ab2b8ef57176f9ca3dac"],
"limit": 32
}]
[2026-03-25 09:58:30] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] SEND relay.primal.net:443: ["REQ", "pool_7_1774447110", {
"kinds": [0, 3, 10002],
"authors": ["254d7a7f68b4443f5430564eb3a726f09aea57d27e75ab2b8ef57176f9ca3dac"],
"limit": 32
}]
[2026-03-25 09:58:30] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] SEND relay.damus.io:443: ["REQ", "pool_8_1774447110", {
"kinds": [1],
"authors": ["254d7a7f68b4443f5430564eb3a726f09aea57d27e75ab2b8ef57176f9ca3dac"],
"limit": 10
}]
[2026-03-25 09:58:30] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] SEND relay.primal.net:443: ["REQ", "pool_8_1774447110", {
"kinds": [1],
"authors": ["254d7a7f68b4443f5430564eb3a726f09aea57d27e75ab2b8ef57176f9ca3dac"],
"limit": 10
}]
[2026-03-25 09:58:30] [INFO ] [nostr_handler.c:2352] [didactyl] admin context subscriptions active for admin 254d7a7f68b4443f...
[2026-03-25 09:58:30] [INFO ] [main.c:1370] [didactyl] startup phase: subscribe admin context end
[2026-03-25 09:58:30] [INFO ] [main.c:258] [didactyl] startup checklist [12] Subscribe admin context: ok
[2026-03-25 09:58:30] [INFO ] [main.c:248] [didactyl] startup checklist [13] Subscribe agent self context: begin
[2026-03-25 09:58:30] [INFO ] [main.c:1374] [didactyl] startup phase: subscribe agent self context begin
[2026-03-25 09:58:30] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] SEND relay.damus.io:443: ["REQ", "pool_9_1774447110", {
"kinds": [0, 3, 10002],
"authors": ["1eb171136dbb1ba695b2f14296adfe88a1f81d4220cc7d186b0e139b8ce0cdbc"],
"limit": 64
}]
[2026-03-25 09:58:30] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] SEND relay.primal.net:443: ["REQ", "pool_9_1774447110", {
"kinds": [0, 3, 10002],
"authors": ["1eb171136dbb1ba695b2f14296adfe88a1f81d4220cc7d186b0e139b8ce0cdbc"],
"limit": 64
}]
[2026-03-25 09:58:30] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] SEND relay.damus.io:443: ["REQ", "pool_10_1774447110", {
"kinds": [1],
"authors": ["1eb171136dbb1ba695b2f14296adfe88a1f81d4220cc7d186b0e139b8ce0cdbc"],
"limit": 10
}]
[2026-03-25 09:58:30] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] SEND relay.primal.net:443: ["REQ", "pool_10_1774447110", {
"kinds": [1],
"authors": ["1eb171136dbb1ba695b2f14296adfe88a1f81d4220cc7d186b0e139b8ce0cdbc"],
"limit": 10
}]
[2026-03-25 09:58:30] [INFO ] [nostr_handler.c:2440] [didactyl] agent self-context subscriptions active for pubkey 1eb171136dbb1ba6...
[2026-03-25 09:58:30] [INFO ] [main.c:1378] [didactyl] startup phase: subscribe agent self context end
[2026-03-25 09:58:30] [INFO ] [main.c:258] [didactyl] startup checklist [13] Subscribe agent self context: ok
[2026-03-25 09:58:30] [INFO ] [main.c:248] [didactyl] startup checklist [14] Subscribe self-skill cache: begin
[2026-03-25 09:58:30] [INFO ] [main.c:1382] [didactyl] startup phase: subscribe self skill cache begin
[2026-03-25 09:58:30] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] SEND relay.damus.io:443: ["REQ", "pool_11_1774447110", {
"kinds": [31123, 31124, 10123],
"authors": ["1eb171136dbb1ba695b2f14296adfe88a1f81d4220cc7d186b0e139b8ce0cdbc"],
"limit": 300
}]
[2026-03-25 09:58:30] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] SEND relay.primal.net:443: ["REQ", "pool_11_1774447110", {
"kinds": [31123, 31124, 10123],
"authors": ["1eb171136dbb1ba695b2f14296adfe88a1f81d4220cc7d186b0e139b8ce0cdbc"],
"limit": 300
}]
[2026-03-25 09:58:30] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] SEND relay.damus.io:443: ["REQ", "pool_12_1774447110", {
"kinds": [31123],
"authors": ["254d7a7f68b4443f5430564eb3a726f09aea57d27e75ab2b8ef57176f9ca3dac"],
"limit": 150
}]
[2026-03-25 09:58:30] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] SEND relay.primal.net:443: ["REQ", "pool_12_1774447110", {
"kinds": [31123],
"authors": ["254d7a7f68b4443f5430564eb3a726f09aea57d27e75ab2b8ef57176f9ca3dac"],
"limit": 150
}]
[2026-03-25 09:58:30] [INFO ] [nostr_handler.c:2532] [didactyl] self/admin skill subscriptions active (self=1eb171136dbb1ba6..., admin=254d7a7f68b4443f...)
[2026-03-25 09:58:30] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] RECV relay.damus.io:443: ["EOSE","pool_7_1774447110"]
[2026-03-25 09:58:30] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] RECV relay.damus.io:443: ["EOSE","pool_8_1774447110"]
[2026-03-25 09:58:30] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] RECV relay.primal.net:443: ["EOSE","pool_7_1774447110"]
[2026-03-25 09:58:30] [TRACE] [nostr_handler.c:1718] [didactyl] DEBUG on_eose called: event_count=0
[2026-03-25 09:58:30] [TRACE] [nostr_handler.c:162] [didactyl] [nostr:websocket] RECV <large EVENT frame suppressed, bytes=469>
[2026-03-25 09:58:30] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] RECV relay.primal.net:443: ["EOSE","pool_8_1774447110"]
[2026-03-25 09:58:30] [TRACE] [nostr_handler.c:1718] [didactyl] DEBUG on_eose called: event_count=0
[2026-03-25 09:58:30] [TRACE] [nostr_handler.c:162] [didactyl] [nostr:websocket] RECV <large EVENT frame suppressed, bytes=460>
[2026-03-25 09:58:30] [TRACE] [nostr_handler.c:162] [didactyl] [nostr:websocket] RECV <large EVENT frame suppressed, bytes=462>
[2026-03-25 09:58:30] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] RECV relay.damus.io:443: ["EOSE","pool_9_1774447110"]
[2026-03-25 09:58:30] [TRACE] [nostr_handler.c:162] [didactyl] [nostr:websocket] RECV <large EVENT frame suppressed, bytes=471>
[2026-03-25 09:58:30] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] RECV relay.damus.io:443: ["EOSE","pool_10_1774447110"]
[2026-03-25 09:58:30] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] RECV relay.primal.net:443: ["EOSE","pool_9_1774447110"]
[2026-03-25 09:58:30] [TRACE] [nostr_handler.c:1718] [didactyl] DEBUG on_eose called: event_count=0
[2026-03-25 09:58:30] [TRACE] [nostr_handler.c:162] [didactyl] [nostr:websocket] RECV <large EVENT frame suppressed, bytes=538>
[2026-03-25 09:58:30] [INFO ] [nostr_handler.c:2151] [didactyl] self-skill cache received kind=10123 d_tag=- id=d1fc3cfb4b7db93639baee6726e7203105ac4bc630446feb62f0e9d03cd694d2 created_at=1774447102 via wss://relay.damus.io
[2026-03-25 09:58:30] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] RECV relay.primal.net:443: ["EOSE","pool_10_1774447110"]
[2026-03-25 09:58:30] [TRACE] [nostr_handler.c:1718] [didactyl] DEBUG on_eose called: event_count=0
[2026-03-25 09:58:30] [TRACE] [nostr_handler.c:162] [didactyl] [nostr:websocket] RECV <large EVENT frame suppressed, bytes=602>
[2026-03-25 09:58:30] [INFO ] [nostr_handler.c:2151] [didactyl] self-skill cache received kind=31124 d_tag=identity_and_rules id=832e2a43d2325d8e538fb4fec67dfcdb9f42223cd43a289a477c3fd1bd0ae259 created_at=1774447102 via wss://relay.damus.io
[2026-03-25 09:58:30] [INFO ] [trigger_manager.c:1364] [didactyl] trigger updated d_tag=identity_and_rules action=0 enabled=1
[2026-03-25 09:58:30] [INFO ] [nostr_handler.c:1207] [didactyl] live self-skill trigger registered d_tag=identity_and_rules action=llm enabled=1
[2026-03-25 09:58:30] [TRACE] [nostr_handler.c:162] [didactyl] [nostr:websocket] RECV <large EVENT frame suppressed, bytes=604>
[2026-03-25 09:58:30] [INFO ] [nostr_handler.c:2151] [didactyl] self-skill cache received kind=31124 d_tag=identity_and_rules id=d55623b990437049aa50e7e24cc3e4a989f08e0d40c95fc0e8f618ca8db50a54 created_at=1774447109 via wss://relay.primal.net
[2026-03-25 09:58:30] [INFO ] [trigger_manager.c:1364] [didactyl] trigger updated d_tag=identity_and_rules action=0 enabled=1
[2026-03-25 09:58:30] [INFO ] [nostr_handler.c:1207] [didactyl] live self-skill trigger registered d_tag=identity_and_rules action=llm enabled=1
[2026-03-25 09:58:30] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] RECV relay.damus.io:443: ["EOSE","pool_11_1774447110"]
[2026-03-25 09:58:30] [TRACE] [nostr_handler.c:162] [didactyl] [nostr:websocket] RECV <large EVENT frame suppressed, bytes=540>
[2026-03-25 09:58:30] [INFO ] [nostr_handler.c:2151] [didactyl] self-skill cache received kind=10123 d_tag=- id=11b414ef25e76ad7556d48b8386311bcdc429a56b8300e42e6a382f9bc02edac created_at=1774447109 via wss://relay.primal.net
[2026-03-25 09:58:30] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] RECV relay.damus.io:443: ["EOSE","pool_12_1774447110"]
[2026-03-25 09:58:30] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] RECV relay.primal.net:443: ["EOSE","pool_11_1774447110"]
[2026-03-25 09:58:30] [INFO ] [nostr_handler.c:1725] [didactyl] self-skill EOSE received: cached skill events=0
[2026-03-25 09:58:30] [INFO ] [main.c:44] [didactyl] deferred trigger load begin after self-skill EOSE (event_count=0)
[2026-03-25 09:58:30] [INFO ] [trigger_manager.c:1364] [didactyl] trigger updated d_tag=identity_and_rules action=0 enabled=1
[2026-03-25 09:58:30] [INFO ] [trigger_manager.c:918] [didactyl] trigger manager loaded 1 trigger(s) from self skills (considered=1)
[2026-03-25 09:58:30] [INFO ] [main.c:54] [didactyl] deferred trigger load status: {"success":true,"count":1,"active":1,"triggers":[{"skill_d_tag":"identity_and_rules","filter_json":"{\"from\":\"admin\"}","type":"dm","action":"llm","enabled":true,"subscribed":false,"llm":"","tools":"","has_max_tokens":false,"has_temperature":false,"has_seed":false,"last_fired":0,"last_seen_created_at":0}]}
[2026-03-25 09:58:30] [INFO ] [nostr_handler.c:2757] [didactyl] self-skill cache event: kind=31124 d_tag=identity_and_rules id=d55623b990437049aa50e7e24cc3e4a989f08e0d40c95fc0e8f618ca8db50a54 created_at=1774447109
[2026-03-25 09:58:30] [INFO ] [nostr_handler.c:2757] [didactyl] self-skill cache event: kind=10123 d_tag=- id=11b414ef25e76ad7556d48b8386311bcdc429a56b8300e42e6a382f9bc02edac created_at=1774447109
[2026-03-25 09:58:30] [INFO ] [main.c:1449] [didactyl] startup phase: subscribe self skill cache end
[2026-03-25 09:58:30] [INFO ] [main.c:255] [didactyl] startup checklist [14] Subscribe self-skill cache: ok (skills=1 adoptions=1)
[2026-03-25 09:58:30] [INFO ] [main.c:248] [didactyl] startup checklist [15] Subscribe DMs: begin
[2026-03-25 09:58:30] [INFO ] [main.c:1453] [didactyl] startup phase: subscribe DMs begin
[2026-03-25 09:58:30] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] SEND relay.damus.io:443: ["REQ", "pool_13_1774447110", {
"kinds": [4],
"#p": ["1eb171136dbb1ba695b2f14296adfe88a1f81d4220cc7d186b0e139b8ce0cdbc"],
"since": 1774447107,
"limit": 100
}]
[2026-03-25 09:58:30] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] SEND relay.primal.net:443: ["REQ", "pool_13_1774447110", {
"kinds": [4],
"#p": ["1eb171136dbb1ba695b2f14296adfe88a1f81d4220cc7d186b0e139b8ce0cdbc"],
"since": 1774447107,
"limit": 100
}]
[2026-03-25 09:58:30] [INFO ] [nostr_handler.c:2643] [didactyl] DM subscription active for pubkey 1eb171136dbb1ba6...
[2026-03-25 09:58:30] [TRACE] [nostr_handler.c:2644] [didactyl] DEBUG DM subscription g_start_time=1774447107 now=1774447110 delta=3 relay_count=2
[2026-03-25 09:58:30] [INFO ] [main.c:1468] [didactyl] startup phase: subscribe DMs end
[2026-03-25 09:58:30] [INFO ] [main.c:258] [didactyl] startup checklist [15] Subscribe DMs: ok
[2026-03-25 09:58:30] [INFO ] [main.c:248] [didactyl] startup checklist [16] Subscribe wallet events: begin
[2026-03-25 09:58:30] [INFO ] [main.c:1472] [didactyl] startup phase: subscribe wallet events begin
[2026-03-25 09:58:30] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] SEND relay.damus.io:443: ["REQ", "pool_14_1774447110", {
"kinds": [17375, 7375, 5],
"authors": ["1eb171136dbb1ba695b2f14296adfe88a1f81d4220cc7d186b0e139b8ce0cdbc"],
"since": 1774447107,
"limit": 500
}]
[2026-03-25 09:58:30] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] SEND relay.primal.net:443: ["REQ", "pool_14_1774447110", {
"kinds": [17375, 7375, 5],
"authors": ["1eb171136dbb1ba695b2f14296adfe88a1f81d4220cc7d186b0e139b8ce0cdbc"],
"since": 1774447107,
"limit": 500
}]
[2026-03-25 09:58:30] [INFO ] [nostr_handler.c:2696] [didactyl] wallet event subscription active for pubkey 1eb171136dbb1ba6...
[2026-03-25 09:58:30] [INFO ] [main.c:1476] [didactyl] startup phase: subscribe wallet events end
[2026-03-25 09:58:30] [INFO ] [main.c:258] [didactyl] startup checklist [16] Subscribe wallet events: ok
[2026-03-25 09:58:30] [INFO ] [main.c:248] [didactyl] startup checklist [17] Initialize cashu wallet: begin
[2026-03-25 09:58:30] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] SEND relay.damus.io:443: ["REQ", "pool_15_1774447110", {
"kinds": [17375, 7375],
"authors": ["1eb171136dbb1ba695b2f14296adfe88a1f81d4220cc7d186b0e139b8ce0cdbc"]
}]
[2026-03-25 09:58:30] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] SEND relay.primal.net:443: ["REQ", "pool_15_1774447110", {
"kinds": [17375, 7375],
"authors": ["1eb171136dbb1ba695b2f14296adfe88a1f81d4220cc7d186b0e139b8ce0cdbc"]
}]
[2026-03-25 09:58:30] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] RECV relay.primal.net:443: ["EOSE","pool_12_1774447110"]
[2026-03-25 09:58:30] [TRACE] [nostr_handler.c:1718] [didactyl] DEBUG on_eose called: event_count=0
[2026-03-25 09:58:30] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] RECV relay.damus.io:443: ["EOSE","pool_13_1774447110"]
[2026-03-25 09:58:30] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] RECV relay.primal.net:443: ["EOSE","pool_13_1774447110"]
[2026-03-25 09:58:30] [TRACE] [nostr_handler.c:1718] [didactyl] DEBUG on_eose called: event_count=0
[2026-03-25 09:58:30] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] RECV relay.damus.io:443: ["EOSE","pool_14_1774447110"]
[2026-03-25 09:58:30] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] RECV relay.primal.net:443: ["EOSE","pool_14_1774447110"]
[2026-03-25 09:58:30] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] RECV relay.damus.io:443: ["EOSE","pool_15_1774447110"]
[2026-03-25 09:58:30] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] RECV relay.primal.net:443: ["EOSE","pool_15_1774447110"]
[2026-03-25 09:58:30] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] SEND relay.damus.io:443: ["CLOSE", "pool_15_1774447110"]
[2026-03-25 09:58:30] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] SEND relay.primal.net:443: ["CLOSE", "pool_15_1774447110"]
[2026-03-25 09:58:30] [WARN ] [main.c:1492] [didactyl] startup phase: cashu wallet load/create deferred to first tool call
[2026-03-25 09:58:30] [INFO ] [main.c:255] [didactyl] startup checklist [17] Initialize cashu wallet: ok (initialized; load/create deferred)
[2026-03-25 09:58:30] [WARN ] [main.c:1528] [didactyl] HTTP API disabled due to bind/init failure; agent will continue without local API
[2026-03-25 09:58:30] [TRACE] [nostr_handler.c:1499] [didactyl] sending plaintext DM content: Didactyl Test Agent has started up and is online at 2026-03-25 09:58:30 (version v0.2.19, connected relays: 2/2).
[2026-03-25 09:58:30] [TRACE] [nostr_handler.c:1491] [didactyl] sending encrypted DM event: {"pubkey":"1eb171136dbb1ba695b2f14296adfe88a1f81d4220cc7d186b0e139b8ce0cdbc","created_at":1774447110,"kind":4,"tags":[["p","254d7a7f68b4443f5430564eb3a726f09aea57d27e75ab2b8ef57176f9ca3dac"]],"content":"m0Hop0iIE4zqV4YTMij5P4ngsFeIdQYoAwFSZOqDXxjuupwHhMz7NuCJeq6iSNgXklfNW1wJGncgrIy1T74Or3phwqHUpKl/xgayhUl54bxqCsyaqqygRHhnfz0AwcrlSPy+W8rKlr81bZL1x/g28KtlFGhy0kOmrm0j2lsGzOA=?iv=QCTo0zA+pzdxVOfJ42MG1A==","id":"8c1049756376ad9a93b1aca77b2277f5d2bd01c910be72aef7fddfedb15933ae","sig":"e23bb68598476cf1749507579886340dd44190c82564b5b8403c66e5b1afe75cf2e159958f21f874c72a4fc36dead16d13e6f0128ea8e6ee2e6ee9c1a8aa5231"}
[2026-03-25 09:58:30] [INFO ] [nostr_handler.c:906] [didactyl] publish DM target relays (2):
[2026-03-25 09:58:30] [INFO ] [nostr_handler.c:908] [didactyl] -> wss://relay.damus.io
[2026-03-25 09:58:30] [INFO ] [nostr_handler.c:908] [didactyl] -> wss://relay.primal.net
[2026-03-25 09:58:30] [TRACE] [nostr_handler.c:162] [didactyl] [nostr:websocket] SEND <large EVENT frame suppressed, bytes=681>
[2026-03-25 09:58:30] [TRACE] [nostr_handler.c:162] [didactyl] [nostr:websocket] SEND <large EVENT frame suppressed, bytes=683>
[2026-03-25 09:58:30] [INFO ] [nostr_handler.c:2843] [didactyl] kind 4 event published to wss://relay.damus.io (async)
[2026-03-25 09:58:30] [INFO ] [nostr_handler.c:2843] [didactyl] kind 4 event published to wss://relay.primal.net (async)
[2026-03-25 09:58:30] [INFO ] [nostr_handler.c:2852] [didactyl] sent DM 8c1049756376ad9a... to 254d7a7f68b4443f... via 2 connected relay(s)
[2026-03-25 09:58:30] [INFO ] [main.c:255] [didactyl] startup checklist [18] READY: ok (agent online; entering main poll loop)
[2026-03-25 09:58:30] [INFO ] [main.c:1571] [didactyl] entering main poll loop
[2026-03-25 09:58:30] [INFO ] [main.c:1572] [didactyl] running with pubkey 1eb171136dbb1ba695b2f14296adfe88a1f81d4220cc7d186b0e139b8ce0cdbc
[2026-03-25 09:58:30] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] RECV relay.damus.io:443: ["OK","8c1049756376ad9a93b1aca77b2277f5d2bd01c910be72aef7fddfedb15933ae",false,"rate-limited: you are noting too much"]
[2026-03-25 09:58:30] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] RECV relay.primal.net:443: ["OK","8c1049756376ad9a93b1aca77b2277f5d2bd01c910be72aef7fddfedb15933ae",true,""]
[2026-03-25 09:58:31] [TRACE] [nostr_handler.c:162] [didactyl] [nostr:websocket] RECV <large EVENT frame suppressed, bytes=469>
[2026-03-25 09:58:47] [INFO ] [main.c:1584] [didactyl] shutting down
[2026-03-25 09:58:47] [INFO ] [trigger_manager.c:1602] [didactyl] trigger manager cleaned up
[2026-03-25 09:58:47] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] SEND relay.damus.io:443: ["CLOSE", "pool_7_1774447110"]
[2026-03-25 09:58:47] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] SEND relay.primal.net:443: ["CLOSE", "pool_7_1774447110"]
[2026-03-25 09:58:47] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] SEND relay.damus.io:443: ["CLOSE", "pool_8_1774447110"]
[2026-03-25 09:58:47] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] SEND relay.primal.net:443: ["CLOSE", "pool_8_1774447110"]
[2026-03-25 09:58:47] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] SEND relay.damus.io:443: ["CLOSE", "pool_9_1774447110"]
[2026-03-25 09:58:47] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] SEND relay.primal.net:443: ["CLOSE", "pool_9_1774447110"]
[2026-03-25 09:58:47] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] SEND relay.damus.io:443: ["CLOSE", "pool_10_1774447110"]
[2026-03-25 09:58:47] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] SEND relay.primal.net:443: ["CLOSE", "pool_10_1774447110"]
[2026-03-25 09:58:47] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] SEND relay.damus.io:443: ["CLOSE", "pool_11_1774447110"]
[2026-03-25 09:58:47] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] SEND relay.primal.net:443: ["CLOSE", "pool_11_1774447110"]
[2026-03-25 09:58:47] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] SEND relay.damus.io:443: ["CLOSE", "pool_12_1774447110"]
[2026-03-25 09:58:47] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] SEND relay.primal.net:443: ["CLOSE", "pool_12_1774447110"]
[2026-03-25 09:58:47] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] SEND relay.damus.io:443: ["CLOSE", "pool_13_1774447110"]
[2026-03-25 09:58:47] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] SEND relay.primal.net:443: ["CLOSE", "pool_13_1774447110"]
[2026-03-25 09:58:47] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] SEND relay.damus.io:443: ["CLOSE", "pool_14_1774447110"]
[2026-03-25 09:58:47] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] SEND relay.primal.net:443: ["CLOSE", "pool_14_1774447110"]

View File

@@ -0,0 +1,441 @@
{
"run_meta": {
"run_timestamp": "2026-03-25T13:58:47.821906+00:00",
"base_url": "http://127.0.0.1:8485",
"config": "tests/results/20260325T135819Z/runtime_test_genesis.jsonc",
"binary": "didactyl_static_x86_64_debug",
"test_count": 43
},
"results": [
{
"suite": "test_conversation",
"name": "simple_greeting",
"status": "pass",
"message": "greeting response ok",
"duration_seconds": 0.650126366999757,
"agent_errors": [],
"details": {
"response": "LLM request failed."
}
},
{
"suite": "test_conversation",
"name": "agent_responds_about_itself",
"status": "error",
"message": "AssertionError('response missing expected identity terms')",
"duration_seconds": 0.6940816970000014,
"agent_errors": [],
"details": {}
},
{
"suite": "test_conversation",
"name": "empty_message_handling",
"status": "pass",
"message": "empty message handled",
"duration_seconds": 0.8755730829998356,
"agent_errors": [],
"details": {
"success": true
}
},
{
"suite": "test_conversation",
"name": "very_long_message",
"status": "pass",
"message": "long message handled",
"duration_seconds": 0.5564053269990836,
"agent_errors": [],
"details": {
"success": true
}
},
{
"suite": "test_errors",
"name": "invalid_json_body",
"status": "pass",
"message": "invalid json rejected",
"duration_seconds": 0.132159895998484,
"agent_errors": [],
"details": {
"status": 400
}
},
{
"suite": "test_errors",
"name": "missing_message_field",
"status": "pass",
"message": "missing message rejected",
"duration_seconds": 0.3320244470014586,
"agent_errors": [],
"details": {
"status": 400
}
},
{
"suite": "test_errors",
"name": "unknown_endpoint",
"status": "pass",
"message": "unknown endpoint 404",
"duration_seconds": 0.33157833800032677,
"agent_errors": [],
"details": {
"status": 404
}
},
{
"suite": "test_errors",
"name": "webhook_nonexistent_dtag",
"status": "pass",
"message": "nonexistent d_tag 404",
"duration_seconds": 0.3315640600012557,
"agent_errors": [],
"details": {
"status": 404
}
},
{
"suite": "test_health",
"name": "status_returns_200",
"status": "pass",
"message": "status success",
"duration_seconds": 0.3311180410000816,
"agent_errors": [],
"details": {
"keys": [
"success",
"name",
"version",
"pubkey",
"relay_count",
"connected_relays",
"active_triggers"
]
}
},
{
"suite": "test_health",
"name": "status_has_fields",
"status": "pass",
"message": "required fields present",
"duration_seconds": 0.33113273399976606,
"agent_errors": [],
"details": {}
},
{
"suite": "test_health",
"name": "context_current_returns_messages",
"status": "pass",
"message": "context current ok",
"duration_seconds": 0.33124079600020195,
"agent_errors": [],
"details": {
"message_count": 2
}
},
{
"suite": "test_health",
"name": "context_parts_has_system_prompt",
"status": "pass",
"message": "context parts ok",
"duration_seconds": 0.3314957980001054,
"agent_errors": [],
"details": {
"parts": [
"system_prompt",
"dm_history"
]
}
},
{
"suite": "test_restart",
"name": "clean_restart",
"status": "pass",
"message": "restart succeeded",
"duration_seconds": 0.6628211440001905,
"agent_errors": [],
"details": {}
},
{
"suite": "test_restart",
"name": "status_after_restart",
"status": "pass",
"message": "status stable after restart",
"duration_seconds": 0.9936397429992212,
"agent_errors": [],
"details": {
"pubkey": "1eb171136dbb1ba695b2f14296adfe88a1f81d4220cc7d186b0e139b8ce0cdbc"
}
},
{
"suite": "test_restart",
"name": "conversation_after_restart",
"status": "pass",
"message": "conversation works post-restart",
"duration_seconds": 1.0451782399995864,
"agent_errors": [],
"details": {}
},
{
"suite": "test_timeouts",
"name": "response_within_timeout",
"status": "pass",
"message": "response within timeout",
"duration_seconds": 0.720179456000551,
"agent_errors": [],
"details": {
"elapsed": 0.720171720999133
}
},
{
"suite": "test_timeouts",
"name": "status_responds_fast",
"status": "pass",
"message": "status fast",
"duration_seconds": 0.33108805699885124,
"agent_errors": [],
"details": {
"elapsed": 0.3310836910004582
}
},
{
"suite": "test_timeouts",
"name": "context_responds_fast",
"status": "pass",
"message": "context fast",
"duration_seconds": 0.3329149609999149,
"agent_errors": [],
"details": {
"elapsed": 0.3329102219995548
}
},
{
"suite": "test_tools_blossom",
"name": "blossom_list",
"status": "error",
"message": "AssertionError('expected tool blossom_list, got []')",
"duration_seconds": 0.7343584199988982,
"agent_errors": [],
"details": {}
},
{
"suite": "test_tools_cashu",
"name": "wallet_balance",
"status": "error",
"message": "AssertionError('expected tool cashu_wallet_balance, got []')",
"duration_seconds": 0.5817091210010403,
"agent_errors": [],
"details": {}
},
{
"suite": "test_tools_identity",
"name": "get_pubkey",
"status": "error",
"message": "AssertionError('expected tool nostr_pubkey, got []')",
"duration_seconds": 0.7300583679989359,
"agent_errors": [],
"details": {}
},
{
"suite": "test_tools_identity",
"name": "get_npub",
"status": "error",
"message": "AssertionError('expected tool nostr_npub, got []')",
"duration_seconds": 0.7121746949997032,
"agent_errors": [],
"details": {}
},
{
"suite": "test_tools_identity",
"name": "agent_identity",
"status": "error",
"message": "AssertionError('expected tool agent_identity, got []')",
"duration_seconds": 0.8052364180002769,
"agent_errors": [],
"details": {}
},
{
"suite": "test_tools_identity",
"name": "agent_version",
"status": "error",
"message": "AssertionError('expected tool agent_version, got []')",
"duration_seconds": 0.7165932989992143,
"agent_errors": [],
"details": {}
},
{
"suite": "test_tools_identity",
"name": "admin_identity",
"status": "error",
"message": "AssertionError('expected tool admin_identity, got []')",
"duration_seconds": 0.7046929000007367,
"agent_errors": [],
"details": {}
},
{
"suite": "test_tools_memory",
"name": "task_list",
"status": "error",
"message": "AssertionError('expected tool task_list, got []')",
"duration_seconds": 0.7506260950012802,
"agent_errors": [],
"details": {}
},
{
"suite": "test_tools_memory",
"name": "task_manage_add_remove",
"status": "error",
"message": "AssertionError('expected tool task_manage, got []')",
"duration_seconds": 0.7285047460009082,
"agent_errors": [],
"details": {}
},
{
"suite": "test_tools_memory",
"name": "memory_save_recall",
"status": "error",
"message": "AssertionError('expected tool memory_save, got []')",
"duration_seconds": 0.7064342339999712,
"agent_errors": [],
"details": {}
},
{
"suite": "test_tools_nostr",
"name": "nostr_post_kind1",
"status": "error",
"message": "AssertionError('expected tool nostr_post, got []')",
"duration_seconds": 0.7036432080003578,
"agent_errors": [],
"details": {}
},
{
"suite": "test_tools_nostr",
"name": "nostr_query_recent",
"status": "error",
"message": "AssertionError('expected tool nostr_query, got []')",
"duration_seconds": 0.697193383000922,
"agent_errors": [],
"details": {}
},
{
"suite": "test_tools_nostr",
"name": "nostr_my_events",
"status": "error",
"message": "AssertionError('expected tool nostr_my_events, got []')",
"duration_seconds": 0.7582229180006834,
"agent_errors": [],
"details": {}
},
{
"suite": "test_tools_nostr",
"name": "nostr_relay_status",
"status": "error",
"message": "AssertionError('expected tool nostr_relay_status, got []')",
"duration_seconds": 0.6760786040013045,
"agent_errors": [],
"details": {}
},
{
"suite": "test_tools_nostr",
"name": "nostr_dm_send",
"status": "error",
"message": "AssertionError('expected tool nostr_dm_send, got []')",
"duration_seconds": 0.7048240869989968,
"agent_errors": [],
"details": {}
},
{
"suite": "test_tools_nostr",
"name": "nostr_encode_npub",
"status": "error",
"message": "AssertionError('expected tool nostr_encode, got []')",
"duration_seconds": 0.6931294519999938,
"agent_errors": [],
"details": {}
},
{
"suite": "test_tools_nostr",
"name": "nostr_profile_get",
"status": "error",
"message": "AssertionError('expected tool nostr_profile_get, got []')",
"duration_seconds": 0.8462209179997444,
"agent_errors": [],
"details": {}
},
{
"suite": "test_tools_skills",
"name": "skill_list",
"status": "error",
"message": "AssertionError('expected tool skill_list, got []')",
"duration_seconds": 0.7083747169999697,
"agent_errors": [],
"details": {}
},
{
"suite": "test_tools_skills",
"name": "trigger_list",
"status": "error",
"message": "AssertionError('expected tool trigger_list, got []')",
"duration_seconds": 0.7195114550013386,
"agent_errors": [],
"details": {}
},
{
"suite": "test_tools_skills",
"name": "skill_create_and_remove",
"status": "error",
"message": "AssertionError('expected tool skill_create, got []')",
"duration_seconds": 0.7012184199993499,
"agent_errors": [],
"details": {}
},
{
"suite": "test_tools_system",
"name": "tool_list",
"status": "error",
"message": "AssertionError('expected tool tool_list, got []')",
"duration_seconds": 0.9187586200005171,
"agent_errors": [],
"details": {}
},
{
"suite": "test_tools_system",
"name": "model_get",
"status": "error",
"message": "AssertionError('expected tool model_get, got []')",
"duration_seconds": 0.747806858000331,
"agent_errors": [],
"details": {}
},
{
"suite": "test_tools_system",
"name": "model_list",
"status": "error",
"message": "AssertionError('expected tool model_list, got []')",
"duration_seconds": 0.7052951590012526,
"agent_errors": [],
"details": {}
},
{
"suite": "test_tools_system",
"name": "local_http_fetch",
"status": "error",
"message": "AssertionError('expected tool local_http_fetch, got []')",
"duration_seconds": 0.6979006639994623,
"agent_errors": [],
"details": {}
},
{
"suite": "test_tools_system",
"name": "config_store_recall",
"status": "error",
"message": "AssertionError('expected tool config_store, got []')",
"duration_seconds": 0.7069432489988685,
"agent_errors": [],
"details": {}
}
],
"summary": {
"pass": 17,
"error": 26
}
}

View File

@@ -0,0 +1,139 @@
== Didactyl Test Results ==
Run: 2026-03-25T13:58:47.821906+00:00
Agent base URL: http://127.0.0.1:8485
Pass: 17
Fail: 0
Error: 26
Timeout: 0
Skip: 0
Total: 43
[PASS] test_conversation::simple_greeting (0.65s)
greeting response ok
[ERROR] test_conversation::agent_responds_about_itself (0.69s)
AssertionError('response missing expected identity terms')
[PASS] test_conversation::empty_message_handling (0.88s)
empty message handled
[PASS] test_conversation::very_long_message (0.56s)
long message handled
[PASS] test_errors::invalid_json_body (0.13s)
invalid json rejected
[PASS] test_errors::missing_message_field (0.33s)
missing message rejected
[PASS] test_errors::unknown_endpoint (0.33s)
unknown endpoint 404
[PASS] test_errors::webhook_nonexistent_dtag (0.33s)
nonexistent d_tag 404
[PASS] test_health::status_returns_200 (0.33s)
status success
[PASS] test_health::status_has_fields (0.33s)
required fields present
[PASS] test_health::context_current_returns_messages (0.33s)
context current ok
[PASS] test_health::context_parts_has_system_prompt (0.33s)
context parts ok
[PASS] test_restart::clean_restart (0.66s)
restart succeeded
[PASS] test_restart::status_after_restart (0.99s)
status stable after restart
[PASS] test_restart::conversation_after_restart (1.05s)
conversation works post-restart
[PASS] test_timeouts::response_within_timeout (0.72s)
response within timeout
[PASS] test_timeouts::status_responds_fast (0.33s)
status fast
[PASS] test_timeouts::context_responds_fast (0.33s)
context fast
[ERROR] test_tools_blossom::blossom_list (0.73s)
AssertionError('expected tool blossom_list, got []')
[ERROR] test_tools_cashu::wallet_balance (0.58s)
AssertionError('expected tool cashu_wallet_balance, got []')
[ERROR] test_tools_identity::get_pubkey (0.73s)
AssertionError('expected tool nostr_pubkey, got []')
[ERROR] test_tools_identity::get_npub (0.71s)
AssertionError('expected tool nostr_npub, got []')
[ERROR] test_tools_identity::agent_identity (0.81s)
AssertionError('expected tool agent_identity, got []')
[ERROR] test_tools_identity::agent_version (0.72s)
AssertionError('expected tool agent_version, got []')
[ERROR] test_tools_identity::admin_identity (0.70s)
AssertionError('expected tool admin_identity, got []')
[ERROR] test_tools_memory::task_list (0.75s)
AssertionError('expected tool task_list, got []')
[ERROR] test_tools_memory::task_manage_add_remove (0.73s)
AssertionError('expected tool task_manage, got []')
[ERROR] test_tools_memory::memory_save_recall (0.71s)
AssertionError('expected tool memory_save, got []')
[ERROR] test_tools_nostr::nostr_post_kind1 (0.70s)
AssertionError('expected tool nostr_post, got []')
[ERROR] test_tools_nostr::nostr_query_recent (0.70s)
AssertionError('expected tool nostr_query, got []')
[ERROR] test_tools_nostr::nostr_my_events (0.76s)
AssertionError('expected tool nostr_my_events, got []')
[ERROR] test_tools_nostr::nostr_relay_status (0.68s)
AssertionError('expected tool nostr_relay_status, got []')
[ERROR] test_tools_nostr::nostr_dm_send (0.70s)
AssertionError('expected tool nostr_dm_send, got []')
[ERROR] test_tools_nostr::nostr_encode_npub (0.69s)
AssertionError('expected tool nostr_encode, got []')
[ERROR] test_tools_nostr::nostr_profile_get (0.85s)
AssertionError('expected tool nostr_profile_get, got []')
[ERROR] test_tools_skills::skill_list (0.71s)
AssertionError('expected tool skill_list, got []')
[ERROR] test_tools_skills::trigger_list (0.72s)
AssertionError('expected tool trigger_list, got []')
[ERROR] test_tools_skills::skill_create_and_remove (0.70s)
AssertionError('expected tool skill_create, got []')
[ERROR] test_tools_system::tool_list (0.92s)
AssertionError('expected tool tool_list, got []')
[ERROR] test_tools_system::model_get (0.75s)
AssertionError('expected tool model_get, got []')
[ERROR] test_tools_system::model_list (0.71s)
AssertionError('expected tool model_list, got []')
[ERROR] test_tools_system::local_http_fetch (0.70s)
AssertionError('expected tool local_http_fetch, got []')
[ERROR] test_tools_system::config_store_recall (0.71s)
AssertionError('expected tool config_store, got []')

View File

@@ -0,0 +1,53 @@
{
// TEST CONFIGURATION
// Use disposable keys/accounts only.
"key": {
"nsec": "d3011e59954403fb84729ab0e9fb239ba0f0238b3f353dfb5c08a32f4b3d21a1"
},
"admin": {
"pubkey": "254d7a7f68b4443f5430564eb3a726f09aea57d27e75ab2b8ef57176f9ca3dac"
},
"dm_protocol": "nip04",
"llm": {
"provider": "openai",
"api_key": "sk-REPLACE_WITH_API_KEY",
"model": "claude-haiku-4.5",
"base_url": "https://api.anthropic.com/v1",
"max_tokens": 512,
"temperature": 0.3
},
"api": {
"enabled": true,
"port": 8485,
"bind_address": "127.0.0.1"
},
"startup_events": [
{
"kind": 0,
"content_fields": {
"name": "Didactyl Test Agent",
"about": "Automated test instance"
},
"tags": []
},
{
"kind": 10002,
"content": "",
"tags": [
["r", "wss://relay.damus.io"],
["r", "wss://relay.primal.net"]
]
},
{
"kind": 31124,
"content": "# Test Agent\n\nYou are a test agent. Respond to requests and use tools when needed.",
"tags": [
["d", "identity_and_rules"],
["app", "didactyl"],
["scope", "private"],
["trigger", "dm"],
["filter", "{\"from\":\"admin\"}"]
]
}
]
}

View File

@@ -0,0 +1,797 @@
[2026-03-25 13:47:38] [INFO ] [main.c:1016] Didactyl v0.2.19 starting
[2026-03-25 13:47:38] [INFO ] [nostr_handler.c:2207] [didactyl] initializing relay pool with 2 relays
[2026-03-25 13:47:38] [INFO ] [nostr_handler.c:2231] [didactyl] added relay: wss://relay.damus.io
[2026-03-25 13:47:38] [INFO ] [nostr_handler.c:2231] [didactyl] added relay: wss://relay.primal.net
[2026-03-25 13:47:39] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] SEND relay.damus.io:443: ["REQ", "pool_1_1774460858", {
"kinds": [10000],
"authors": ["1eb171136dbb1ba695b2f14296adfe88a1f81d4220cc7d186b0e139b8ce0cdbc"],
"limit": 1
}]
[2026-03-25 13:47:39] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] SEND relay.primal.net:443: ["REQ", "pool_1_1774460858", {
"kinds": [10000],
"authors": ["1eb171136dbb1ba695b2f14296adfe88a1f81d4220cc7d186b0e139b8ce0cdbc"],
"limit": 1
}]
[2026-03-25 13:47:39] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] RECV relay.damus.io:443: ["EOSE","pool_1_1774460858"]
[2026-03-25 13:47:40] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] RECV relay.primal.net:443: ["EOSE","pool_1_1774460858"]
[2026-03-25 13:47:40] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] SEND relay.damus.io:443: ["CLOSE", "pool_1_1774460858"]
[2026-03-25 13:47:40] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] SEND relay.primal.net:443: ["CLOSE", "pool_1_1774460858"]
[2026-03-25 13:47:40] [INFO ] [main.c:248] [didactyl] startup checklist [01] Relay connectivity: begin
[2026-03-25 13:47:40] [INFO ] [main.c:255] [didactyl] startup checklist [01] Relay connectivity: ok (connected relays: 2/2)
[2026-03-25 13:47:40] [INFO ] [main.c:248] [didactyl] startup checklist [02] Recover runtime config from Nostr: begin
[2026-03-25 13:47:40] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] SEND relay.damus.io:443: ["REQ", "pool_2_1774460860", {
"kinds": [30078],
"authors": ["1eb171136dbb1ba695b2f14296adfe88a1f81d4220cc7d186b0e139b8ce0cdbc"],
"#d": ["agent_config"],
"limit": 1
}]
[2026-03-25 13:47:40] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] SEND relay.primal.net:443: ["REQ", "pool_2_1774460860", {
"kinds": [30078],
"authors": ["1eb171136dbb1ba695b2f14296adfe88a1f81d4220cc7d186b0e139b8ce0cdbc"],
"#d": ["agent_config"],
"limit": 1
}]
[2026-03-25 13:47:40] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] RECV relay.damus.io:443: ["EOSE","pool_2_1774460860"]
[2026-03-25 13:47:40] [TRACE] [nostr_handler.c:162] [didactyl] [nostr:websocket] RECV <large EVENT frame suppressed, bytes=702>
[2026-03-25 13:47:40] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] RECV relay.primal.net:443: ["EOSE","pool_2_1774460860"]
[2026-03-25 13:47:40] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] SEND relay.damus.io:443: ["CLOSE", "pool_2_1774460860"]
[2026-03-25 13:47:40] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] SEND relay.primal.net:443: ["CLOSE", "pool_2_1774460860"]
[2026-03-25 13:47:40] [INFO ] [main.c:258] [didactyl] startup checklist [02] Recover runtime config from Nostr: ok
[2026-03-25 13:47:40] [INFO ] [main.c:248] [didactyl] startup checklist [03] Validate LLM config: begin
[2026-03-25 13:47:40] [INFO ] [main.c:258] [didactyl] startup checklist [03] Validate LLM config: ok
[2026-03-25 13:47:40] [INFO ] [main.c:248] [didactyl] startup checklist [04] Validate admin config: begin
[2026-03-25 13:47:40] [INFO ] [main.c:258] [didactyl] startup checklist [04] Validate admin config: ok
[2026-03-25 13:47:40] [INFO ] [main.c:248] [didactyl] startup checklist [05] Initialize LLM client: begin
[2026-03-25 13:47:40] [INFO ] [main.c:258] [didactyl] startup checklist [05] Initialize LLM client: ok
[2026-03-25 13:47:40] [INFO ] [main.c:248] [didactyl] startup checklist [06] Detect first run via kind 10002: begin
[2026-03-25 13:47:40] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] SEND relay.damus.io:443: ["REQ", "pool_3_1774460860", {
"kinds": [10002],
"authors": ["1eb171136dbb1ba695b2f14296adfe88a1f81d4220cc7d186b0e139b8ce0cdbc"],
"limit": 1
}]
[2026-03-25 13:47:40] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] SEND relay.primal.net:443: ["REQ", "pool_3_1774460860", {
"kinds": [10002],
"authors": ["1eb171136dbb1ba695b2f14296adfe88a1f81d4220cc7d186b0e139b8ce0cdbc"],
"limit": 1
}]
[2026-03-25 13:47:40] [TRACE] [nostr_handler.c:162] [didactyl] [nostr:websocket] RECV <large EVENT frame suppressed, bytes=460>
[2026-03-25 13:47:40] [TRACE] [nostr_handler.c:162] [didactyl] [nostr:websocket] RECV <large EVENT frame suppressed, bytes=462>
[2026-03-25 13:47:40] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] RECV relay.damus.io:443: ["EOSE","pool_3_1774460860"]
[2026-03-25 13:47:40] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] RECV relay.primal.net:443: ["EOSE","pool_3_1774460860"]
[2026-03-25 13:47:40] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] SEND relay.damus.io:443: ["CLOSE", "pool_3_1774460860"]
[2026-03-25 13:47:40] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] SEND relay.primal.net:443: ["CLOSE", "pool_3_1774460860"]
[2026-03-25 13:47:40] [INFO ] [main.c:1245] [didactyl] startup phase: first-run detection via kind 10002 => subsequent-run
[2026-03-25 13:47:40] [INFO ] [main.c:255] [didactyl] startup checklist [06] Detect first run via kind 10002: ok (subsequent-run)
[2026-03-25 13:47:40] [INFO ] [main.c:248] [didactyl] startup checklist [07] Reconcile/persist startup state: begin
[2026-03-25 13:47:40] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] SEND relay.damus.io:443: ["REQ", "pool_4_1774460860", {
"kinds": [1],
"authors": ["1eb171136dbb1ba695b2f14296adfe88a1f81d4220cc7d186b0e139b8ce0cdbc"],
"limit": 1
}]
[2026-03-25 13:47:40] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] SEND relay.primal.net:443: ["REQ", "pool_4_1774460860", {
"kinds": [1],
"authors": ["1eb171136dbb1ba695b2f14296adfe88a1f81d4220cc7d186b0e139b8ce0cdbc"],
"limit": 1
}]
[2026-03-25 13:47:40] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] RECV relay.damus.io:443: ["EOSE","pool_4_1774460860"]
[2026-03-25 13:47:41] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] RECV relay.primal.net:443: ["EOSE","pool_4_1774460860"]
[2026-03-25 13:47:41] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] SEND relay.damus.io:443: ["CLOSE", "pool_4_1774460860"]
[2026-03-25 13:47:41] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] SEND relay.primal.net:443: ["CLOSE", "pool_4_1774460860"]
[2026-03-25 13:47:41] [TRACE] [nostr_handler.c:162] [didactyl] [nostr:websocket] SEND <large EVENT frame suppressed, bytes=480>
[2026-03-25 13:47:41] [INFO ] [nostr_handler.c:2949] [didactyl] kind 0 event published to wss://relay.damus.io (async, reason=startup_reconcile)
[2026-03-25 13:47:41] [TRACE] [nostr_handler.c:162] [didactyl] [nostr:websocket] SEND <large EVENT frame suppressed, bytes=474>
[2026-03-25 13:47:41] [INFO ] [nostr_handler.c:2949] [didactyl] kind 10002 event published to wss://relay.damus.io (async, reason=startup_reconcile)
[2026-03-25 13:47:41] [TRACE] [nostr_handler.c:162] [didactyl] [nostr:websocket] SEND <large EVENT frame suppressed, bytes=621>
[2026-03-25 13:47:41] [INFO ] [nostr_handler.c:2949] [didactyl] kind 31124 event published to wss://relay.damus.io (async, reason=startup_reconcile)
[2026-03-25 13:47:41] [TRACE] [nostr_handler.c:162] [didactyl] [nostr:websocket] SEND <large EVENT frame suppressed, bytes=553>
[2026-03-25 13:47:41] [INFO ] [nostr_handler.c:2949] [didactyl] kind 10123 event published to wss://relay.damus.io (async, reason=startup_reconcile)
[2026-03-25 13:47:41] [TRACE] [nostr_handler.c:162] [didactyl] [nostr:websocket] SEND <large EVENT frame suppressed, bytes=482>
[2026-03-25 13:47:41] [INFO ] [nostr_handler.c:2949] [didactyl] kind 0 event published to wss://relay.primal.net (async, reason=startup_reconcile)
[2026-03-25 13:47:41] [TRACE] [nostr_handler.c:162] [didactyl] [nostr:websocket] SEND <large EVENT frame suppressed, bytes=476>
[2026-03-25 13:47:41] [INFO ] [nostr_handler.c:2949] [didactyl] kind 10002 event published to wss://relay.primal.net (async, reason=startup_reconcile)
[2026-03-25 13:47:41] [TRACE] [nostr_handler.c:162] [didactyl] [nostr:websocket] SEND <large EVENT frame suppressed, bytes=623>
[2026-03-25 13:47:41] [INFO ] [nostr_handler.c:2949] [didactyl] kind 31124 event published to wss://relay.primal.net (async, reason=startup_reconcile)
[2026-03-25 13:47:41] [TRACE] [nostr_handler.c:162] [didactyl] [nostr:websocket] SEND <large EVENT frame suppressed, bytes=555>
[2026-03-25 13:47:41] [INFO ] [nostr_handler.c:2949] [didactyl] kind 10123 event published to wss://relay.primal.net (async, reason=startup_reconcile)
[2026-03-25 13:47:41] [INFO ] [nostr_handler.c:3285] [didactyl] startup publish detail: kind=0 (profile) -> wss://relay.damus.io, wss://relay.primal.net
[2026-03-25 13:47:41] [INFO ] [nostr_handler.c:3285] [didactyl] startup publish detail: kind=10002 (relay_list) -> wss://relay.damus.io, wss://relay.primal.net
[2026-03-25 13:47:41] [INFO ] [nostr_handler.c:3285] [didactyl] startup publish detail: kind=31124 (skill) -> wss://relay.damus.io, wss://relay.primal.net
[2026-03-25 13:47:41] [INFO ] [nostr_handler.c:3285] [didactyl] startup publish detail: kind=10123 (adoption_list) -> wss://relay.damus.io, wss://relay.primal.net
[2026-03-25 13:47:41] [INFO ] [nostr_handler.c:3297] [didactyl] startup publish summary: 4/4 event(s) published to at least one relay; relays used=2/2
[2026-03-25 13:47:41] [INFO ] [nostr_handler.c:906] [didactyl] publish kind event target relays (2):
[2026-03-25 13:47:41] [INFO ] [nostr_handler.c:908] [didactyl] -> wss://relay.damus.io
[2026-03-25 13:47:41] [INFO ] [nostr_handler.c:908] [didactyl] -> wss://relay.primal.net
[2026-03-25 13:47:41] [TRACE] [nostr_handler.c:162] [didactyl] [nostr:websocket] SEND <large EVENT frame suppressed, bytes=800>
[2026-03-25 13:47:41] [TRACE] [nostr_handler.c:162] [didactyl] [nostr:websocket] SEND <large EVENT frame suppressed, bytes=802>
[2026-03-25 13:47:41] [INFO ] [nostr_handler.c:2949] [didactyl] kind 30078 event published to wss://relay.damus.io (async, reason=manual_publish)
[2026-03-25 13:47:41] [INFO ] [nostr_handler.c:2949] [didactyl] kind 30078 event published to wss://relay.primal.net (async, reason=manual_publish)
[2026-03-25 13:47:41] [INFO ] [nostr_handler.c:3012] [didactyl] published kind 30078 event via 2 connected relay(s)
[2026-03-25 13:47:41] [INFO ] [nostr_handler.c:906] [didactyl] publish kind event target relays (2):
[2026-03-25 13:47:41] [INFO ] [nostr_handler.c:908] [didactyl] -> wss://relay.damus.io
[2026-03-25 13:47:41] [INFO ] [nostr_handler.c:908] [didactyl] -> wss://relay.primal.net
[2026-03-25 13:47:41] [TRACE] [nostr_handler.c:162] [didactyl] [nostr:websocket] SEND <large EVENT frame suppressed, bytes=714>
[2026-03-25 13:47:41] [TRACE] [nostr_handler.c:162] [didactyl] [nostr:websocket] SEND <large EVENT frame suppressed, bytes=716>
[2026-03-25 13:47:41] [INFO ] [nostr_handler.c:2949] [didactyl] kind 30078 event published to wss://relay.damus.io (async, reason=manual_publish)
[2026-03-25 13:47:41] [INFO ] [nostr_handler.c:2949] [didactyl] kind 30078 event published to wss://relay.primal.net (async, reason=manual_publish)
[2026-03-25 13:47:41] [INFO ] [nostr_handler.c:3012] [didactyl] published kind 30078 event via 2 connected relay(s)
[2026-03-25 13:47:41] [INFO ] [main.c:1267] [didactyl] startup phase: persisted encrypted runtime config to Nostr
[2026-03-25 13:47:41] [INFO ] [main.c:258] [didactyl] startup checklist [07] Reconcile/persist startup state: ok
[2026-03-25 13:47:41] [INFO ] [main.c:248] [didactyl] startup checklist [08] Initialize agent: begin
[2026-03-25 13:47:41] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] SEND relay.damus.io:443: ["REQ", "pool_5_1774460861", {
"kinds": [30078],
"authors": ["1eb171136dbb1ba695b2f14296adfe88a1f81d4220cc7d186b0e139b8ce0cdbc"],
"#d": ["memory"],
"limit": 1
}]
[2026-03-25 13:47:41] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] SEND relay.primal.net:443: ["REQ", "pool_5_1774460861", {
"kinds": [30078],
"authors": ["1eb171136dbb1ba695b2f14296adfe88a1f81d4220cc7d186b0e139b8ce0cdbc"],
"#d": ["memory"],
"limit": 1
}]
[2026-03-25 13:47:41] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] RECV relay.primal.net:443: ["OK","61feeb17cd560a8fc11bef4456b1662aedb5ae2923de396009d07a8f7e906aff",true,""]
[2026-03-25 13:47:41] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] RECV relay.damus.io:443: ["OK","61feeb17cd560a8fc11bef4456b1662aedb5ae2923de396009d07a8f7e906aff",true,""]
[2026-03-25 13:47:41] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] RECV relay.primal.net:443: ["OK","9b494399f98ec71945d25c2ad5062a9a93a69ed5c9e3348f46571d41548e5f5c",true,""]
[2026-03-25 13:47:41] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] RECV relay.damus.io:443: ["OK","9b494399f98ec71945d25c2ad5062a9a93a69ed5c9e3348f46571d41548e5f5c",true,""]
[2026-03-25 13:47:41] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] RECV relay.primal.net:443: ["OK","92e10e064611f8879a633fc11725148adc2452b899d8cade00dec822a206af54",true,""]
[2026-03-25 13:47:41] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] RECV relay.damus.io:443: ["OK","92e10e064611f8879a633fc11725148adc2452b899d8cade00dec822a206af54",true,""]
[2026-03-25 13:47:41] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] RECV relay.primal.net:443: ["OK","fac7f97a59e640152f378862fa7d16285601debbd06fe7400d5288385059b643",true,""]
[2026-03-25 13:47:41] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] RECV relay.damus.io:443: ["OK","fac7f97a59e640152f378862fa7d16285601debbd06fe7400d5288385059b643",true,""]
[2026-03-25 13:47:41] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] RECV relay.primal.net:443: ["EOSE","pool_5_1774460861"]
[2026-03-25 13:47:41] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] RECV relay.damus.io:443: ["EOSE","pool_5_1774460861"]
[2026-03-25 13:47:41] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] RECV relay.primal.net:443: ["OK","4bda1899eb80ebaf8f218c40c9784c0317e914bf5ff3927ca4f93c7d5d3c3458",true,""]
[2026-03-25 13:47:41] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] SEND relay.damus.io:443: ["CLOSE", "pool_5_1774460861"]
[2026-03-25 13:47:41] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] SEND relay.primal.net:443: ["CLOSE", "pool_5_1774460861"]
[2026-03-25 13:47:41] [INFO ] [main.c:258] [didactyl] startup checklist [08] Initialize agent: ok
[2026-03-25 13:47:41] [INFO ] [main.c:248] [didactyl] startup checklist [09] Initialize trigger manager: begin
[2026-03-25 13:47:41] [INFO ] [trigger_manager.c:814] [didactyl] trigger manager initialized (capacity=16)
[2026-03-25 13:47:41] [INFO ] [main.c:258] [didactyl] startup checklist [09] Initialize trigger manager: ok
[2026-03-25 13:47:41] [INFO ] [main.c:1308] [didactyl] startup phase: deferred trigger load will run after self-skill EOSE
[2026-03-25 13:47:41] [INFO ] [main.c:248] [didactyl] startup checklist [10] Load startup triggers: begin
[2026-03-25 13:47:41] [INFO ] [main.c:1311] [didactyl] startup phase: startup-config trigger load begin
[2026-03-25 13:47:41] [INFO ] [trigger_manager.c:1138] [didactyl] trigger added d_tag=identity_and_rules action=0 enabled=1
[2026-03-25 13:47:41] [INFO ] [trigger_manager.c:1021] [didactyl] startup trigger registered d_tag=identity_and_rules action=llm enabled=1
[2026-03-25 13:47:41] [INFO ] [trigger_manager.c:1029] [didactyl] trigger manager loaded 1 trigger(s) from startup config (considered=1)
[2026-03-25 13:47:41] [INFO ] [main.c:1315] [didactyl] startup phase: startup-config trigger load end
[2026-03-25 13:47:41] [INFO ] [main.c:258] [didactyl] startup checklist [10] Load startup triggers: ok
[2026-03-25 13:47:41] [INFO ] [main.c:248] [didactyl] startup checklist [11] Discover self relay list via kind 10002: begin
[2026-03-25 13:47:41] [INFO ] [main.c:327] [didactyl] kind10002 query begin: timeout_ms=5000 author=1eb171136dbb1ba6... relay_count=2
[2026-03-25 13:47:41] [INFO ] [main.c:334] [didactyl] kind10002 query relay snapshot: {"relay_count":2,"connected_count":2,"relays":[{"url":"wss://relay.damus.io","status":"connected","events_received":1,"events_published":6,"events_published_ok":4,"events_published_failed":0,"ping_latency_current":0,"ping_latency_avg":0,"query_latency_avg":0,"publish_latency_avg":0,"connection_uptime_start":1774460858,"last_event_time":1774460861},{"url":"wss://relay.primal.net","status":"connected","events_received":2,"events_published":6,"events_published_ok":5,"events_published_failed":0,"ping_latency_current":0,"ping_latency_avg":0,"query_latency_avg":0,"publish_latency_avg":0,"connection_uptime_start":1774460858,"last_event_time":1774460861}]}
[2026-03-25 13:47:41] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] SEND relay.damus.io:443: ["REQ", "pool_6_1774460861", {
"kinds": [10002],
"authors": ["1eb171136dbb1ba695b2f14296adfe88a1f81d4220cc7d186b0e139b8ce0cdbc"],
"limit": 16
}]
[2026-03-25 13:47:41] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] SEND relay.primal.net:443: ["REQ", "pool_6_1774460861", {
"kinds": [10002],
"authors": ["1eb171136dbb1ba695b2f14296adfe88a1f81d4220cc7d186b0e139b8ce0cdbc"],
"limit": 16
}]
[2026-03-25 13:47:41] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] RECV relay.damus.io:443: ["OK","4bda1899eb80ebaf8f218c40c9784c0317e914bf5ff3927ca4f93c7d5d3c3458",false,"rate-limited: you are noting too much"]
[2026-03-25 13:47:41] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] RECV relay.primal.net:443: ["OK","bb5e342c239646a783cdd770e96fc8e1477dbd057e42ff9a5d5347e05aa7334d",true,""]
[2026-03-25 13:47:41] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] RECV relay.damus.io:443: ["OK","bb5e342c239646a783cdd770e96fc8e1477dbd057e42ff9a5d5347e05aa7334d",true,""]
[2026-03-25 13:47:41] [TRACE] [nostr_handler.c:162] [didactyl] [nostr:websocket] RECV <large EVENT frame suppressed, bytes=460>
[2026-03-25 13:47:41] [TRACE] [nostr_handler.c:162] [didactyl] [nostr:websocket] RECV <large EVENT frame suppressed, bytes=462>
[2026-03-25 13:47:41] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] RECV relay.damus.io:443: ["EOSE","pool_6_1774460861"]
[2026-03-25 13:47:41] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] RECV relay.primal.net:443: ["EOSE","pool_6_1774460861"]
[2026-03-25 13:47:41] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] SEND relay.damus.io:443: ["CLOSE", "pool_6_1774460861"]
[2026-03-25 13:47:41] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] SEND relay.primal.net:443: ["CLOSE", "pool_6_1774460861"]
[2026-03-25 13:47:41] [INFO ] [main.c:354] [didactyl] kind10002 query received event_count=1
[2026-03-25 13:47:41] [INFO ] [main.c:451] [didactyl] kind10002 query extracted relays=["wss://relay.damus.io","wss://relay.primal.net"]
[2026-03-25 13:47:41] [INFO ] [main.c:556] [didactyl] kind10002 wait success: relay_count=2
[2026-03-25 13:47:41] [INFO ] [main.c:558] [didactyl] kind10002 relay[0]=wss://relay.damus.io
[2026-03-25 13:47:41] [INFO ] [main.c:558] [didactyl] kind10002 relay[1]=wss://relay.primal.net
[2026-03-25 13:47:41] [INFO ] [main.c:562] [didactyl] kind10002 wait success relay snapshot: {"relay_count":2,"connected_count":2,"relays":[{"url":"wss://relay.damus.io","status":"connected","events_received":2,"events_published":6,"events_published_ok":5,"events_published_failed":1,"ping_latency_current":0,"ping_latency_avg":0,"query_latency_avg":0,"publish_latency_avg":0,"connection_uptime_start":1774460858,"last_event_time":1774460861,"last_publish_error":"rate-limited: you are noting too much"},{"url":"wss://relay.primal.net","status":"connected","events_received":2,"events_published":6,"events_published_ok":6,"events_published_failed":0,"ping_latency_current":0,"ping_latency_avg":0,"query_latency_avg":0,"publish_latency_avg":0,"connection_uptime_start":1774460858,"last_event_time":1774460861}]}
[2026-03-25 13:47:41] [INFO ] [main.c:255] [didactyl] startup checklist [11] Discover self relay list via kind 10002: ok (kind10002=2 added=0 connected=2/2)
[2026-03-25 13:47:41] [INFO ] [main.c:248] [didactyl] startup checklist [12] Subscribe admin context: begin
[2026-03-25 13:47:41] [INFO ] [main.c:1366] [didactyl] startup phase: subscribe admin context begin
[2026-03-25 13:47:41] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] SEND relay.damus.io:443: ["REQ", "pool_7_1774460861", {
"kinds": [0, 3, 10002],
"authors": ["254d7a7f68b4443f5430564eb3a726f09aea57d27e75ab2b8ef57176f9ca3dac"],
"limit": 32
}]
[2026-03-25 13:47:41] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] SEND relay.primal.net:443: ["REQ", "pool_7_1774460861", {
"kinds": [0, 3, 10002],
"authors": ["254d7a7f68b4443f5430564eb3a726f09aea57d27e75ab2b8ef57176f9ca3dac"],
"limit": 32
}]
[2026-03-25 13:47:41] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] SEND relay.damus.io:443: ["REQ", "pool_8_1774460861", {
"kinds": [1],
"authors": ["254d7a7f68b4443f5430564eb3a726f09aea57d27e75ab2b8ef57176f9ca3dac"],
"limit": 10
}]
[2026-03-25 13:47:41] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] SEND relay.primal.net:443: ["REQ", "pool_8_1774460861", {
"kinds": [1],
"authors": ["254d7a7f68b4443f5430564eb3a726f09aea57d27e75ab2b8ef57176f9ca3dac"],
"limit": 10
}]
[2026-03-25 13:47:41] [INFO ] [nostr_handler.c:2352] [didactyl] admin context subscriptions active for admin 254d7a7f68b4443f...
[2026-03-25 13:47:41] [INFO ] [main.c:1370] [didactyl] startup phase: subscribe admin context end
[2026-03-25 13:47:41] [INFO ] [main.c:258] [didactyl] startup checklist [12] Subscribe admin context: ok
[2026-03-25 13:47:41] [INFO ] [main.c:248] [didactyl] startup checklist [13] Subscribe agent self context: begin
[2026-03-25 13:47:41] [INFO ] [main.c:1374] [didactyl] startup phase: subscribe agent self context begin
[2026-03-25 13:47:41] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] SEND relay.damus.io:443: ["REQ", "pool_9_1774460861", {
"kinds": [0, 3, 10002],
"authors": ["1eb171136dbb1ba695b2f14296adfe88a1f81d4220cc7d186b0e139b8ce0cdbc"],
"limit": 64
}]
[2026-03-25 13:47:41] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] SEND relay.primal.net:443: ["REQ", "pool_9_1774460861", {
"kinds": [0, 3, 10002],
"authors": ["1eb171136dbb1ba695b2f14296adfe88a1f81d4220cc7d186b0e139b8ce0cdbc"],
"limit": 64
}]
[2026-03-25 13:47:41] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] SEND relay.damus.io:443: ["REQ", "pool_10_1774460861", {
"kinds": [1],
"authors": ["1eb171136dbb1ba695b2f14296adfe88a1f81d4220cc7d186b0e139b8ce0cdbc"],
"limit": 10
}]
[2026-03-25 13:47:41] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] SEND relay.primal.net:443: ["REQ", "pool_10_1774460861", {
"kinds": [1],
"authors": ["1eb171136dbb1ba695b2f14296adfe88a1f81d4220cc7d186b0e139b8ce0cdbc"],
"limit": 10
}]
[2026-03-25 13:47:41] [INFO ] [nostr_handler.c:2440] [didactyl] agent self-context subscriptions active for pubkey 1eb171136dbb1ba6...
[2026-03-25 13:47:41] [INFO ] [main.c:1378] [didactyl] startup phase: subscribe agent self context end
[2026-03-25 13:47:41] [INFO ] [main.c:258] [didactyl] startup checklist [13] Subscribe agent self context: ok
[2026-03-25 13:47:41] [INFO ] [main.c:248] [didactyl] startup checklist [14] Subscribe self-skill cache: begin
[2026-03-25 13:47:41] [INFO ] [main.c:1382] [didactyl] startup phase: subscribe self skill cache begin
[2026-03-25 13:47:41] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] SEND relay.damus.io:443: ["REQ", "pool_11_1774460861", {
"kinds": [31123, 31124, 10123],
"authors": ["1eb171136dbb1ba695b2f14296adfe88a1f81d4220cc7d186b0e139b8ce0cdbc"],
"limit": 300
}]
[2026-03-25 13:47:41] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] SEND relay.primal.net:443: ["REQ", "pool_11_1774460861", {
"kinds": [31123, 31124, 10123],
"authors": ["1eb171136dbb1ba695b2f14296adfe88a1f81d4220cc7d186b0e139b8ce0cdbc"],
"limit": 300
}]
[2026-03-25 13:47:41] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] SEND relay.damus.io:443: ["REQ", "pool_12_1774460861", {
"kinds": [31123],
"authors": ["254d7a7f68b4443f5430564eb3a726f09aea57d27e75ab2b8ef57176f9ca3dac"],
"limit": 150
}]
[2026-03-25 13:47:41] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] SEND relay.primal.net:443: ["REQ", "pool_12_1774460861", {
"kinds": [31123],
"authors": ["254d7a7f68b4443f5430564eb3a726f09aea57d27e75ab2b8ef57176f9ca3dac"],
"limit": 150
}]
[2026-03-25 13:47:41] [INFO ] [nostr_handler.c:2532] [didactyl] self/admin skill subscriptions active (self=1eb171136dbb1ba6..., admin=254d7a7f68b4443f...)
[2026-03-25 13:47:41] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] RECV relay.damus.io:443: ["EOSE","pool_7_1774460861"]
[2026-03-25 13:47:41] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] RECV relay.damus.io:443: ["EOSE","pool_8_1774460861"]
[2026-03-25 13:47:41] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] RECV relay.primal.net:443: ["EOSE","pool_7_1774460861"]
[2026-03-25 13:47:41] [TRACE] [nostr_handler.c:1718] [didactyl] DEBUG on_eose called: event_count=0
[2026-03-25 13:47:41] [TRACE] [nostr_handler.c:162] [didactyl] [nostr:websocket] RECV <large EVENT frame suppressed, bytes=469>
[2026-03-25 13:47:41] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] RECV relay.primal.net:443: ["EOSE","pool_8_1774460861"]
[2026-03-25 13:47:41] [TRACE] [nostr_handler.c:1718] [didactyl] DEBUG on_eose called: event_count=0
[2026-03-25 13:47:41] [TRACE] [nostr_handler.c:162] [didactyl] [nostr:websocket] RECV <large EVENT frame suppressed, bytes=460>
[2026-03-25 13:47:41] [TRACE] [nostr_handler.c:162] [didactyl] [nostr:websocket] RECV <large EVENT frame suppressed, bytes=471>
[2026-03-25 13:47:41] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] RECV relay.damus.io:443: ["EOSE","pool_9_1774460861"]
[2026-03-25 13:47:41] [TRACE] [nostr_handler.c:162] [didactyl] [nostr:websocket] RECV <large EVENT frame suppressed, bytes=462>
[2026-03-25 13:47:41] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] RECV relay.damus.io:443: ["EOSE","pool_10_1774460861"]
[2026-03-25 13:47:41] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] RECV relay.primal.net:443: ["EOSE","pool_9_1774460861"]
[2026-03-25 13:47:41] [TRACE] [nostr_handler.c:1718] [didactyl] DEBUG on_eose called: event_count=0
[2026-03-25 13:47:41] [TRACE] [nostr_handler.c:162] [didactyl] [nostr:websocket] RECV <large EVENT frame suppressed, bytes=602>
[2026-03-25 13:47:41] [INFO ] [nostr_handler.c:2151] [didactyl] self-skill cache received kind=31124 d_tag=identity_and_rules id=fac7f97a59e640152f378862fa7d16285601debbd06fe7400d5288385059b643 created_at=1774460861 via wss://relay.damus.io
[2026-03-25 13:47:41] [INFO ] [trigger_manager.c:1364] [didactyl] trigger updated d_tag=identity_and_rules action=0 enabled=1
[2026-03-25 13:47:41] [INFO ] [nostr_handler.c:1207] [didactyl] live self-skill trigger registered d_tag=identity_and_rules action=llm enabled=1
[2026-03-25 13:47:41] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] RECV relay.primal.net:443: ["EOSE","pool_10_1774460861"]
[2026-03-25 13:47:41] [TRACE] [nostr_handler.c:1718] [didactyl] DEBUG on_eose called: event_count=0
[2026-03-25 13:47:41] [TRACE] [nostr_handler.c:162] [didactyl] [nostr:websocket] RECV <large EVENT frame suppressed, bytes=538>
[2026-03-25 13:47:41] [INFO ] [nostr_handler.c:2151] [didactyl] self-skill cache received kind=10123 d_tag=- id=92e10e064611f8879a633fc11725148adc2452b899d8cade00dec822a206af54 created_at=1774460861 via wss://relay.damus.io
[2026-03-25 13:47:41] [TRACE] [nostr_handler.c:162] [didactyl] [nostr:websocket] RECV <large EVENT frame suppressed, bytes=604>
[2026-03-25 13:47:41] [INFO ] [nostr_handler.c:2151] [didactyl] self-skill cache received kind=31124 d_tag=identity_and_rules id=fac7f97a59e640152f378862fa7d16285601debbd06fe7400d5288385059b643 created_at=1774460861 via wss://relay.primal.net
[2026-03-25 13:47:41] [INFO ] [trigger_manager.c:1364] [didactyl] trigger updated d_tag=identity_and_rules action=0 enabled=1
[2026-03-25 13:47:41] [INFO ] [nostr_handler.c:1207] [didactyl] live self-skill trigger registered d_tag=identity_and_rules action=llm enabled=1
[2026-03-25 13:47:41] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] RECV relay.damus.io:443: ["EOSE","pool_11_1774460861"]
[2026-03-25 13:47:41] [TRACE] [nostr_handler.c:162] [didactyl] [nostr:websocket] RECV <large EVENT frame suppressed, bytes=540>
[2026-03-25 13:47:41] [INFO ] [nostr_handler.c:2151] [didactyl] self-skill cache received kind=10123 d_tag=- id=92e10e064611f8879a633fc11725148adc2452b899d8cade00dec822a206af54 created_at=1774460861 via wss://relay.primal.net
[2026-03-25 13:47:41] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] RECV relay.damus.io:443: ["EOSE","pool_12_1774460861"]
[2026-03-25 13:47:41] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] RECV relay.primal.net:443: ["EOSE","pool_11_1774460861"]
[2026-03-25 13:47:41] [INFO ] [nostr_handler.c:1725] [didactyl] self-skill EOSE received: cached skill events=0
[2026-03-25 13:47:41] [INFO ] [main.c:44] [didactyl] deferred trigger load begin after self-skill EOSE (event_count=0)
[2026-03-25 13:47:41] [INFO ] [trigger_manager.c:1364] [didactyl] trigger updated d_tag=identity_and_rules action=0 enabled=1
[2026-03-25 13:47:41] [INFO ] [trigger_manager.c:918] [didactyl] trigger manager loaded 1 trigger(s) from self skills (considered=1)
[2026-03-25 13:47:41] [INFO ] [main.c:54] [didactyl] deferred trigger load status: {"success":true,"count":1,"active":1,"triggers":[{"skill_d_tag":"identity_and_rules","filter_json":"{\"from\":\"admin\"}","type":"dm","action":"llm","enabled":true,"subscribed":false,"llm":"","tools":"","has_max_tokens":false,"has_temperature":false,"has_seed":false,"last_fired":0,"last_seen_created_at":0}]}
[2026-03-25 13:47:41] [INFO ] [nostr_handler.c:2757] [didactyl] self-skill cache event: kind=31124 d_tag=identity_and_rules id=fac7f97a59e640152f378862fa7d16285601debbd06fe7400d5288385059b643 created_at=1774460861
[2026-03-25 13:47:41] [INFO ] [nostr_handler.c:2757] [didactyl] self-skill cache event: kind=10123 d_tag=- id=92e10e064611f8879a633fc11725148adc2452b899d8cade00dec822a206af54 created_at=1774460861
[2026-03-25 13:47:41] [INFO ] [main.c:1449] [didactyl] startup phase: subscribe self skill cache end
[2026-03-25 13:47:41] [INFO ] [main.c:255] [didactyl] startup checklist [14] Subscribe self-skill cache: ok (skills=1 adoptions=1)
[2026-03-25 13:47:41] [INFO ] [main.c:248] [didactyl] startup checklist [15] Subscribe DMs: begin
[2026-03-25 13:47:41] [INFO ] [main.c:1453] [didactyl] startup phase: subscribe DMs begin
[2026-03-25 13:47:41] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] SEND relay.damus.io:443: ["REQ", "pool_13_1774460861", {
"kinds": [4],
"#p": ["1eb171136dbb1ba695b2f14296adfe88a1f81d4220cc7d186b0e139b8ce0cdbc"],
"since": 1774460858,
"limit": 100
}]
[2026-03-25 13:47:41] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] SEND relay.primal.net:443: ["REQ", "pool_13_1774460861", {
"kinds": [4],
"#p": ["1eb171136dbb1ba695b2f14296adfe88a1f81d4220cc7d186b0e139b8ce0cdbc"],
"since": 1774460858,
"limit": 100
}]
[2026-03-25 13:47:41] [INFO ] [nostr_handler.c:2643] [didactyl] DM subscription active for pubkey 1eb171136dbb1ba6...
[2026-03-25 13:47:41] [TRACE] [nostr_handler.c:2644] [didactyl] DEBUG DM subscription g_start_time=1774460858 now=1774460861 delta=3 relay_count=2
[2026-03-25 13:47:41] [INFO ] [main.c:1468] [didactyl] startup phase: subscribe DMs end
[2026-03-25 13:47:41] [INFO ] [main.c:258] [didactyl] startup checklist [15] Subscribe DMs: ok
[2026-03-25 13:47:41] [INFO ] [main.c:248] [didactyl] startup checklist [16] Subscribe wallet events: begin
[2026-03-25 13:47:41] [INFO ] [main.c:1472] [didactyl] startup phase: subscribe wallet events begin
[2026-03-25 13:47:41] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] SEND relay.damus.io:443: ["REQ", "pool_14_1774460861", {
"kinds": [17375, 7375, 5],
"authors": ["1eb171136dbb1ba695b2f14296adfe88a1f81d4220cc7d186b0e139b8ce0cdbc"],
"since": 1774460858,
"limit": 500
}]
[2026-03-25 13:47:41] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] SEND relay.primal.net:443: ["REQ", "pool_14_1774460861", {
"kinds": [17375, 7375, 5],
"authors": ["1eb171136dbb1ba695b2f14296adfe88a1f81d4220cc7d186b0e139b8ce0cdbc"],
"since": 1774460858,
"limit": 500
}]
[2026-03-25 13:47:41] [INFO ] [nostr_handler.c:2696] [didactyl] wallet event subscription active for pubkey 1eb171136dbb1ba6...
[2026-03-25 13:47:41] [INFO ] [main.c:1476] [didactyl] startup phase: subscribe wallet events end
[2026-03-25 13:47:41] [INFO ] [main.c:258] [didactyl] startup checklist [16] Subscribe wallet events: ok
[2026-03-25 13:47:41] [INFO ] [main.c:248] [didactyl] startup checklist [17] Initialize cashu wallet: begin
[2026-03-25 13:47:41] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] SEND relay.damus.io:443: ["REQ", "pool_15_1774460861", {
"kinds": [17375, 7375],
"authors": ["1eb171136dbb1ba695b2f14296adfe88a1f81d4220cc7d186b0e139b8ce0cdbc"]
}]
[2026-03-25 13:47:41] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] SEND relay.primal.net:443: ["REQ", "pool_15_1774460861", {
"kinds": [17375, 7375],
"authors": ["1eb171136dbb1ba695b2f14296adfe88a1f81d4220cc7d186b0e139b8ce0cdbc"]
}]
[2026-03-25 13:47:41] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] RECV relay.primal.net:443: ["EOSE","pool_12_1774460861"]
[2026-03-25 13:47:41] [TRACE] [nostr_handler.c:1718] [didactyl] DEBUG on_eose called: event_count=0
[2026-03-25 13:47:41] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] RECV relay.damus.io:443: ["EOSE","pool_13_1774460861"]
[2026-03-25 13:47:41] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] RECV relay.primal.net:443: ["EOSE","pool_13_1774460861"]
[2026-03-25 13:47:41] [TRACE] [nostr_handler.c:1718] [didactyl] DEBUG on_eose called: event_count=0
[2026-03-25 13:47:41] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] RECV relay.damus.io:443: ["EOSE","pool_14_1774460861"]
[2026-03-25 13:47:42] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] RECV relay.primal.net:443: ["EOSE","pool_14_1774460861"]
[2026-03-25 13:47:42] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] RECV relay.damus.io:443: ["EOSE","pool_15_1774460861"]
[2026-03-25 13:47:42] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] RECV relay.primal.net:443: ["EOSE","pool_15_1774460861"]
[2026-03-25 13:47:42] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] SEND relay.damus.io:443: ["CLOSE", "pool_15_1774460861"]
[2026-03-25 13:47:42] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] SEND relay.primal.net:443: ["CLOSE", "pool_15_1774460861"]
[2026-03-25 13:47:42] [WARN ] [main.c:1492] [didactyl] startup phase: cashu wallet load/create deferred to first tool call
[2026-03-25 13:47:42] [INFO ] [main.c:255] [didactyl] startup checklist [17] Initialize cashu wallet: ok (initialized; load/create deferred)
[2026-03-25 13:47:42] [WARN ] [main.c:1528] [didactyl] HTTP API disabled due to bind/init failure; agent will continue without local API
[2026-03-25 13:47:42] [TRACE] [nostr_handler.c:1499] [didactyl] sending plaintext DM content: Didactyl Test Agent has started up and is online at 2026-03-25 13:47:42 (version v0.2.19, connected relays: 2/2).
[2026-03-25 13:47:42] [TRACE] [nostr_handler.c:1491] [didactyl] sending encrypted DM event: {"pubkey":"1eb171136dbb1ba695b2f14296adfe88a1f81d4220cc7d186b0e139b8ce0cdbc","created_at":1774460862,"kind":4,"tags":[["p","254d7a7f68b4443f5430564eb3a726f09aea57d27e75ab2b8ef57176f9ca3dac"]],"content":"gpp6yprxyv2I/0Xjc25cJsHFQpkh7lv3mtoUZNInc8+LQXNNldbXkF2sKLmLxmI8VOS+8jp+n1yVrRm4GEzOQhLGhuDwc4pBQ26hnT06RRnp0tMiaJcf+Z77/MJ8hIRg68N5R0exKxWVx2V+J8Jyiv0Ds6iaCH5J3An5VEkFWN8=?iv=3vnlPkg17NUSV1InIxbKng==","id":"c5810e07dd54a83e20ab8f599c80e92453629a6e21f76ae18a1e00efde3c79ed","sig":"776e251a03c53ec4c03e3daaf05faa9c0a98bf4f9d6850b223475fa8846c085568c9ea62534c156b43cc8751a10cdb594002e600d1e04223db6a1106f4467fc7"}
[2026-03-25 13:47:42] [INFO ] [nostr_handler.c:906] [didactyl] publish DM target relays (2):
[2026-03-25 13:47:42] [INFO ] [nostr_handler.c:908] [didactyl] -> wss://relay.damus.io
[2026-03-25 13:47:42] [INFO ] [nostr_handler.c:908] [didactyl] -> wss://relay.primal.net
[2026-03-25 13:47:42] [TRACE] [nostr_handler.c:162] [didactyl] [nostr:websocket] SEND <large EVENT frame suppressed, bytes=681>
[2026-03-25 13:47:42] [TRACE] [nostr_handler.c:162] [didactyl] [nostr:websocket] SEND <large EVENT frame suppressed, bytes=683>
[2026-03-25 13:47:42] [INFO ] [nostr_handler.c:2843] [didactyl] kind 4 event published to wss://relay.damus.io (async)
[2026-03-25 13:47:42] [INFO ] [nostr_handler.c:2843] [didactyl] kind 4 event published to wss://relay.primal.net (async)
[2026-03-25 13:47:42] [INFO ] [nostr_handler.c:2852] [didactyl] sent DM c5810e07dd54a83e... to 254d7a7f68b4443f... via 2 connected relay(s)
[2026-03-25 13:47:42] [INFO ] [main.c:255] [didactyl] startup checklist [18] READY: ok (agent online; entering main poll loop)
[2026-03-25 13:47:42] [INFO ] [main.c:1571] [didactyl] entering main poll loop
[2026-03-25 13:47:42] [INFO ] [main.c:1572] [didactyl] running with pubkey 1eb171136dbb1ba695b2f14296adfe88a1f81d4220cc7d186b0e139b8ce0cdbc
[2026-03-25 13:47:42] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] RECV relay.damus.io:443: ["OK","c5810e07dd54a83e20ab8f599c80e92453629a6e21f76ae18a1e00efde3c79ed",false,"rate-limited: you are noting too much"]
[2026-03-25 13:47:42] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] RECV relay.primal.net:443: ["OK","c5810e07dd54a83e20ab8f599c80e92453629a6e21f76ae18a1e00efde3c79ed",true,""]
[2026-03-25 13:47:42] [INFO ] [main.c:1584] [didactyl] shutting down
[2026-03-25 13:47:42] [INFO ] [trigger_manager.c:1602] [didactyl] trigger manager cleaned up
[2026-03-25 13:47:42] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] SEND relay.damus.io:443: ["CLOSE", "pool_7_1774460861"]
[2026-03-25 13:47:42] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] SEND relay.primal.net:443: ["CLOSE", "pool_7_1774460861"]
[2026-03-25 13:47:42] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] SEND relay.damus.io:443: ["CLOSE", "pool_8_1774460861"]
[2026-03-25 13:47:42] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] SEND relay.primal.net:443: ["CLOSE", "pool_8_1774460861"]
[2026-03-25 13:47:42] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] SEND relay.damus.io:443: ["CLOSE", "pool_9_1774460861"]
[2026-03-25 13:47:42] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] SEND relay.primal.net:443: ["CLOSE", "pool_9_1774460861"]
[2026-03-25 13:47:42] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] SEND relay.damus.io:443: ["CLOSE", "pool_10_1774460861"]
[2026-03-25 13:47:42] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] SEND relay.primal.net:443: ["CLOSE", "pool_10_1774460861"]
[2026-03-25 13:47:42] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] SEND relay.damus.io:443: ["CLOSE", "pool_11_1774460861"]
[2026-03-25 13:47:42] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] SEND relay.primal.net:443: ["CLOSE", "pool_11_1774460861"]
[2026-03-25 13:47:42] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] SEND relay.damus.io:443: ["CLOSE", "pool_12_1774460861"]
[2026-03-25 13:47:42] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] SEND relay.primal.net:443: ["CLOSE", "pool_12_1774460861"]
[2026-03-25 13:47:42] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] SEND relay.damus.io:443: ["CLOSE", "pool_13_1774460861"]
[2026-03-25 13:47:42] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] SEND relay.primal.net:443: ["CLOSE", "pool_13_1774460861"]
[2026-03-25 13:47:42] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] SEND relay.damus.io:443: ["CLOSE", "pool_14_1774460861"]
[2026-03-25 13:47:42] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] SEND relay.primal.net:443: ["CLOSE", "pool_14_1774460861"]
[2026-03-25 13:47:42] [INFO ] [main.c:1016] Didactyl v0.2.19 starting
[2026-03-25 13:47:42] [INFO ] [nostr_handler.c:2207] [didactyl] initializing relay pool with 2 relays
[2026-03-25 13:47:42] [INFO ] [nostr_handler.c:2231] [didactyl] added relay: wss://relay.damus.io
[2026-03-25 13:47:42] [INFO ] [nostr_handler.c:2231] [didactyl] added relay: wss://relay.primal.net
[2026-03-25 13:47:42] [INFO ] [main.c:1016] Didactyl v0.2.19 starting
[2026-03-25 13:47:42] [INFO ] [nostr_handler.c:2207] [didactyl] initializing relay pool with 2 relays
[2026-03-25 13:47:42] [INFO ] [nostr_handler.c:2231] [didactyl] added relay: wss://relay.damus.io
[2026-03-25 13:47:42] [INFO ] [nostr_handler.c:2231] [didactyl] added relay: wss://relay.primal.net
[2026-03-25 13:47:43] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] SEND relay.damus.io:443: ["REQ", "pool_1_1774460862", {
"kinds": [10000],
"authors": ["1eb171136dbb1ba695b2f14296adfe88a1f81d4220cc7d186b0e139b8ce0cdbc"],
"limit": 1
}]
[2026-03-25 13:47:43] [INFO ] [main.c:1016] Didactyl v0.2.19 starting
[2026-03-25 13:47:43] [INFO ] [nostr_handler.c:2207] [didactyl] initializing relay pool with 2 relays
[2026-03-25 13:47:43] [INFO ] [nostr_handler.c:2231] [didactyl] added relay: wss://relay.damus.io
[2026-03-25 13:47:43] [INFO ] [nostr_handler.c:2231] [didactyl] added relay: wss://relay.primal.net
[2026-03-25 13:47:43] [INFO ] [main.c:1016] Didactyl v0.2.19 starting
[2026-03-25 13:47:43] [INFO ] [nostr_handler.c:2207] [didactyl] initializing relay pool with 2 relays
[2026-03-25 13:47:43] [INFO ] [nostr_handler.c:2231] [didactyl] added relay: wss://relay.damus.io
[2026-03-25 13:47:43] [INFO ] [nostr_handler.c:2231] [didactyl] added relay: wss://relay.primal.net
[2026-03-25 13:47:44] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] SEND relay.damus.io:443: ["REQ", "pool_1_1774460863", {
"kinds": [10000],
"authors": ["1eb171136dbb1ba695b2f14296adfe88a1f81d4220cc7d186b0e139b8ce0cdbc"],
"limit": 1
}]
[2026-03-25 13:47:44] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] SEND relay.primal.net:443: ["REQ", "pool_1_1774460863", {
"kinds": [10000],
"authors": ["1eb171136dbb1ba695b2f14296adfe88a1f81d4220cc7d186b0e139b8ce0cdbc"],
"limit": 1
}]
[2026-03-25 13:47:44] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] RECV relay.damus.io:443: ["EOSE","pool_1_1774460863"]
[2026-03-25 13:47:45] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] RECV relay.primal.net:443: ["EOSE","pool_1_1774460863"]
[2026-03-25 13:47:45] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] SEND relay.damus.io:443: ["CLOSE", "pool_1_1774460863"]
[2026-03-25 13:47:45] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] SEND relay.primal.net:443: ["CLOSE", "pool_1_1774460863"]
[2026-03-25 13:47:45] [INFO ] [main.c:248] [didactyl] startup checklist [01] Relay connectivity: begin
[2026-03-25 13:47:45] [INFO ] [main.c:255] [didactyl] startup checklist [01] Relay connectivity: ok (connected relays: 2/2)
[2026-03-25 13:47:45] [INFO ] [main.c:248] [didactyl] startup checklist [02] Recover runtime config from Nostr: begin
[2026-03-25 13:47:45] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] SEND relay.damus.io:443: ["REQ", "pool_2_1774460865", {
"kinds": [30078],
"authors": ["1eb171136dbb1ba695b2f14296adfe88a1f81d4220cc7d186b0e139b8ce0cdbc"],
"#d": ["agent_config"],
"limit": 1
}]
[2026-03-25 13:47:45] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] SEND relay.primal.net:443: ["REQ", "pool_2_1774460865", {
"kinds": [30078],
"authors": ["1eb171136dbb1ba695b2f14296adfe88a1f81d4220cc7d186b0e139b8ce0cdbc"],
"#d": ["agent_config"],
"limit": 1
}]
[2026-03-25 13:47:45] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] RECV relay.damus.io:443: ["EOSE","pool_2_1774460865"]
[2026-03-25 13:47:45] [TRACE] [nostr_handler.c:162] [didactyl] [nostr:websocket] RECV <large EVENT frame suppressed, bytes=702>
[2026-03-25 13:47:45] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] RECV relay.primal.net:443: ["EOSE","pool_2_1774460865"]
[2026-03-25 13:47:45] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] SEND relay.damus.io:443: ["CLOSE", "pool_2_1774460865"]
[2026-03-25 13:47:45] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] SEND relay.primal.net:443: ["CLOSE", "pool_2_1774460865"]
[2026-03-25 13:47:45] [INFO ] [main.c:258] [didactyl] startup checklist [02] Recover runtime config from Nostr: ok
[2026-03-25 13:47:45] [INFO ] [main.c:248] [didactyl] startup checklist [03] Validate LLM config: begin
[2026-03-25 13:47:45] [INFO ] [main.c:258] [didactyl] startup checklist [03] Validate LLM config: ok
[2026-03-25 13:47:45] [INFO ] [main.c:248] [didactyl] startup checklist [04] Validate admin config: begin
[2026-03-25 13:47:45] [INFO ] [main.c:258] [didactyl] startup checklist [04] Validate admin config: ok
[2026-03-25 13:47:45] [INFO ] [main.c:248] [didactyl] startup checklist [05] Initialize LLM client: begin
[2026-03-25 13:47:45] [INFO ] [main.c:258] [didactyl] startup checklist [05] Initialize LLM client: ok
[2026-03-25 13:47:45] [INFO ] [main.c:248] [didactyl] startup checklist [06] Detect first run via kind 10002: begin
[2026-03-25 13:47:45] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] SEND relay.damus.io:443: ["REQ", "pool_3_1774460865", {
"kinds": [10002],
"authors": ["1eb171136dbb1ba695b2f14296adfe88a1f81d4220cc7d186b0e139b8ce0cdbc"],
"limit": 1
}]
[2026-03-25 13:47:45] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] SEND relay.primal.net:443: ["REQ", "pool_3_1774460865", {
"kinds": [10002],
"authors": ["1eb171136dbb1ba695b2f14296adfe88a1f81d4220cc7d186b0e139b8ce0cdbc"],
"limit": 1
}]
[2026-03-25 13:47:45] [TRACE] [nostr_handler.c:162] [didactyl] [nostr:websocket] RECV <large EVENT frame suppressed, bytes=460>
[2026-03-25 13:47:45] [TRACE] [nostr_handler.c:162] [didactyl] [nostr:websocket] RECV <large EVENT frame suppressed, bytes=462>
[2026-03-25 13:47:45] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] RECV relay.damus.io:443: ["EOSE","pool_3_1774460865"]
[2026-03-25 13:47:45] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] RECV relay.primal.net:443: ["EOSE","pool_3_1774460865"]
[2026-03-25 13:47:45] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] SEND relay.damus.io:443: ["CLOSE", "pool_3_1774460865"]
[2026-03-25 13:47:45] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] SEND relay.primal.net:443: ["CLOSE", "pool_3_1774460865"]
[2026-03-25 13:47:45] [INFO ] [main.c:1245] [didactyl] startup phase: first-run detection via kind 10002 => subsequent-run
[2026-03-25 13:47:45] [INFO ] [main.c:255] [didactyl] startup checklist [06] Detect first run via kind 10002: ok (subsequent-run)
[2026-03-25 13:47:45] [INFO ] [main.c:248] [didactyl] startup checklist [07] Reconcile/persist startup state: begin
[2026-03-25 13:47:45] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] SEND relay.damus.io:443: ["REQ", "pool_4_1774460865", {
"kinds": [1],
"authors": ["1eb171136dbb1ba695b2f14296adfe88a1f81d4220cc7d186b0e139b8ce0cdbc"],
"limit": 1
}]
[2026-03-25 13:47:45] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] SEND relay.primal.net:443: ["REQ", "pool_4_1774460865", {
"kinds": [1],
"authors": ["1eb171136dbb1ba695b2f14296adfe88a1f81d4220cc7d186b0e139b8ce0cdbc"],
"limit": 1
}]
[2026-03-25 13:47:45] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] RECV relay.damus.io:443: ["EOSE","pool_4_1774460865"]
[2026-03-25 13:47:45] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] RECV relay.primal.net:443: ["EOSE","pool_4_1774460865"]
[2026-03-25 13:47:45] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] SEND relay.damus.io:443: ["CLOSE", "pool_4_1774460865"]
[2026-03-25 13:47:45] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] SEND relay.primal.net:443: ["CLOSE", "pool_4_1774460865"]
[2026-03-25 13:47:45] [TRACE] [nostr_handler.c:162] [didactyl] [nostr:websocket] SEND <large EVENT frame suppressed, bytes=480>
[2026-03-25 13:47:45] [INFO ] [nostr_handler.c:2949] [didactyl] kind 0 event published to wss://relay.damus.io (async, reason=startup_reconcile)
[2026-03-25 13:47:45] [TRACE] [nostr_handler.c:162] [didactyl] [nostr:websocket] SEND <large EVENT frame suppressed, bytes=474>
[2026-03-25 13:47:45] [INFO ] [nostr_handler.c:2949] [didactyl] kind 10002 event published to wss://relay.damus.io (async, reason=startup_reconcile)
[2026-03-25 13:47:45] [TRACE] [nostr_handler.c:162] [didactyl] [nostr:websocket] SEND <large EVENT frame suppressed, bytes=621>
[2026-03-25 13:47:45] [INFO ] [nostr_handler.c:2949] [didactyl] kind 31124 event published to wss://relay.damus.io (async, reason=startup_reconcile)
[2026-03-25 13:47:45] [TRACE] [nostr_handler.c:162] [didactyl] [nostr:websocket] SEND <large EVENT frame suppressed, bytes=553>
[2026-03-25 13:47:45] [INFO ] [nostr_handler.c:2949] [didactyl] kind 10123 event published to wss://relay.damus.io (async, reason=startup_reconcile)
[2026-03-25 13:47:45] [TRACE] [nostr_handler.c:162] [didactyl] [nostr:websocket] SEND <large EVENT frame suppressed, bytes=482>
[2026-03-25 13:47:45] [INFO ] [nostr_handler.c:2949] [didactyl] kind 0 event published to wss://relay.primal.net (async, reason=startup_reconcile)
[2026-03-25 13:47:45] [TRACE] [nostr_handler.c:162] [didactyl] [nostr:websocket] SEND <large EVENT frame suppressed, bytes=476>
[2026-03-25 13:47:45] [INFO ] [nostr_handler.c:2949] [didactyl] kind 10002 event published to wss://relay.primal.net (async, reason=startup_reconcile)
[2026-03-25 13:47:45] [TRACE] [nostr_handler.c:162] [didactyl] [nostr:websocket] SEND <large EVENT frame suppressed, bytes=623>
[2026-03-25 13:47:45] [INFO ] [nostr_handler.c:2949] [didactyl] kind 31124 event published to wss://relay.primal.net (async, reason=startup_reconcile)
[2026-03-25 13:47:45] [TRACE] [nostr_handler.c:162] [didactyl] [nostr:websocket] SEND <large EVENT frame suppressed, bytes=555>
[2026-03-25 13:47:45] [INFO ] [nostr_handler.c:2949] [didactyl] kind 10123 event published to wss://relay.primal.net (async, reason=startup_reconcile)
[2026-03-25 13:47:45] [INFO ] [nostr_handler.c:3285] [didactyl] startup publish detail: kind=0 (profile) -> wss://relay.damus.io, wss://relay.primal.net
[2026-03-25 13:47:45] [INFO ] [nostr_handler.c:3285] [didactyl] startup publish detail: kind=10002 (relay_list) -> wss://relay.damus.io, wss://relay.primal.net
[2026-03-25 13:47:45] [INFO ] [nostr_handler.c:3285] [didactyl] startup publish detail: kind=31124 (skill) -> wss://relay.damus.io, wss://relay.primal.net
[2026-03-25 13:47:45] [INFO ] [nostr_handler.c:3285] [didactyl] startup publish detail: kind=10123 (adoption_list) -> wss://relay.damus.io, wss://relay.primal.net
[2026-03-25 13:47:45] [INFO ] [nostr_handler.c:3297] [didactyl] startup publish summary: 4/4 event(s) published to at least one relay; relays used=2/2
[2026-03-25 13:47:45] [INFO ] [nostr_handler.c:906] [didactyl] publish kind event target relays (2):
[2026-03-25 13:47:45] [INFO ] [nostr_handler.c:908] [didactyl] -> wss://relay.damus.io
[2026-03-25 13:47:45] [INFO ] [nostr_handler.c:908] [didactyl] -> wss://relay.primal.net
[2026-03-25 13:47:45] [TRACE] [nostr_handler.c:162] [didactyl] [nostr:websocket] SEND <large EVENT frame suppressed, bytes=800>
[2026-03-25 13:47:45] [TRACE] [nostr_handler.c:162] [didactyl] [nostr:websocket] SEND <large EVENT frame suppressed, bytes=802>
[2026-03-25 13:47:45] [INFO ] [nostr_handler.c:2949] [didactyl] kind 30078 event published to wss://relay.damus.io (async, reason=manual_publish)
[2026-03-25 13:47:45] [INFO ] [nostr_handler.c:2949] [didactyl] kind 30078 event published to wss://relay.primal.net (async, reason=manual_publish)
[2026-03-25 13:47:45] [INFO ] [nostr_handler.c:3012] [didactyl] published kind 30078 event via 2 connected relay(s)
[2026-03-25 13:47:45] [INFO ] [nostr_handler.c:906] [didactyl] publish kind event target relays (2):
[2026-03-25 13:47:45] [INFO ] [nostr_handler.c:908] [didactyl] -> wss://relay.damus.io
[2026-03-25 13:47:45] [INFO ] [nostr_handler.c:908] [didactyl] -> wss://relay.primal.net
[2026-03-25 13:47:45] [TRACE] [nostr_handler.c:162] [didactyl] [nostr:websocket] SEND <large EVENT frame suppressed, bytes=714>
[2026-03-25 13:47:45] [TRACE] [nostr_handler.c:162] [didactyl] [nostr:websocket] SEND <large EVENT frame suppressed, bytes=716>
[2026-03-25 13:47:45] [INFO ] [nostr_handler.c:2949] [didactyl] kind 30078 event published to wss://relay.damus.io (async, reason=manual_publish)
[2026-03-25 13:47:45] [INFO ] [nostr_handler.c:2949] [didactyl] kind 30078 event published to wss://relay.primal.net (async, reason=manual_publish)
[2026-03-25 13:47:45] [INFO ] [nostr_handler.c:3012] [didactyl] published kind 30078 event via 2 connected relay(s)
[2026-03-25 13:47:45] [INFO ] [main.c:1267] [didactyl] startup phase: persisted encrypted runtime config to Nostr
[2026-03-25 13:47:45] [INFO ] [main.c:258] [didactyl] startup checklist [07] Reconcile/persist startup state: ok
[2026-03-25 13:47:45] [INFO ] [main.c:248] [didactyl] startup checklist [08] Initialize agent: begin
[2026-03-25 13:47:45] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] SEND relay.damus.io:443: ["REQ", "pool_5_1774460865", {
"kinds": [30078],
"authors": ["1eb171136dbb1ba695b2f14296adfe88a1f81d4220cc7d186b0e139b8ce0cdbc"],
"#d": ["memory"],
"limit": 1
}]
[2026-03-25 13:47:45] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] SEND relay.primal.net:443: ["REQ", "pool_5_1774460865", {
"kinds": [30078],
"authors": ["1eb171136dbb1ba695b2f14296adfe88a1f81d4220cc7d186b0e139b8ce0cdbc"],
"#d": ["memory"],
"limit": 1
}]
[2026-03-25 13:47:46] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] RECV relay.primal.net:443: ["OK","1ae930e3355b38422c24c409b0c670975ccefcb095bd55db5d9d987dcd83027c",true,""]
[2026-03-25 13:47:46] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] RECV relay.damus.io:443: ["OK","6bec760f593574f8ad5a15cbef6da59fb563419521ef1598117826156847f45e",false,"rate-limited: you are noting too much"]
[2026-03-25 13:47:46] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] RECV relay.primal.net:443: ["OK","471f23d0d023374e27c95d941106e58a403ed2b76e55f75b5d172ef7881d81c3",true,""]
[2026-03-25 13:47:46] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] RECV relay.damus.io:443: ["OK","471f23d0d023374e27c95d941106e58a403ed2b76e55f75b5d172ef7881d81c3",false,"rate-limited: you are noting too much"]
[2026-03-25 13:47:46] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] RECV relay.primal.net:443: ["OK","6bec760f593574f8ad5a15cbef6da59fb563419521ef1598117826156847f45e",true,""]
[2026-03-25 13:47:46] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] RECV relay.damus.io:443: ["OK","1ae930e3355b38422c24c409b0c670975ccefcb095bd55db5d9d987dcd83027c",false,"rate-limited: you are noting too much"]
[2026-03-25 13:47:46] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] RECV relay.primal.net:443: ["OK","a13b499ed99e4b8677654b43ef561820b2b36c27693cc4f9dc6bfac8895871f6",true,""]
[2026-03-25 13:47:46] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] RECV relay.damus.io:443: ["OK","a13b499ed99e4b8677654b43ef561820b2b36c27693cc4f9dc6bfac8895871f6",false,"rate-limited: you are noting too much"]
[2026-03-25 13:47:46] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] RECV relay.primal.net:443: ["EOSE","pool_5_1774460865"]
[2026-03-25 13:47:46] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] RECV relay.damus.io:443: ["EOSE","pool_5_1774460865"]
[2026-03-25 13:47:46] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] RECV relay.primal.net:443: ["OK","2387be3c210413b65ed853f10ddd9661a064efa6c8beb977dbe1a4ae4d7af2ec",true,""]
[2026-03-25 13:47:46] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] SEND relay.damus.io:443: ["CLOSE", "pool_5_1774460865"]
[2026-03-25 13:47:46] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] SEND relay.primal.net:443: ["CLOSE", "pool_5_1774460865"]
[2026-03-25 13:47:46] [INFO ] [main.c:258] [didactyl] startup checklist [08] Initialize agent: ok
[2026-03-25 13:47:46] [INFO ] [main.c:248] [didactyl] startup checklist [09] Initialize trigger manager: begin
[2026-03-25 13:47:46] [INFO ] [trigger_manager.c:814] [didactyl] trigger manager initialized (capacity=16)
[2026-03-25 13:47:46] [INFO ] [main.c:258] [didactyl] startup checklist [09] Initialize trigger manager: ok
[2026-03-25 13:47:46] [INFO ] [main.c:1308] [didactyl] startup phase: deferred trigger load will run after self-skill EOSE
[2026-03-25 13:47:46] [INFO ] [main.c:248] [didactyl] startup checklist [10] Load startup triggers: begin
[2026-03-25 13:47:46] [INFO ] [main.c:1311] [didactyl] startup phase: startup-config trigger load begin
[2026-03-25 13:47:46] [INFO ] [trigger_manager.c:1138] [didactyl] trigger added d_tag=identity_and_rules action=0 enabled=1
[2026-03-25 13:47:46] [INFO ] [trigger_manager.c:1021] [didactyl] startup trigger registered d_tag=identity_and_rules action=llm enabled=1
[2026-03-25 13:47:46] [INFO ] [trigger_manager.c:1029] [didactyl] trigger manager loaded 1 trigger(s) from startup config (considered=1)
[2026-03-25 13:47:46] [INFO ] [main.c:1315] [didactyl] startup phase: startup-config trigger load end
[2026-03-25 13:47:46] [INFO ] [main.c:258] [didactyl] startup checklist [10] Load startup triggers: ok
[2026-03-25 13:47:46] [INFO ] [main.c:248] [didactyl] startup checklist [11] Discover self relay list via kind 10002: begin
[2026-03-25 13:47:46] [INFO ] [main.c:327] [didactyl] kind10002 query begin: timeout_ms=5000 author=1eb171136dbb1ba6... relay_count=2
[2026-03-25 13:47:46] [INFO ] [main.c:334] [didactyl] kind10002 query relay snapshot: {"relay_count":2,"connected_count":2,"relays":[{"url":"wss://relay.damus.io","status":"connected","events_received":1,"events_published":6,"events_published_ok":0,"events_published_failed":4,"ping_latency_current":0,"ping_latency_avg":0,"query_latency_avg":0,"publish_latency_avg":0,"connection_uptime_start":1774460863,"last_event_time":1774460866,"last_publish_error":"rate-limited: you are noting too much"},{"url":"wss://relay.primal.net","status":"connected","events_received":1,"events_published":6,"events_published_ok":5,"events_published_failed":0,"ping_latency_current":0,"ping_latency_avg":0,"query_latency_avg":0,"publish_latency_avg":0,"connection_uptime_start":1774460863,"last_event_time":1774460866}]}
[2026-03-25 13:47:46] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] SEND relay.damus.io:443: ["REQ", "pool_6_1774460866", {
"kinds": [10002],
"authors": ["1eb171136dbb1ba695b2f14296adfe88a1f81d4220cc7d186b0e139b8ce0cdbc"],
"limit": 16
}]
[2026-03-25 13:47:46] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] SEND relay.primal.net:443: ["REQ", "pool_6_1774460866", {
"kinds": [10002],
"authors": ["1eb171136dbb1ba695b2f14296adfe88a1f81d4220cc7d186b0e139b8ce0cdbc"],
"limit": 16
}]
[2026-03-25 13:47:46] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] RECV relay.damus.io:443: ["OK","afeac469b7a4ad09b17a1fdfc96397196e72890e79e079d1b5db809a347f5fa7",false,"rate-limited: you are noting too much"]
[2026-03-25 13:47:46] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] RECV relay.primal.net:443: ["OK","afeac469b7a4ad09b17a1fdfc96397196e72890e79e079d1b5db809a347f5fa7",true,""]
[2026-03-25 13:47:46] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] RECV relay.damus.io:443: ["OK","2387be3c210413b65ed853f10ddd9661a064efa6c8beb977dbe1a4ae4d7af2ec",false,"rate-limited: you are noting too much"]
[2026-03-25 13:47:46] [TRACE] [nostr_handler.c:162] [didactyl] [nostr:websocket] RECV <large EVENT frame suppressed, bytes=460>
[2026-03-25 13:47:46] [TRACE] [nostr_handler.c:162] [didactyl] [nostr:websocket] RECV <large EVENT frame suppressed, bytes=462>
[2026-03-25 13:47:46] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] RECV relay.damus.io:443: ["EOSE","pool_6_1774460866"]
[2026-03-25 13:47:46] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] RECV relay.primal.net:443: ["EOSE","pool_6_1774460866"]
[2026-03-25 13:47:46] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] SEND relay.damus.io:443: ["CLOSE", "pool_6_1774460866"]
[2026-03-25 13:47:46] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] SEND relay.primal.net:443: ["CLOSE", "pool_6_1774460866"]
[2026-03-25 13:47:46] [INFO ] [main.c:354] [didactyl] kind10002 query received event_count=2
[2026-03-25 13:47:46] [INFO ] [main.c:451] [didactyl] kind10002 query extracted relays=["wss://relay.damus.io","wss://relay.primal.net"]
[2026-03-25 13:47:46] [INFO ] [main.c:556] [didactyl] kind10002 wait success: relay_count=2
[2026-03-25 13:47:46] [INFO ] [main.c:558] [didactyl] kind10002 relay[0]=wss://relay.damus.io
[2026-03-25 13:47:46] [INFO ] [main.c:558] [didactyl] kind10002 relay[1]=wss://relay.primal.net
[2026-03-25 13:47:46] [INFO ] [main.c:562] [didactyl] kind10002 wait success relay snapshot: {"relay_count":2,"connected_count":2,"relays":[{"url":"wss://relay.damus.io","status":"connected","events_received":2,"events_published":6,"events_published_ok":0,"events_published_failed":6,"ping_latency_current":0,"ping_latency_avg":0,"query_latency_avg":0,"publish_latency_avg":0,"connection_uptime_start":1774460863,"last_event_time":1774460866,"last_publish_error":"rate-limited: you are noting too much"},{"url":"wss://relay.primal.net","status":"connected","events_received":2,"events_published":6,"events_published_ok":6,"events_published_failed":0,"ping_latency_current":0,"ping_latency_avg":0,"query_latency_avg":0,"publish_latency_avg":0,"connection_uptime_start":1774460863,"last_event_time":1774460866}]}
[2026-03-25 13:47:46] [INFO ] [main.c:255] [didactyl] startup checklist [11] Discover self relay list via kind 10002: ok (kind10002=2 added=0 connected=2/2)
[2026-03-25 13:47:46] [INFO ] [main.c:248] [didactyl] startup checklist [12] Subscribe admin context: begin
[2026-03-25 13:47:46] [INFO ] [main.c:1366] [didactyl] startup phase: subscribe admin context begin
[2026-03-25 13:47:46] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] SEND relay.damus.io:443: ["REQ", "pool_7_1774460866", {
"kinds": [0, 3, 10002],
"authors": ["254d7a7f68b4443f5430564eb3a726f09aea57d27e75ab2b8ef57176f9ca3dac"],
"limit": 32
}]
[2026-03-25 13:47:46] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] SEND relay.primal.net:443: ["REQ", "pool_7_1774460866", {
"kinds": [0, 3, 10002],
"authors": ["254d7a7f68b4443f5430564eb3a726f09aea57d27e75ab2b8ef57176f9ca3dac"],
"limit": 32
}]
[2026-03-25 13:47:46] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] SEND relay.damus.io:443: ["REQ", "pool_8_1774460866", {
"kinds": [1],
"authors": ["254d7a7f68b4443f5430564eb3a726f09aea57d27e75ab2b8ef57176f9ca3dac"],
"limit": 10
}]
[2026-03-25 13:47:46] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] SEND relay.primal.net:443: ["REQ", "pool_8_1774460866", {
"kinds": [1],
"authors": ["254d7a7f68b4443f5430564eb3a726f09aea57d27e75ab2b8ef57176f9ca3dac"],
"limit": 10
}]
[2026-03-25 13:47:46] [INFO ] [nostr_handler.c:2352] [didactyl] admin context subscriptions active for admin 254d7a7f68b4443f...
[2026-03-25 13:47:46] [INFO ] [main.c:1370] [didactyl] startup phase: subscribe admin context end
[2026-03-25 13:47:46] [INFO ] [main.c:258] [didactyl] startup checklist [12] Subscribe admin context: ok
[2026-03-25 13:47:46] [INFO ] [main.c:248] [didactyl] startup checklist [13] Subscribe agent self context: begin
[2026-03-25 13:47:46] [INFO ] [main.c:1374] [didactyl] startup phase: subscribe agent self context begin
[2026-03-25 13:47:46] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] SEND relay.damus.io:443: ["REQ", "pool_9_1774460866", {
"kinds": [0, 3, 10002],
"authors": ["1eb171136dbb1ba695b2f14296adfe88a1f81d4220cc7d186b0e139b8ce0cdbc"],
"limit": 64
}]
[2026-03-25 13:47:46] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] SEND relay.primal.net:443: ["REQ", "pool_9_1774460866", {
"kinds": [0, 3, 10002],
"authors": ["1eb171136dbb1ba695b2f14296adfe88a1f81d4220cc7d186b0e139b8ce0cdbc"],
"limit": 64
}]
[2026-03-25 13:47:46] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] SEND relay.damus.io:443: ["REQ", "pool_10_1774460866", {
"kinds": [1],
"authors": ["1eb171136dbb1ba695b2f14296adfe88a1f81d4220cc7d186b0e139b8ce0cdbc"],
"limit": 10
}]
[2026-03-25 13:47:46] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] SEND relay.primal.net:443: ["REQ", "pool_10_1774460866", {
"kinds": [1],
"authors": ["1eb171136dbb1ba695b2f14296adfe88a1f81d4220cc7d186b0e139b8ce0cdbc"],
"limit": 10
}]
[2026-03-25 13:47:46] [INFO ] [nostr_handler.c:2440] [didactyl] agent self-context subscriptions active for pubkey 1eb171136dbb1ba6...
[2026-03-25 13:47:46] [INFO ] [main.c:1378] [didactyl] startup phase: subscribe agent self context end
[2026-03-25 13:47:46] [INFO ] [main.c:258] [didactyl] startup checklist [13] Subscribe agent self context: ok
[2026-03-25 13:47:46] [INFO ] [main.c:248] [didactyl] startup checklist [14] Subscribe self-skill cache: begin
[2026-03-25 13:47:46] [INFO ] [main.c:1382] [didactyl] startup phase: subscribe self skill cache begin
[2026-03-25 13:47:46] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] SEND relay.damus.io:443: ["REQ", "pool_11_1774460866", {
"kinds": [31123, 31124, 10123],
"authors": ["1eb171136dbb1ba695b2f14296adfe88a1f81d4220cc7d186b0e139b8ce0cdbc"],
"limit": 300
}]
[2026-03-25 13:47:46] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] SEND relay.primal.net:443: ["REQ", "pool_11_1774460866", {
"kinds": [31123, 31124, 10123],
"authors": ["1eb171136dbb1ba695b2f14296adfe88a1f81d4220cc7d186b0e139b8ce0cdbc"],
"limit": 300
}]
[2026-03-25 13:47:46] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] SEND relay.damus.io:443: ["REQ", "pool_12_1774460866", {
"kinds": [31123],
"authors": ["254d7a7f68b4443f5430564eb3a726f09aea57d27e75ab2b8ef57176f9ca3dac"],
"limit": 150
}]
[2026-03-25 13:47:46] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] SEND relay.primal.net:443: ["REQ", "pool_12_1774460866", {
"kinds": [31123],
"authors": ["254d7a7f68b4443f5430564eb3a726f09aea57d27e75ab2b8ef57176f9ca3dac"],
"limit": 150
}]
[2026-03-25 13:47:46] [INFO ] [nostr_handler.c:2532] [didactyl] self/admin skill subscriptions active (self=1eb171136dbb1ba6..., admin=254d7a7f68b4443f...)
[2026-03-25 13:47:46] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] RECV relay.damus.io:443: ["EOSE","pool_7_1774460866"]
[2026-03-25 13:47:46] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] RECV relay.damus.io:443: ["EOSE","pool_8_1774460866"]
[2026-03-25 13:47:46] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] RECV relay.primal.net:443: ["EOSE","pool_7_1774460866"]
[2026-03-25 13:47:46] [TRACE] [nostr_handler.c:1718] [didactyl] DEBUG on_eose called: event_count=0
[2026-03-25 13:47:46] [TRACE] [nostr_handler.c:162] [didactyl] [nostr:websocket] RECV <large EVENT frame suppressed, bytes=469>
[2026-03-25 13:47:46] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] RECV relay.primal.net:443: ["EOSE","pool_8_1774460866"]
[2026-03-25 13:47:46] [TRACE] [nostr_handler.c:1718] [didactyl] DEBUG on_eose called: event_count=0
[2026-03-25 13:47:46] [TRACE] [nostr_handler.c:162] [didactyl] [nostr:websocket] RECV <large EVENT frame suppressed, bytes=460>
[2026-03-25 13:47:46] [TRACE] [nostr_handler.c:162] [didactyl] [nostr:websocket] RECV <large EVENT frame suppressed, bytes=471>
[2026-03-25 13:47:46] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] RECV relay.damus.io:443: ["EOSE","pool_9_1774460866"]
[2026-03-25 13:47:46] [TRACE] [nostr_handler.c:162] [didactyl] [nostr:websocket] RECV <large EVENT frame suppressed, bytes=462>
[2026-03-25 13:47:46] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] RECV relay.damus.io:443: ["EOSE","pool_10_1774460866"]
[2026-03-25 13:47:46] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] RECV relay.primal.net:443: ["EOSE","pool_9_1774460866"]
[2026-03-25 13:47:46] [TRACE] [nostr_handler.c:1718] [didactyl] DEBUG on_eose called: event_count=0
[2026-03-25 13:47:46] [TRACE] [nostr_handler.c:162] [didactyl] [nostr:websocket] RECV <large EVENT frame suppressed, bytes=602>
[2026-03-25 13:47:46] [INFO ] [nostr_handler.c:2151] [didactyl] self-skill cache received kind=31124 d_tag=identity_and_rules id=fac7f97a59e640152f378862fa7d16285601debbd06fe7400d5288385059b643 created_at=1774460861 via wss://relay.damus.io
[2026-03-25 13:47:46] [INFO ] [trigger_manager.c:1364] [didactyl] trigger updated d_tag=identity_and_rules action=0 enabled=1
[2026-03-25 13:47:46] [INFO ] [nostr_handler.c:1207] [didactyl] live self-skill trigger registered d_tag=identity_and_rules action=llm enabled=1
[2026-03-25 13:47:46] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] RECV relay.primal.net:443: ["EOSE","pool_10_1774460866"]
[2026-03-25 13:47:46] [TRACE] [nostr_handler.c:1718] [didactyl] DEBUG on_eose called: event_count=0
[2026-03-25 13:47:46] [TRACE] [nostr_handler.c:162] [didactyl] [nostr:websocket] RECV <large EVENT frame suppressed, bytes=538>
[2026-03-25 13:47:46] [INFO ] [nostr_handler.c:2151] [didactyl] self-skill cache received kind=10123 d_tag=- id=92e10e064611f8879a633fc11725148adc2452b899d8cade00dec822a206af54 created_at=1774460861 via wss://relay.damus.io
[2026-03-25 13:47:46] [TRACE] [nostr_handler.c:162] [didactyl] [nostr:websocket] RECV <large EVENT frame suppressed, bytes=540>
[2026-03-25 13:47:46] [INFO ] [nostr_handler.c:2151] [didactyl] self-skill cache received kind=10123 d_tag=- id=a13b499ed99e4b8677654b43ef561820b2b36c27693cc4f9dc6bfac8895871f6 created_at=1774460865 via wss://relay.primal.net
[2026-03-25 13:47:46] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] RECV relay.damus.io:443: ["EOSE","pool_11_1774460866"]
[2026-03-25 13:47:46] [TRACE] [nostr_handler.c:162] [didactyl] [nostr:websocket] RECV <large EVENT frame suppressed, bytes=604>
[2026-03-25 13:47:46] [INFO ] [nostr_handler.c:2151] [didactyl] self-skill cache received kind=31124 d_tag=identity_and_rules id=1ae930e3355b38422c24c409b0c670975ccefcb095bd55db5d9d987dcd83027c created_at=1774460865 via wss://relay.primal.net
[2026-03-25 13:47:46] [INFO ] [trigger_manager.c:1364] [didactyl] trigger updated d_tag=identity_and_rules action=0 enabled=1
[2026-03-25 13:47:46] [INFO ] [nostr_handler.c:1207] [didactyl] live self-skill trigger registered d_tag=identity_and_rules action=llm enabled=1
[2026-03-25 13:47:46] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] RECV relay.damus.io:443: ["EOSE","pool_12_1774460866"]
[2026-03-25 13:47:46] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] RECV relay.primal.net:443: ["EOSE","pool_11_1774460866"]
[2026-03-25 13:47:46] [INFO ] [nostr_handler.c:1725] [didactyl] self-skill EOSE received: cached skill events=0
[2026-03-25 13:47:46] [INFO ] [main.c:44] [didactyl] deferred trigger load begin after self-skill EOSE (event_count=0)
[2026-03-25 13:47:46] [INFO ] [trigger_manager.c:1364] [didactyl] trigger updated d_tag=identity_and_rules action=0 enabled=1
[2026-03-25 13:47:46] [INFO ] [trigger_manager.c:918] [didactyl] trigger manager loaded 1 trigger(s) from self skills (considered=1)
[2026-03-25 13:47:46] [INFO ] [main.c:54] [didactyl] deferred trigger load status: {"success":true,"count":1,"active":1,"triggers":[{"skill_d_tag":"identity_and_rules","filter_json":"{\"from\":\"admin\"}","type":"dm","action":"llm","enabled":true,"subscribed":false,"llm":"","tools":"","has_max_tokens":false,"has_temperature":false,"has_seed":false,"last_fired":0,"last_seen_created_at":0}]}
[2026-03-25 13:47:46] [INFO ] [nostr_handler.c:2757] [didactyl] self-skill cache event: kind=31124 d_tag=identity_and_rules id=1ae930e3355b38422c24c409b0c670975ccefcb095bd55db5d9d987dcd83027c created_at=1774460865
[2026-03-25 13:47:46] [INFO ] [nostr_handler.c:2757] [didactyl] self-skill cache event: kind=10123 d_tag=- id=a13b499ed99e4b8677654b43ef561820b2b36c27693cc4f9dc6bfac8895871f6 created_at=1774460865
[2026-03-25 13:47:46] [INFO ] [main.c:1449] [didactyl] startup phase: subscribe self skill cache end
[2026-03-25 13:47:46] [INFO ] [main.c:255] [didactyl] startup checklist [14] Subscribe self-skill cache: ok (skills=1 adoptions=1)
[2026-03-25 13:47:46] [INFO ] [main.c:248] [didactyl] startup checklist [15] Subscribe DMs: begin
[2026-03-25 13:47:46] [INFO ] [main.c:1453] [didactyl] startup phase: subscribe DMs begin
[2026-03-25 13:47:46] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] SEND relay.damus.io:443: ["REQ", "pool_13_1774460866", {
"kinds": [4],
"#p": ["1eb171136dbb1ba695b2f14296adfe88a1f81d4220cc7d186b0e139b8ce0cdbc"],
"since": 1774460863,
"limit": 100
}]
[2026-03-25 13:47:46] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] SEND relay.primal.net:443: ["REQ", "pool_13_1774460866", {
"kinds": [4],
"#p": ["1eb171136dbb1ba695b2f14296adfe88a1f81d4220cc7d186b0e139b8ce0cdbc"],
"since": 1774460863,
"limit": 100
}]
[2026-03-25 13:47:46] [INFO ] [nostr_handler.c:2643] [didactyl] DM subscription active for pubkey 1eb171136dbb1ba6...
[2026-03-25 13:47:46] [TRACE] [nostr_handler.c:2644] [didactyl] DEBUG DM subscription g_start_time=1774460863 now=1774460866 delta=3 relay_count=2
[2026-03-25 13:47:46] [INFO ] [main.c:1468] [didactyl] startup phase: subscribe DMs end
[2026-03-25 13:47:46] [INFO ] [main.c:258] [didactyl] startup checklist [15] Subscribe DMs: ok
[2026-03-25 13:47:46] [INFO ] [main.c:248] [didactyl] startup checklist [16] Subscribe wallet events: begin
[2026-03-25 13:47:46] [INFO ] [main.c:1472] [didactyl] startup phase: subscribe wallet events begin
[2026-03-25 13:47:46] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] SEND relay.damus.io:443: ["REQ", "pool_14_1774460866", {
"kinds": [17375, 7375, 5],
"authors": ["1eb171136dbb1ba695b2f14296adfe88a1f81d4220cc7d186b0e139b8ce0cdbc"],
"since": 1774460863,
"limit": 500
}]
[2026-03-25 13:47:46] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] SEND relay.primal.net:443: ["REQ", "pool_14_1774460866", {
"kinds": [17375, 7375, 5],
"authors": ["1eb171136dbb1ba695b2f14296adfe88a1f81d4220cc7d186b0e139b8ce0cdbc"],
"since": 1774460863,
"limit": 500
}]
[2026-03-25 13:47:46] [INFO ] [nostr_handler.c:2696] [didactyl] wallet event subscription active for pubkey 1eb171136dbb1ba6...
[2026-03-25 13:47:46] [INFO ] [main.c:1476] [didactyl] startup phase: subscribe wallet events end
[2026-03-25 13:47:46] [INFO ] [main.c:258] [didactyl] startup checklist [16] Subscribe wallet events: ok
[2026-03-25 13:47:46] [INFO ] [main.c:248] [didactyl] startup checklist [17] Initialize cashu wallet: begin
[2026-03-25 13:47:46] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] SEND relay.damus.io:443: ["REQ", "pool_15_1774460866", {
"kinds": [17375, 7375],
"authors": ["1eb171136dbb1ba695b2f14296adfe88a1f81d4220cc7d186b0e139b8ce0cdbc"]
}]
[2026-03-25 13:47:46] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] SEND relay.primal.net:443: ["REQ", "pool_15_1774460866", {
"kinds": [17375, 7375],
"authors": ["1eb171136dbb1ba695b2f14296adfe88a1f81d4220cc7d186b0e139b8ce0cdbc"]
}]
[2026-03-25 13:47:46] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] RECV relay.primal.net:443: ["EOSE","pool_12_1774460866"]
[2026-03-25 13:47:46] [TRACE] [nostr_handler.c:1718] [didactyl] DEBUG on_eose called: event_count=0
[2026-03-25 13:47:46] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] RECV relay.damus.io:443: ["EOSE","pool_13_1774460866"]
[2026-03-25 13:47:46] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] RECV relay.primal.net:443: ["EOSE","pool_13_1774460866"]
[2026-03-25 13:47:46] [TRACE] [nostr_handler.c:1718] [didactyl] DEBUG on_eose called: event_count=0
[2026-03-25 13:47:46] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] RECV relay.damus.io:443: ["EOSE","pool_14_1774460866"]
[2026-03-25 13:47:47] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] RECV relay.primal.net:443: ["EOSE","pool_14_1774460866"]
[2026-03-25 13:47:47] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] RECV relay.damus.io:443: ["EOSE","pool_15_1774460866"]
[2026-03-25 13:47:47] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] RECV relay.primal.net:443: ["EOSE","pool_15_1774460866"]
[2026-03-25 13:47:47] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] SEND relay.damus.io:443: ["CLOSE", "pool_15_1774460866"]
[2026-03-25 13:47:47] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] SEND relay.primal.net:443: ["CLOSE", "pool_15_1774460866"]
[2026-03-25 13:47:47] [WARN ] [main.c:1492] [didactyl] startup phase: cashu wallet load/create deferred to first tool call
[2026-03-25 13:47:47] [INFO ] [main.c:255] [didactyl] startup checklist [17] Initialize cashu wallet: ok (initialized; load/create deferred)
[2026-03-25 13:47:47] [WARN ] [main.c:1528] [didactyl] HTTP API disabled due to bind/init failure; agent will continue without local API
[2026-03-25 13:47:47] [TRACE] [nostr_handler.c:1499] [didactyl] sending plaintext DM content: Didactyl Test Agent has started up and is online at 2026-03-25 13:47:47 (version v0.2.19, connected relays: 2/2).
[2026-03-25 13:47:47] [TRACE] [nostr_handler.c:1491] [didactyl] sending encrypted DM event: {"pubkey":"1eb171136dbb1ba695b2f14296adfe88a1f81d4220cc7d186b0e139b8ce0cdbc","created_at":1774460867,"kind":4,"tags":[["p","254d7a7f68b4443f5430564eb3a726f09aea57d27e75ab2b8ef57176f9ca3dac"]],"content":"XlRE2hFuH/LF70U0uW54B5tzeUDwJxOPOrNgt4ZWVszJ/EmhmnLiX6Ym7O9Viyw8QIk7pp5xA5qUtwolgnRvuKhza3ox+qMgfKt0h2NEqcmPaZMb0upJXJj1hAuc0HP+0nT/kKyJci8jtBsy5fCTA6sDwfywMwULpgU3S2rqWU8=?iv=I0N5pHlTq7SSvmgICkSOgg==","id":"f6f76facfb71305a7365040310780ba6335a2b1db95ad922b136293ab0e00298","sig":"1e8abe07ce1d67e37ec8c142fc0bcb79589e1c77ecdacac3e6e878b9e4c536aa5c6bbdd785f446483f670427ebd4c84b080945065a8bf83d5675533676892a4f"}
[2026-03-25 13:47:47] [INFO ] [nostr_handler.c:906] [didactyl] publish DM target relays (2):
[2026-03-25 13:47:47] [INFO ] [nostr_handler.c:908] [didactyl] -> wss://relay.damus.io
[2026-03-25 13:47:47] [INFO ] [nostr_handler.c:908] [didactyl] -> wss://relay.primal.net
[2026-03-25 13:47:47] [TRACE] [nostr_handler.c:162] [didactyl] [nostr:websocket] SEND <large EVENT frame suppressed, bytes=681>
[2026-03-25 13:47:47] [TRACE] [nostr_handler.c:162] [didactyl] [nostr:websocket] SEND <large EVENT frame suppressed, bytes=683>
[2026-03-25 13:47:47] [INFO ] [nostr_handler.c:2843] [didactyl] kind 4 event published to wss://relay.damus.io (async)
[2026-03-25 13:47:47] [INFO ] [nostr_handler.c:2843] [didactyl] kind 4 event published to wss://relay.primal.net (async)
[2026-03-25 13:47:47] [INFO ] [nostr_handler.c:2852] [didactyl] sent DM f6f76facfb71305a... to 254d7a7f68b4443f... via 2 connected relay(s)
[2026-03-25 13:47:47] [INFO ] [main.c:255] [didactyl] startup checklist [18] READY: ok (agent online; entering main poll loop)
[2026-03-25 13:47:47] [INFO ] [main.c:1571] [didactyl] entering main poll loop
[2026-03-25 13:47:47] [INFO ] [main.c:1572] [didactyl] running with pubkey 1eb171136dbb1ba695b2f14296adfe88a1f81d4220cc7d186b0e139b8ce0cdbc
[2026-03-25 13:47:47] [TRACE] [nostr_handler.c:162] [didactyl] [nostr:websocket] RECV <large EVENT frame suppressed, bytes=469>
[2026-03-25 13:47:47] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] RECV relay.damus.io:443: ["OK","f6f76facfb71305a7365040310780ba6335a2b1db95ad922b136293ab0e00298",false,"rate-limited: you are noting too much"]
[2026-03-25 13:47:47] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] RECV relay.primal.net:443: ["OK","f6f76facfb71305a7365040310780ba6335a2b1db95ad922b136293ab0e00298",true,""]
[2026-03-25 13:47:47] [TRACE] [nostr_handler.c:162] [didactyl] [nostr:websocket] RECV <large EVENT frame suppressed, bytes=460>
[2026-03-25 13:47:59] [INFO ] [main.c:1584] [didactyl] shutting down
[2026-03-25 13:47:59] [INFO ] [trigger_manager.c:1602] [didactyl] trigger manager cleaned up
[2026-03-25 13:47:59] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] SEND relay.damus.io:443: ["CLOSE", "pool_7_1774460866"]
[2026-03-25 13:47:59] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] SEND relay.primal.net:443: ["CLOSE", "pool_7_1774460866"]
[2026-03-25 13:47:59] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] SEND relay.damus.io:443: ["CLOSE", "pool_8_1774460866"]
[2026-03-25 13:47:59] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] SEND relay.primal.net:443: ["CLOSE", "pool_8_1774460866"]
[2026-03-25 13:47:59] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] SEND relay.damus.io:443: ["CLOSE", "pool_9_1774460866"]
[2026-03-25 13:47:59] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] SEND relay.primal.net:443: ["CLOSE", "pool_9_1774460866"]
[2026-03-25 13:47:59] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] SEND relay.damus.io:443: ["CLOSE", "pool_10_1774460866"]
[2026-03-25 13:47:59] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] SEND relay.primal.net:443: ["CLOSE", "pool_10_1774460866"]
[2026-03-25 13:47:59] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] SEND relay.damus.io:443: ["CLOSE", "pool_11_1774460866"]
[2026-03-25 13:47:59] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] SEND relay.primal.net:443: ["CLOSE", "pool_11_1774460866"]
[2026-03-25 13:47:59] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] SEND relay.damus.io:443: ["CLOSE", "pool_12_1774460866"]
[2026-03-25 13:47:59] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] SEND relay.primal.net:443: ["CLOSE", "pool_12_1774460866"]
[2026-03-25 13:47:59] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] SEND relay.damus.io:443: ["CLOSE", "pool_13_1774460866"]
[2026-03-25 13:47:59] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] SEND relay.primal.net:443: ["CLOSE", "pool_13_1774460866"]
[2026-03-25 13:47:59] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] SEND relay.damus.io:443: ["CLOSE", "pool_14_1774460866"]
[2026-03-25 13:47:59] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] SEND relay.primal.net:443: ["CLOSE", "pool_14_1774460866"]

View File

@@ -0,0 +1,441 @@
{
"run_meta": {
"run_timestamp": "2026-03-25T17:47:59.916946+00:00",
"base_url": "http://127.0.0.1:8485",
"config": "tests/results/20260325T174737Z/runtime_test_genesis.jsonc",
"binary": "didactyl_static_x86_64_debug",
"test_count": 43
},
"results": [
{
"suite": "test_conversation",
"name": "simple_greeting",
"status": "pass",
"message": "greeting response ok",
"duration_seconds": 0.6080715639982373,
"agent_errors": [],
"details": {
"response": "LLM request failed."
}
},
{
"suite": "test_conversation",
"name": "agent_responds_about_itself",
"status": "error",
"message": "AssertionError('response missing expected identity terms')",
"duration_seconds": 0.5505103840005177,
"agent_errors": [],
"details": {}
},
{
"suite": "test_conversation",
"name": "empty_message_handling",
"status": "pass",
"message": "empty message handled",
"duration_seconds": 0.4987701490026666,
"agent_errors": [],
"details": {
"success": true
}
},
{
"suite": "test_conversation",
"name": "very_long_message",
"status": "pass",
"message": "long message handled",
"duration_seconds": 0.6658556200018211,
"agent_errors": [],
"details": {
"success": true
}
},
{
"suite": "test_errors",
"name": "invalid_json_body",
"status": "pass",
"message": "invalid json rejected",
"duration_seconds": 0.12278234699988388,
"agent_errors": [],
"details": {
"status": 400
}
},
{
"suite": "test_errors",
"name": "missing_message_field",
"status": "pass",
"message": "missing message rejected",
"duration_seconds": 0.0814288569999917,
"agent_errors": [],
"details": {
"status": 400
}
},
{
"suite": "test_errors",
"name": "unknown_endpoint",
"status": "pass",
"message": "unknown endpoint 404",
"duration_seconds": 0.18177193199881003,
"agent_errors": [],
"details": {
"status": 404
}
},
{
"suite": "test_errors",
"name": "webhook_nonexistent_dtag",
"status": "pass",
"message": "nonexistent d_tag 404",
"duration_seconds": 0.18040410300091025,
"agent_errors": [],
"details": {
"status": 404
}
},
{
"suite": "test_health",
"name": "status_returns_200",
"status": "pass",
"message": "status success",
"duration_seconds": 0.18076090999966254,
"agent_errors": [],
"details": {
"keys": [
"success",
"name",
"version",
"pubkey",
"relay_count",
"connected_relays",
"active_triggers"
]
}
},
{
"suite": "test_health",
"name": "status_has_fields",
"status": "pass",
"message": "required fields present",
"duration_seconds": 0.1836120409971045,
"agent_errors": [],
"details": {}
},
{
"suite": "test_health",
"name": "context_current_returns_messages",
"status": "pass",
"message": "context current ok",
"duration_seconds": 0.17996426700119628,
"agent_errors": [],
"details": {
"message_count": 2
}
},
{
"suite": "test_health",
"name": "context_parts_has_system_prompt",
"status": "pass",
"message": "context parts ok",
"duration_seconds": 0.1812262989988085,
"agent_errors": [],
"details": {
"parts": [
"system_prompt",
"dm_history"
]
}
},
{
"suite": "test_restart",
"name": "clean_restart",
"status": "pass",
"message": "restart succeeded",
"duration_seconds": 0.36265077499774634,
"agent_errors": [],
"details": {}
},
{
"suite": "test_restart",
"name": "status_after_restart",
"status": "pass",
"message": "status stable after restart",
"duration_seconds": 0.5448084909985482,
"agent_errors": [],
"details": {
"pubkey": "1eb171136dbb1ba695b2f14296adfe88a1f81d4220cc7d186b0e139b8ce0cdbc"
}
},
{
"suite": "test_restart",
"name": "conversation_after_restart",
"status": "pass",
"message": "conversation works post-restart",
"duration_seconds": 0.7290245299991511,
"agent_errors": [],
"details": {}
},
{
"suite": "test_timeouts",
"name": "response_within_timeout",
"status": "pass",
"message": "response within timeout",
"duration_seconds": 0.5722467779996805,
"agent_errors": [],
"details": {
"elapsed": 0.5722373659991717
}
},
{
"suite": "test_timeouts",
"name": "status_responds_fast",
"status": "pass",
"message": "status fast",
"duration_seconds": 0.18072310700154048,
"agent_errors": [],
"details": {
"elapsed": 0.1807178000017302
}
},
{
"suite": "test_timeouts",
"name": "context_responds_fast",
"status": "pass",
"message": "context fast",
"duration_seconds": 0.18110287400122616,
"agent_errors": [],
"details": {
"elapsed": 0.18109712899968144
}
},
{
"suite": "test_tools_blossom",
"name": "blossom_list",
"status": "error",
"message": "AssertionError('expected tool blossom_list, got []')",
"duration_seconds": 0.6411650939990068,
"agent_errors": [],
"details": {}
},
{
"suite": "test_tools_cashu",
"name": "wallet_balance",
"status": "error",
"message": "AssertionError('expected tool cashu_wallet_balance, got []')",
"duration_seconds": 0.6616534469976614,
"agent_errors": [],
"details": {}
},
{
"suite": "test_tools_identity",
"name": "get_pubkey",
"status": "error",
"message": "AssertionError('expected tool nostr_pubkey, got []')",
"duration_seconds": 0.4017239460008568,
"agent_errors": [],
"details": {}
},
{
"suite": "test_tools_identity",
"name": "get_npub",
"status": "error",
"message": "AssertionError('expected tool nostr_npub, got []')",
"duration_seconds": 0.6410249760010629,
"agent_errors": [],
"details": {}
},
{
"suite": "test_tools_identity",
"name": "agent_identity",
"status": "error",
"message": "AssertionError('expected tool agent_identity, got []')",
"duration_seconds": 0.6553536489991529,
"agent_errors": [],
"details": {}
},
{
"suite": "test_tools_identity",
"name": "agent_version",
"status": "error",
"message": "AssertionError('expected tool agent_version, got []')",
"duration_seconds": 0.5479177609995531,
"agent_errors": [],
"details": {}
},
{
"suite": "test_tools_identity",
"name": "admin_identity",
"status": "error",
"message": "AssertionError('expected tool admin_identity, got []')",
"duration_seconds": 0.5576727590014343,
"agent_errors": [],
"details": {}
},
{
"suite": "test_tools_memory",
"name": "task_list",
"status": "error",
"message": "AssertionError('expected tool task_list, got []')",
"duration_seconds": 0.6034667280000576,
"agent_errors": [],
"details": {}
},
{
"suite": "test_tools_memory",
"name": "task_manage_add_remove",
"status": "error",
"message": "AssertionError('expected tool task_manage, got []')",
"duration_seconds": 0.5499829990003491,
"agent_errors": [],
"details": {}
},
{
"suite": "test_tools_memory",
"name": "memory_save_recall",
"status": "error",
"message": "AssertionError('expected tool memory_save, got []')",
"duration_seconds": 0.6006462539990025,
"agent_errors": [],
"details": {}
},
{
"suite": "test_tools_nostr",
"name": "nostr_post_kind1",
"status": "error",
"message": "AssertionError('expected tool nostr_post, got []')",
"duration_seconds": 0.6495320089998131,
"agent_errors": [],
"details": {}
},
{
"suite": "test_tools_nostr",
"name": "nostr_query_recent",
"status": "error",
"message": "AssertionError('expected tool nostr_query, got []')",
"duration_seconds": 0.5871804300004442,
"agent_errors": [],
"details": {}
},
{
"suite": "test_tools_nostr",
"name": "nostr_my_events",
"status": "error",
"message": "AssertionError('expected tool nostr_my_events, got []')",
"duration_seconds": 0.6059191540007305,
"agent_errors": [],
"details": {}
},
{
"suite": "test_tools_nostr",
"name": "nostr_relay_status",
"status": "error",
"message": "AssertionError('expected tool nostr_relay_status, got []')",
"duration_seconds": 0.561895247999928,
"agent_errors": [],
"details": {}
},
{
"suite": "test_tools_nostr",
"name": "nostr_dm_send",
"status": "error",
"message": "AssertionError('expected tool nostr_dm_send, got []')",
"duration_seconds": 0.7128510910006298,
"agent_errors": [],
"details": {}
},
{
"suite": "test_tools_nostr",
"name": "nostr_encode_npub",
"status": "error",
"message": "AssertionError('expected tool nostr_encode, got []')",
"duration_seconds": 0.5432366430031834,
"agent_errors": [],
"details": {}
},
{
"suite": "test_tools_nostr",
"name": "nostr_profile_get",
"status": "error",
"message": "AssertionError('expected tool nostr_profile_get, got []')",
"duration_seconds": 0.5479909720015712,
"agent_errors": [],
"details": {}
},
{
"suite": "test_tools_skills",
"name": "skill_list",
"status": "error",
"message": "AssertionError('expected tool skill_list, got []')",
"duration_seconds": 0.6087345930027368,
"agent_errors": [],
"details": {}
},
{
"suite": "test_tools_skills",
"name": "trigger_list",
"status": "error",
"message": "AssertionError('expected tool trigger_list, got []')",
"duration_seconds": 0.545774258000165,
"agent_errors": [],
"details": {}
},
{
"suite": "test_tools_skills",
"name": "skill_create_and_remove",
"status": "error",
"message": "AssertionError('expected tool skill_create, got []')",
"duration_seconds": 0.5827328599989414,
"agent_errors": [],
"details": {}
},
{
"suite": "test_tools_system",
"name": "tool_list",
"status": "error",
"message": "AssertionError('expected tool tool_list, got []')",
"duration_seconds": 0.5551958729993203,
"agent_errors": [],
"details": {}
},
{
"suite": "test_tools_system",
"name": "model_get",
"status": "error",
"message": "AssertionError('expected tool model_get, got []')",
"duration_seconds": 0.5552647679978691,
"agent_errors": [],
"details": {}
},
{
"suite": "test_tools_system",
"name": "model_list",
"status": "error",
"message": "AssertionError('expected tool model_list, got []')",
"duration_seconds": 0.7254338380007539,
"agent_errors": [],
"details": {}
},
{
"suite": "test_tools_system",
"name": "local_http_fetch",
"status": "error",
"message": "AssertionError('expected tool local_http_fetch, got []')",
"duration_seconds": 0.561345097998128,
"agent_errors": [],
"details": {}
},
{
"suite": "test_tools_system",
"name": "config_store_recall",
"status": "error",
"message": "AssertionError('expected tool config_store, got []')",
"duration_seconds": 0.5447622259998752,
"agent_errors": [],
"details": {}
}
],
"summary": {
"pass": 17,
"error": 26
}
}

View File

@@ -0,0 +1,139 @@
== Didactyl Test Results ==
Run: 2026-03-25T17:47:59.916946+00:00
Agent base URL: http://127.0.0.1:8485
Pass: 17
Fail: 0
Error: 26
Timeout: 0
Skip: 0
Total: 43
[PASS] test_conversation::simple_greeting (0.61s)
greeting response ok
[ERROR] test_conversation::agent_responds_about_itself (0.55s)
AssertionError('response missing expected identity terms')
[PASS] test_conversation::empty_message_handling (0.50s)
empty message handled
[PASS] test_conversation::very_long_message (0.67s)
long message handled
[PASS] test_errors::invalid_json_body (0.12s)
invalid json rejected
[PASS] test_errors::missing_message_field (0.08s)
missing message rejected
[PASS] test_errors::unknown_endpoint (0.18s)
unknown endpoint 404
[PASS] test_errors::webhook_nonexistent_dtag (0.18s)
nonexistent d_tag 404
[PASS] test_health::status_returns_200 (0.18s)
status success
[PASS] test_health::status_has_fields (0.18s)
required fields present
[PASS] test_health::context_current_returns_messages (0.18s)
context current ok
[PASS] test_health::context_parts_has_system_prompt (0.18s)
context parts ok
[PASS] test_restart::clean_restart (0.36s)
restart succeeded
[PASS] test_restart::status_after_restart (0.54s)
status stable after restart
[PASS] test_restart::conversation_after_restart (0.73s)
conversation works post-restart
[PASS] test_timeouts::response_within_timeout (0.57s)
response within timeout
[PASS] test_timeouts::status_responds_fast (0.18s)
status fast
[PASS] test_timeouts::context_responds_fast (0.18s)
context fast
[ERROR] test_tools_blossom::blossom_list (0.64s)
AssertionError('expected tool blossom_list, got []')
[ERROR] test_tools_cashu::wallet_balance (0.66s)
AssertionError('expected tool cashu_wallet_balance, got []')
[ERROR] test_tools_identity::get_pubkey (0.40s)
AssertionError('expected tool nostr_pubkey, got []')
[ERROR] test_tools_identity::get_npub (0.64s)
AssertionError('expected tool nostr_npub, got []')
[ERROR] test_tools_identity::agent_identity (0.66s)
AssertionError('expected tool agent_identity, got []')
[ERROR] test_tools_identity::agent_version (0.55s)
AssertionError('expected tool agent_version, got []')
[ERROR] test_tools_identity::admin_identity (0.56s)
AssertionError('expected tool admin_identity, got []')
[ERROR] test_tools_memory::task_list (0.60s)
AssertionError('expected tool task_list, got []')
[ERROR] test_tools_memory::task_manage_add_remove (0.55s)
AssertionError('expected tool task_manage, got []')
[ERROR] test_tools_memory::memory_save_recall (0.60s)
AssertionError('expected tool memory_save, got []')
[ERROR] test_tools_nostr::nostr_post_kind1 (0.65s)
AssertionError('expected tool nostr_post, got []')
[ERROR] test_tools_nostr::nostr_query_recent (0.59s)
AssertionError('expected tool nostr_query, got []')
[ERROR] test_tools_nostr::nostr_my_events (0.61s)
AssertionError('expected tool nostr_my_events, got []')
[ERROR] test_tools_nostr::nostr_relay_status (0.56s)
AssertionError('expected tool nostr_relay_status, got []')
[ERROR] test_tools_nostr::nostr_dm_send (0.71s)
AssertionError('expected tool nostr_dm_send, got []')
[ERROR] test_tools_nostr::nostr_encode_npub (0.54s)
AssertionError('expected tool nostr_encode, got []')
[ERROR] test_tools_nostr::nostr_profile_get (0.55s)
AssertionError('expected tool nostr_profile_get, got []')
[ERROR] test_tools_skills::skill_list (0.61s)
AssertionError('expected tool skill_list, got []')
[ERROR] test_tools_skills::trigger_list (0.55s)
AssertionError('expected tool trigger_list, got []')
[ERROR] test_tools_skills::skill_create_and_remove (0.58s)
AssertionError('expected tool skill_create, got []')
[ERROR] test_tools_system::tool_list (0.56s)
AssertionError('expected tool tool_list, got []')
[ERROR] test_tools_system::model_get (0.56s)
AssertionError('expected tool model_get, got []')
[ERROR] test_tools_system::model_list (0.73s)
AssertionError('expected tool model_list, got []')
[ERROR] test_tools_system::local_http_fetch (0.56s)
AssertionError('expected tool local_http_fetch, got []')
[ERROR] test_tools_system::config_store_recall (0.54s)
AssertionError('expected tool config_store, got []')

View File

@@ -0,0 +1,53 @@
{
// TEST CONFIGURATION
// Use disposable keys/accounts only.
"key": {
"nsec": "d3011e59954403fb84729ab0e9fb239ba0f0238b3f353dfb5c08a32f4b3d21a1"
},
"admin": {
"pubkey": "254d7a7f68b4443f5430564eb3a726f09aea57d27e75ab2b8ef57176f9ca3dac"
},
"dm_protocol": "nip04",
"llm": {
"provider": "openai",
"api_key": "sk-REPLACE_WITH_API_KEY",
"model": "claude-haiku-4.5",
"base_url": "https://api.anthropic.com/v1",
"max_tokens": 512,
"temperature": 0.3
},
"api": {
"enabled": true,
"port": 8485,
"bind_address": "127.0.0.1"
},
"startup_events": [
{
"kind": 0,
"content_fields": {
"name": "Didactyl Test Agent",
"about": "Automated test instance"
},
"tags": []
},
{
"kind": 10002,
"content": "",
"tags": [
["r", "wss://relay.damus.io"],
["r", "wss://relay.primal.net"]
]
},
{
"kind": 31124,
"content": "# Test Agent\n\nYou are a test agent. Respond to requests and use tools when needed.",
"tags": [
["d", "identity_and_rules"],
["app", "didactyl"],
["scope", "private"],
["trigger", "dm"],
["filter", "{\"from\":\"admin\"}"]
]
}
]
}

View File

@@ -0,0 +1,400 @@
[2026-03-25 14:02:54] [INFO ] [main.c:1016] Didactyl v0.2.19 starting
[2026-03-25 14:02:54] [INFO ] [nostr_handler.c:2207] [didactyl] initializing relay pool with 2 relays
[2026-03-25 14:02:54] [INFO ] [nostr_handler.c:2231] [didactyl] added relay: wss://relay.damus.io
[2026-03-25 14:02:54] [INFO ] [nostr_handler.c:2231] [didactyl] added relay: wss://relay.primal.net
[2026-03-25 14:02:54] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] SEND relay.damus.io:443: ["REQ", "pool_1_1774461774", {
"kinds": [10000],
"authors": ["1eb171136dbb1ba695b2f14296adfe88a1f81d4220cc7d186b0e139b8ce0cdbc"],
"limit": 1
}]
[2026-03-25 14:02:55] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] SEND relay.primal.net:443: ["REQ", "pool_1_1774461774", {
"kinds": [10000],
"authors": ["1eb171136dbb1ba695b2f14296adfe88a1f81d4220cc7d186b0e139b8ce0cdbc"],
"limit": 1
}]
[2026-03-25 14:02:55] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] RECV relay.damus.io:443: ["EOSE","pool_1_1774461774"]
[2026-03-25 14:02:55] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] RECV relay.primal.net:443: ["EOSE","pool_1_1774461774"]
[2026-03-25 14:02:55] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] SEND relay.damus.io:443: ["CLOSE", "pool_1_1774461774"]
[2026-03-25 14:02:55] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] SEND relay.primal.net:443: ["CLOSE", "pool_1_1774461774"]
[2026-03-25 14:02:55] [INFO ] [main.c:248] [didactyl] startup checklist [01] Relay connectivity: begin
[2026-03-25 14:02:55] [INFO ] [main.c:255] [didactyl] startup checklist [01] Relay connectivity: ok (connected relays: 2/2)
[2026-03-25 14:02:55] [INFO ] [main.c:248] [didactyl] startup checklist [02] Recover runtime config from Nostr: begin
[2026-03-25 14:02:55] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] SEND relay.damus.io:443: ["REQ", "pool_2_1774461775", {
"kinds": [30078],
"authors": ["1eb171136dbb1ba695b2f14296adfe88a1f81d4220cc7d186b0e139b8ce0cdbc"],
"#d": ["agent_config"],
"limit": 1
}]
[2026-03-25 14:02:55] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] SEND relay.primal.net:443: ["REQ", "pool_2_1774461775", {
"kinds": [30078],
"authors": ["1eb171136dbb1ba695b2f14296adfe88a1f81d4220cc7d186b0e139b8ce0cdbc"],
"#d": ["agent_config"],
"limit": 1
}]
[2026-03-25 14:02:55] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] RECV relay.damus.io:443: ["EOSE","pool_2_1774461775"]
[2026-03-25 14:02:55] [TRACE] [nostr_handler.c:162] [didactyl] [nostr:websocket] RECV <large EVENT frame suppressed, bytes=702>
[2026-03-25 14:02:56] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] RECV relay.primal.net:443: ["EOSE","pool_2_1774461775"]
[2026-03-25 14:02:56] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] SEND relay.damus.io:443: ["CLOSE", "pool_2_1774461775"]
[2026-03-25 14:02:56] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] SEND relay.primal.net:443: ["CLOSE", "pool_2_1774461775"]
[2026-03-25 14:02:56] [INFO ] [main.c:258] [didactyl] startup checklist [02] Recover runtime config from Nostr: ok
[2026-03-25 14:02:56] [INFO ] [main.c:248] [didactyl] startup checklist [03] Validate LLM config: begin
[2026-03-25 14:02:56] [INFO ] [main.c:258] [didactyl] startup checklist [03] Validate LLM config: ok
[2026-03-25 14:02:56] [INFO ] [main.c:248] [didactyl] startup checklist [04] Validate admin config: begin
[2026-03-25 14:02:56] [INFO ] [main.c:258] [didactyl] startup checklist [04] Validate admin config: ok
[2026-03-25 14:02:56] [INFO ] [main.c:248] [didactyl] startup checklist [05] Initialize LLM client: begin
[2026-03-25 14:02:56] [INFO ] [main.c:258] [didactyl] startup checklist [05] Initialize LLM client: ok
[2026-03-25 14:02:56] [INFO ] [main.c:248] [didactyl] startup checklist [06] Detect first run via kind 10002: begin
[2026-03-25 14:02:56] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] SEND relay.damus.io:443: ["REQ", "pool_3_1774461776", {
"kinds": [10002],
"authors": ["1eb171136dbb1ba695b2f14296adfe88a1f81d4220cc7d186b0e139b8ce0cdbc"],
"limit": 1
}]
[2026-03-25 14:02:56] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] SEND relay.primal.net:443: ["REQ", "pool_3_1774461776", {
"kinds": [10002],
"authors": ["1eb171136dbb1ba695b2f14296adfe88a1f81d4220cc7d186b0e139b8ce0cdbc"],
"limit": 1
}]
[2026-03-25 14:02:56] [TRACE] [nostr_handler.c:162] [didactyl] [nostr:websocket] RECV <large EVENT frame suppressed, bytes=460>
[2026-03-25 14:02:56] [TRACE] [nostr_handler.c:162] [didactyl] [nostr:websocket] RECV <large EVENT frame suppressed, bytes=462>
[2026-03-25 14:02:56] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] RECV relay.damus.io:443: ["EOSE","pool_3_1774461776"]
[2026-03-25 14:02:56] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] RECV relay.primal.net:443: ["EOSE","pool_3_1774461776"]
[2026-03-25 14:02:56] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] SEND relay.damus.io:443: ["CLOSE", "pool_3_1774461776"]
[2026-03-25 14:02:56] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] SEND relay.primal.net:443: ["CLOSE", "pool_3_1774461776"]
[2026-03-25 14:02:56] [INFO ] [main.c:1245] [didactyl] startup phase: first-run detection via kind 10002 => subsequent-run
[2026-03-25 14:02:56] [INFO ] [main.c:255] [didactyl] startup checklist [06] Detect first run via kind 10002: ok (subsequent-run)
[2026-03-25 14:02:56] [INFO ] [main.c:248] [didactyl] startup checklist [07] Reconcile/persist startup state: begin
[2026-03-25 14:02:56] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] SEND relay.damus.io:443: ["REQ", "pool_4_1774461776", {
"kinds": [1],
"authors": ["1eb171136dbb1ba695b2f14296adfe88a1f81d4220cc7d186b0e139b8ce0cdbc"],
"limit": 1
}]
[2026-03-25 14:02:56] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] SEND relay.primal.net:443: ["REQ", "pool_4_1774461776", {
"kinds": [1],
"authors": ["1eb171136dbb1ba695b2f14296adfe88a1f81d4220cc7d186b0e139b8ce0cdbc"],
"limit": 1
}]
[2026-03-25 14:02:56] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] RECV relay.damus.io:443: ["EOSE","pool_4_1774461776"]
[2026-03-25 14:02:56] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] RECV relay.primal.net:443: ["EOSE","pool_4_1774461776"]
[2026-03-25 14:02:56] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] SEND relay.damus.io:443: ["CLOSE", "pool_4_1774461776"]
[2026-03-25 14:02:56] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] SEND relay.primal.net:443: ["CLOSE", "pool_4_1774461776"]
[2026-03-25 14:02:56] [TRACE] [nostr_handler.c:162] [didactyl] [nostr:websocket] SEND <large EVENT frame suppressed, bytes=480>
[2026-03-25 14:02:56] [INFO ] [nostr_handler.c:2949] [didactyl] kind 0 event published to wss://relay.damus.io (async, reason=startup_reconcile)
[2026-03-25 14:02:56] [TRACE] [nostr_handler.c:162] [didactyl] [nostr:websocket] SEND <large EVENT frame suppressed, bytes=474>
[2026-03-25 14:02:56] [INFO ] [nostr_handler.c:2949] [didactyl] kind 10002 event published to wss://relay.damus.io (async, reason=startup_reconcile)
[2026-03-25 14:02:56] [TRACE] [nostr_handler.c:162] [didactyl] [nostr:websocket] SEND <large EVENT frame suppressed, bytes=621>
[2026-03-25 14:02:56] [INFO ] [nostr_handler.c:2949] [didactyl] kind 31124 event published to wss://relay.damus.io (async, reason=startup_reconcile)
[2026-03-25 14:02:56] [TRACE] [nostr_handler.c:162] [didactyl] [nostr:websocket] SEND <large EVENT frame suppressed, bytes=553>
[2026-03-25 14:02:56] [INFO ] [nostr_handler.c:2949] [didactyl] kind 10123 event published to wss://relay.damus.io (async, reason=startup_reconcile)
[2026-03-25 14:02:56] [TRACE] [nostr_handler.c:162] [didactyl] [nostr:websocket] SEND <large EVENT frame suppressed, bytes=482>
[2026-03-25 14:02:56] [INFO ] [nostr_handler.c:2949] [didactyl] kind 0 event published to wss://relay.primal.net (async, reason=startup_reconcile)
[2026-03-25 14:02:56] [TRACE] [nostr_handler.c:162] [didactyl] [nostr:websocket] SEND <large EVENT frame suppressed, bytes=476>
[2026-03-25 14:02:56] [INFO ] [nostr_handler.c:2949] [didactyl] kind 10002 event published to wss://relay.primal.net (async, reason=startup_reconcile)
[2026-03-25 14:02:56] [TRACE] [nostr_handler.c:162] [didactyl] [nostr:websocket] SEND <large EVENT frame suppressed, bytes=623>
[2026-03-25 14:02:56] [INFO ] [nostr_handler.c:2949] [didactyl] kind 31124 event published to wss://relay.primal.net (async, reason=startup_reconcile)
[2026-03-25 14:02:56] [TRACE] [nostr_handler.c:162] [didactyl] [nostr:websocket] SEND <large EVENT frame suppressed, bytes=555>
[2026-03-25 14:02:56] [INFO ] [nostr_handler.c:2949] [didactyl] kind 10123 event published to wss://relay.primal.net (async, reason=startup_reconcile)
[2026-03-25 14:02:56] [INFO ] [nostr_handler.c:3285] [didactyl] startup publish detail: kind=0 (profile) -> wss://relay.damus.io, wss://relay.primal.net
[2026-03-25 14:02:56] [INFO ] [nostr_handler.c:3285] [didactyl] startup publish detail: kind=10002 (relay_list) -> wss://relay.damus.io, wss://relay.primal.net
[2026-03-25 14:02:56] [INFO ] [nostr_handler.c:3285] [didactyl] startup publish detail: kind=31124 (skill) -> wss://relay.damus.io, wss://relay.primal.net
[2026-03-25 14:02:56] [INFO ] [nostr_handler.c:3285] [didactyl] startup publish detail: kind=10123 (adoption_list) -> wss://relay.damus.io, wss://relay.primal.net
[2026-03-25 14:02:56] [INFO ] [nostr_handler.c:3297] [didactyl] startup publish summary: 4/4 event(s) published to at least one relay; relays used=2/2
[2026-03-25 14:02:56] [INFO ] [nostr_handler.c:906] [didactyl] publish kind event target relays (2):
[2026-03-25 14:02:56] [INFO ] [nostr_handler.c:908] [didactyl] -> wss://relay.damus.io
[2026-03-25 14:02:56] [INFO ] [nostr_handler.c:908] [didactyl] -> wss://relay.primal.net
[2026-03-25 14:02:56] [TRACE] [nostr_handler.c:162] [didactyl] [nostr:websocket] SEND <large EVENT frame suppressed, bytes=800>
[2026-03-25 14:02:56] [TRACE] [nostr_handler.c:162] [didactyl] [nostr:websocket] SEND <large EVENT frame suppressed, bytes=802>
[2026-03-25 14:02:56] [INFO ] [nostr_handler.c:2949] [didactyl] kind 30078 event published to wss://relay.damus.io (async, reason=manual_publish)
[2026-03-25 14:02:56] [INFO ] [nostr_handler.c:2949] [didactyl] kind 30078 event published to wss://relay.primal.net (async, reason=manual_publish)
[2026-03-25 14:02:56] [INFO ] [nostr_handler.c:3012] [didactyl] published kind 30078 event via 2 connected relay(s)
[2026-03-25 14:02:56] [INFO ] [nostr_handler.c:906] [didactyl] publish kind event target relays (2):
[2026-03-25 14:02:56] [INFO ] [nostr_handler.c:908] [didactyl] -> wss://relay.damus.io
[2026-03-25 14:02:56] [INFO ] [nostr_handler.c:908] [didactyl] -> wss://relay.primal.net
[2026-03-25 14:02:56] [TRACE] [nostr_handler.c:162] [didactyl] [nostr:websocket] SEND <large EVENT frame suppressed, bytes=714>
[2026-03-25 14:02:56] [TRACE] [nostr_handler.c:162] [didactyl] [nostr:websocket] SEND <large EVENT frame suppressed, bytes=716>
[2026-03-25 14:02:56] [INFO ] [nostr_handler.c:2949] [didactyl] kind 30078 event published to wss://relay.damus.io (async, reason=manual_publish)
[2026-03-25 14:02:56] [INFO ] [nostr_handler.c:2949] [didactyl] kind 30078 event published to wss://relay.primal.net (async, reason=manual_publish)
[2026-03-25 14:02:56] [INFO ] [nostr_handler.c:3012] [didactyl] published kind 30078 event via 2 connected relay(s)
[2026-03-25 14:02:56] [INFO ] [main.c:1267] [didactyl] startup phase: persisted encrypted runtime config to Nostr
[2026-03-25 14:02:56] [INFO ] [main.c:258] [didactyl] startup checklist [07] Reconcile/persist startup state: ok
[2026-03-25 14:02:56] [INFO ] [main.c:248] [didactyl] startup checklist [08] Initialize agent: begin
[2026-03-25 14:02:56] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] SEND relay.damus.io:443: ["REQ", "pool_5_1774461776", {
"kinds": [30078],
"authors": ["1eb171136dbb1ba695b2f14296adfe88a1f81d4220cc7d186b0e139b8ce0cdbc"],
"#d": ["memory"],
"limit": 1
}]
[2026-03-25 14:02:56] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] SEND relay.primal.net:443: ["REQ", "pool_5_1774461776", {
"kinds": [30078],
"authors": ["1eb171136dbb1ba695b2f14296adfe88a1f81d4220cc7d186b0e139b8ce0cdbc"],
"#d": ["memory"],
"limit": 1
}]
[2026-03-25 14:02:56] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] RECV relay.primal.net:443: ["OK","2c21916b0e37e887a08e2ccb527ec01a01ef951ebb6c511c72e01482765b7e6d",true,""]
[2026-03-25 14:02:56] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] RECV relay.damus.io:443: ["OK","1b70bbaf3501de3afe041adf5547036d809dc6d23645835f49434ecd4fc48845",true,""]
[2026-03-25 14:02:56] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] RECV relay.primal.net:443: ["OK","ae44cb3eb696c7779a00075466af1323ea890d09a294e4b1bace7580d33d5391",true,""]
[2026-03-25 14:02:56] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] RECV relay.damus.io:443: ["OK","2c21916b0e37e887a08e2ccb527ec01a01ef951ebb6c511c72e01482765b7e6d",true,""]
[2026-03-25 14:02:56] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] RECV relay.primal.net:443: ["OK","1b70bbaf3501de3afe041adf5547036d809dc6d23645835f49434ecd4fc48845",true,""]
[2026-03-25 14:02:56] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] RECV relay.damus.io:443: ["OK","8766d4cbf5f85035217dc8bd7c19b3c16723fb3415eec3c3b17ad4cc63e7aa76",true,""]
[2026-03-25 14:02:56] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] RECV relay.primal.net:443: ["OK","8766d4cbf5f85035217dc8bd7c19b3c16723fb3415eec3c3b17ad4cc63e7aa76",true,""]
[2026-03-25 14:02:56] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] RECV relay.damus.io:443: ["OK","ae44cb3eb696c7779a00075466af1323ea890d09a294e4b1bace7580d33d5391",true,""]
[2026-03-25 14:02:56] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] RECV relay.primal.net:443: ["EOSE","pool_5_1774461776"]
[2026-03-25 14:02:56] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] RECV relay.damus.io:443: ["EOSE","pool_5_1774461776"]
[2026-03-25 14:02:56] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] RECV relay.primal.net:443: ["OK","9c5b8a1c0b580c4171f8e8623eaca96d61b3edac1a0c84569beddad608335358",true,""]
[2026-03-25 14:02:56] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] SEND relay.damus.io:443: ["CLOSE", "pool_5_1774461776"]
[2026-03-25 14:02:56] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] SEND relay.primal.net:443: ["CLOSE", "pool_5_1774461776"]
[2026-03-25 14:02:56] [INFO ] [main.c:258] [didactyl] startup checklist [08] Initialize agent: ok
[2026-03-25 14:02:56] [INFO ] [main.c:248] [didactyl] startup checklist [09] Initialize trigger manager: begin
[2026-03-25 14:02:56] [INFO ] [trigger_manager.c:814] [didactyl] trigger manager initialized (capacity=16)
[2026-03-25 14:02:56] [INFO ] [main.c:258] [didactyl] startup checklist [09] Initialize trigger manager: ok
[2026-03-25 14:02:56] [INFO ] [main.c:1308] [didactyl] startup phase: deferred trigger load will run after self-skill EOSE
[2026-03-25 14:02:56] [INFO ] [main.c:248] [didactyl] startup checklist [10] Load startup triggers: begin
[2026-03-25 14:02:56] [INFO ] [main.c:1311] [didactyl] startup phase: startup-config trigger load begin
[2026-03-25 14:02:56] [INFO ] [trigger_manager.c:1138] [didactyl] trigger added d_tag=identity_and_rules action=0 enabled=1
[2026-03-25 14:02:56] [INFO ] [trigger_manager.c:1021] [didactyl] startup trigger registered d_tag=identity_and_rules action=llm enabled=1
[2026-03-25 14:02:56] [INFO ] [trigger_manager.c:1029] [didactyl] trigger manager loaded 1 trigger(s) from startup config (considered=1)
[2026-03-25 14:02:56] [INFO ] [main.c:1315] [didactyl] startup phase: startup-config trigger load end
[2026-03-25 14:02:56] [INFO ] [main.c:258] [didactyl] startup checklist [10] Load startup triggers: ok
[2026-03-25 14:02:56] [INFO ] [main.c:248] [didactyl] startup checklist [11] Discover self relay list via kind 10002: begin
[2026-03-25 14:02:56] [INFO ] [main.c:327] [didactyl] kind10002 query begin: timeout_ms=5000 author=1eb171136dbb1ba6... relay_count=2
[2026-03-25 14:02:56] [INFO ] [main.c:334] [didactyl] kind10002 query relay snapshot: {"relay_count":2,"connected_count":2,"relays":[{"url":"wss://relay.damus.io","status":"connected","events_received":1,"events_published":6,"events_published_ok":4,"events_published_failed":0,"ping_latency_current":0,"ping_latency_avg":0,"query_latency_avg":0,"publish_latency_avg":0,"connection_uptime_start":1774461774,"last_event_time":1774461776},{"url":"wss://relay.primal.net","status":"connected","events_received":1,"events_published":6,"events_published_ok":5,"events_published_failed":0,"ping_latency_current":0,"ping_latency_avg":0,"query_latency_avg":0,"publish_latency_avg":0,"connection_uptime_start":1774461774,"last_event_time":1774461776}]}
[2026-03-25 14:02:56] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] SEND relay.damus.io:443: ["REQ", "pool_6_1774461776", {
"kinds": [10002],
"authors": ["1eb171136dbb1ba695b2f14296adfe88a1f81d4220cc7d186b0e139b8ce0cdbc"],
"limit": 16
}]
[2026-03-25 14:02:56] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] SEND relay.primal.net:443: ["REQ", "pool_6_1774461776", {
"kinds": [10002],
"authors": ["1eb171136dbb1ba695b2f14296adfe88a1f81d4220cc7d186b0e139b8ce0cdbc"],
"limit": 16
}]
[2026-03-25 14:02:56] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] RECV relay.damus.io:443: ["OK","9c5b8a1c0b580c4171f8e8623eaca96d61b3edac1a0c84569beddad608335358",false,"rate-limited: you are noting too much"]
[2026-03-25 14:02:56] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] RECV relay.primal.net:443: ["OK","f780c7d39a7eb3ae9585615517c53199accf1ec68f8ba3e419294f7a5e5842bb",true,""]
[2026-03-25 14:02:56] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] RECV relay.damus.io:443: ["OK","f780c7d39a7eb3ae9585615517c53199accf1ec68f8ba3e419294f7a5e5842bb",true,""]
[2026-03-25 14:02:57] [TRACE] [nostr_handler.c:162] [didactyl] [nostr:websocket] RECV <large EVENT frame suppressed, bytes=462>
[2026-03-25 14:02:57] [TRACE] [nostr_handler.c:162] [didactyl] [nostr:websocket] RECV <large EVENT frame suppressed, bytes=460>
[2026-03-25 14:02:57] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] RECV relay.primal.net:443: ["EOSE","pool_6_1774461776"]
[2026-03-25 14:02:57] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] RECV relay.damus.io:443: ["EOSE","pool_6_1774461776"]
[2026-03-25 14:02:57] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] SEND relay.damus.io:443: ["CLOSE", "pool_6_1774461776"]
[2026-03-25 14:02:57] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] SEND relay.primal.net:443: ["CLOSE", "pool_6_1774461776"]
[2026-03-25 14:02:57] [INFO ] [main.c:354] [didactyl] kind10002 query received event_count=1
[2026-03-25 14:02:57] [INFO ] [main.c:451] [didactyl] kind10002 query extracted relays=["wss://relay.damus.io","wss://relay.primal.net"]
[2026-03-25 14:02:57] [INFO ] [main.c:556] [didactyl] kind10002 wait success: relay_count=2
[2026-03-25 14:02:57] [INFO ] [main.c:558] [didactyl] kind10002 relay[0]=wss://relay.damus.io
[2026-03-25 14:02:57] [INFO ] [main.c:558] [didactyl] kind10002 relay[1]=wss://relay.primal.net
[2026-03-25 14:02:57] [INFO ] [main.c:562] [didactyl] kind10002 wait success relay snapshot: {"relay_count":2,"connected_count":2,"relays":[{"url":"wss://relay.damus.io","status":"connected","events_received":1,"events_published":6,"events_published_ok":5,"events_published_failed":1,"ping_latency_current":0,"ping_latency_avg":0,"query_latency_avg":0,"publish_latency_avg":0,"connection_uptime_start":1774461774,"last_event_time":1774461776,"last_publish_error":"rate-limited: you are noting too much"},{"url":"wss://relay.primal.net","status":"connected","events_received":2,"events_published":6,"events_published_ok":6,"events_published_failed":0,"ping_latency_current":0,"ping_latency_avg":0,"query_latency_avg":0,"publish_latency_avg":0,"connection_uptime_start":1774461774,"last_event_time":1774461776}]}
[2026-03-25 14:02:57] [INFO ] [main.c:255] [didactyl] startup checklist [11] Discover self relay list via kind 10002: ok (kind10002=2 added=0 connected=2/2)
[2026-03-25 14:02:57] [INFO ] [main.c:248] [didactyl] startup checklist [12] Subscribe admin context: begin
[2026-03-25 14:02:57] [INFO ] [main.c:1366] [didactyl] startup phase: subscribe admin context begin
[2026-03-25 14:02:57] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] SEND relay.damus.io:443: ["REQ", "pool_7_1774461777", {
"kinds": [0, 3, 10002],
"authors": ["254d7a7f68b4443f5430564eb3a726f09aea57d27e75ab2b8ef57176f9ca3dac"],
"limit": 32
}]
[2026-03-25 14:02:57] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] SEND relay.primal.net:443: ["REQ", "pool_7_1774461777", {
"kinds": [0, 3, 10002],
"authors": ["254d7a7f68b4443f5430564eb3a726f09aea57d27e75ab2b8ef57176f9ca3dac"],
"limit": 32
}]
[2026-03-25 14:02:57] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] SEND relay.damus.io:443: ["REQ", "pool_8_1774461777", {
"kinds": [1],
"authors": ["254d7a7f68b4443f5430564eb3a726f09aea57d27e75ab2b8ef57176f9ca3dac"],
"limit": 10
}]
[2026-03-25 14:02:57] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] SEND relay.primal.net:443: ["REQ", "pool_8_1774461777", {
"kinds": [1],
"authors": ["254d7a7f68b4443f5430564eb3a726f09aea57d27e75ab2b8ef57176f9ca3dac"],
"limit": 10
}]
[2026-03-25 14:02:57] [INFO ] [nostr_handler.c:2352] [didactyl] admin context subscriptions active for admin 254d7a7f68b4443f...
[2026-03-25 14:02:57] [INFO ] [main.c:1370] [didactyl] startup phase: subscribe admin context end
[2026-03-25 14:02:57] [INFO ] [main.c:258] [didactyl] startup checklist [12] Subscribe admin context: ok
[2026-03-25 14:02:57] [INFO ] [main.c:248] [didactyl] startup checklist [13] Subscribe agent self context: begin
[2026-03-25 14:02:57] [INFO ] [main.c:1374] [didactyl] startup phase: subscribe agent self context begin
[2026-03-25 14:02:57] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] SEND relay.damus.io:443: ["REQ", "pool_9_1774461777", {
"kinds": [0, 3, 10002],
"authors": ["1eb171136dbb1ba695b2f14296adfe88a1f81d4220cc7d186b0e139b8ce0cdbc"],
"limit": 64
}]
[2026-03-25 14:02:57] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] SEND relay.primal.net:443: ["REQ", "pool_9_1774461777", {
"kinds": [0, 3, 10002],
"authors": ["1eb171136dbb1ba695b2f14296adfe88a1f81d4220cc7d186b0e139b8ce0cdbc"],
"limit": 64
}]
[2026-03-25 14:02:57] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] SEND relay.damus.io:443: ["REQ", "pool_10_1774461777", {
"kinds": [1],
"authors": ["1eb171136dbb1ba695b2f14296adfe88a1f81d4220cc7d186b0e139b8ce0cdbc"],
"limit": 10
}]
[2026-03-25 14:02:57] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] SEND relay.primal.net:443: ["REQ", "pool_10_1774461777", {
"kinds": [1],
"authors": ["1eb171136dbb1ba695b2f14296adfe88a1f81d4220cc7d186b0e139b8ce0cdbc"],
"limit": 10
}]
[2026-03-25 14:02:57] [INFO ] [nostr_handler.c:2440] [didactyl] agent self-context subscriptions active for pubkey 1eb171136dbb1ba6...
[2026-03-25 14:02:57] [INFO ] [main.c:1378] [didactyl] startup phase: subscribe agent self context end
[2026-03-25 14:02:57] [INFO ] [main.c:258] [didactyl] startup checklist [13] Subscribe agent self context: ok
[2026-03-25 14:02:57] [INFO ] [main.c:248] [didactyl] startup checklist [14] Subscribe self-skill cache: begin
[2026-03-25 14:02:57] [INFO ] [main.c:1382] [didactyl] startup phase: subscribe self skill cache begin
[2026-03-25 14:02:57] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] SEND relay.damus.io:443: ["REQ", "pool_11_1774461777", {
"kinds": [31123, 31124, 10123],
"authors": ["1eb171136dbb1ba695b2f14296adfe88a1f81d4220cc7d186b0e139b8ce0cdbc"],
"limit": 300
}]
[2026-03-25 14:02:57] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] SEND relay.primal.net:443: ["REQ", "pool_11_1774461777", {
"kinds": [31123, 31124, 10123],
"authors": ["1eb171136dbb1ba695b2f14296adfe88a1f81d4220cc7d186b0e139b8ce0cdbc"],
"limit": 300
}]
[2026-03-25 14:02:57] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] SEND relay.damus.io:443: ["REQ", "pool_12_1774461777", {
"kinds": [31123],
"authors": ["254d7a7f68b4443f5430564eb3a726f09aea57d27e75ab2b8ef57176f9ca3dac"],
"limit": 150
}]
[2026-03-25 14:02:57] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] SEND relay.primal.net:443: ["REQ", "pool_12_1774461777", {
"kinds": [31123],
"authors": ["254d7a7f68b4443f5430564eb3a726f09aea57d27e75ab2b8ef57176f9ca3dac"],
"limit": 150
}]
[2026-03-25 14:02:57] [INFO ] [nostr_handler.c:2532] [didactyl] self/admin skill subscriptions active (self=1eb171136dbb1ba6..., admin=254d7a7f68b4443f...)
[2026-03-25 14:02:57] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] RECV relay.damus.io:443: ["EOSE","pool_7_1774461777"]
[2026-03-25 14:02:57] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] RECV relay.damus.io:443: ["EOSE","pool_8_1774461777"]
[2026-03-25 14:02:57] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] RECV relay.primal.net:443: ["EOSE","pool_7_1774461777"]
[2026-03-25 14:02:57] [TRACE] [nostr_handler.c:1718] [didactyl] DEBUG on_eose called: event_count=0
[2026-03-25 14:02:57] [TRACE] [nostr_handler.c:162] [didactyl] [nostr:websocket] RECV <large EVENT frame suppressed, bytes=460>
[2026-03-25 14:02:57] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] RECV relay.primal.net:443: ["EOSE","pool_8_1774461777"]
[2026-03-25 14:02:57] [TRACE] [nostr_handler.c:1718] [didactyl] DEBUG on_eose called: event_count=0
[2026-03-25 14:02:57] [TRACE] [nostr_handler.c:162] [didactyl] [nostr:websocket] RECV <large EVENT frame suppressed, bytes=469>
[2026-03-25 14:02:57] [TRACE] [nostr_handler.c:162] [didactyl] [nostr:websocket] RECV <large EVENT frame suppressed, bytes=462>
[2026-03-25 14:02:57] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] RECV relay.damus.io:443: ["EOSE","pool_9_1774461777"]
[2026-03-25 14:02:57] [TRACE] [nostr_handler.c:162] [didactyl] [nostr:websocket] RECV <large EVENT frame suppressed, bytes=471>
[2026-03-25 14:02:57] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] RECV relay.damus.io:443: ["EOSE","pool_10_1774461777"]
[2026-03-25 14:02:57] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] RECV relay.primal.net:443: ["EOSE","pool_9_1774461777"]
[2026-03-25 14:02:57] [TRACE] [nostr_handler.c:1718] [didactyl] DEBUG on_eose called: event_count=0
[2026-03-25 14:02:57] [TRACE] [nostr_handler.c:162] [didactyl] [nostr:websocket] RECV <large EVENT frame suppressed, bytes=538>
[2026-03-25 14:02:57] [INFO ] [nostr_handler.c:2151] [didactyl] self-skill cache received kind=10123 d_tag=- id=8766d4cbf5f85035217dc8bd7c19b3c16723fb3415eec3c3b17ad4cc63e7aa76 created_at=1774461776 via wss://relay.damus.io
[2026-03-25 14:02:57] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] RECV relay.primal.net:443: ["EOSE","pool_10_1774461777"]
[2026-03-25 14:02:57] [TRACE] [nostr_handler.c:1718] [didactyl] DEBUG on_eose called: event_count=0
[2026-03-25 14:02:57] [TRACE] [nostr_handler.c:162] [didactyl] [nostr:websocket] RECV <large EVENT frame suppressed, bytes=602>
[2026-03-25 14:02:57] [INFO ] [nostr_handler.c:2151] [didactyl] self-skill cache received kind=31124 d_tag=identity_and_rules id=1b70bbaf3501de3afe041adf5547036d809dc6d23645835f49434ecd4fc48845 created_at=1774461776 via wss://relay.damus.io
[2026-03-25 14:02:57] [INFO ] [trigger_manager.c:1364] [didactyl] trigger updated d_tag=identity_and_rules action=0 enabled=1
[2026-03-25 14:02:57] [INFO ] [nostr_handler.c:1207] [didactyl] live self-skill trigger registered d_tag=identity_and_rules action=llm enabled=1
[2026-03-25 14:02:57] [TRACE] [nostr_handler.c:162] [didactyl] [nostr:websocket] RECV <large EVENT frame suppressed, bytes=540>
[2026-03-25 14:02:57] [INFO ] [nostr_handler.c:2151] [didactyl] self-skill cache received kind=10123 d_tag=- id=8766d4cbf5f85035217dc8bd7c19b3c16723fb3415eec3c3b17ad4cc63e7aa76 created_at=1774461776 via wss://relay.primal.net
[2026-03-25 14:02:57] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] RECV relay.damus.io:443: ["EOSE","pool_11_1774461777"]
[2026-03-25 14:02:57] [TRACE] [nostr_handler.c:162] [didactyl] [nostr:websocket] RECV <large EVENT frame suppressed, bytes=604>
[2026-03-25 14:02:57] [INFO ] [nostr_handler.c:2151] [didactyl] self-skill cache received kind=31124 d_tag=identity_and_rules id=1b70bbaf3501de3afe041adf5547036d809dc6d23645835f49434ecd4fc48845 created_at=1774461776 via wss://relay.primal.net
[2026-03-25 14:02:57] [INFO ] [trigger_manager.c:1364] [didactyl] trigger updated d_tag=identity_and_rules action=0 enabled=1
[2026-03-25 14:02:57] [INFO ] [nostr_handler.c:1207] [didactyl] live self-skill trigger registered d_tag=identity_and_rules action=llm enabled=1
[2026-03-25 14:02:57] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] RECV relay.damus.io:443: ["EOSE","pool_12_1774461777"]
[2026-03-25 14:02:57] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] RECV relay.primal.net:443: ["EOSE","pool_11_1774461777"]
[2026-03-25 14:02:57] [INFO ] [nostr_handler.c:1725] [didactyl] self-skill EOSE received: cached skill events=0
[2026-03-25 14:02:57] [INFO ] [main.c:44] [didactyl] deferred trigger load begin after self-skill EOSE (event_count=0)
[2026-03-25 14:02:57] [INFO ] [trigger_manager.c:1364] [didactyl] trigger updated d_tag=identity_and_rules action=0 enabled=1
[2026-03-25 14:02:57] [INFO ] [trigger_manager.c:918] [didactyl] trigger manager loaded 1 trigger(s) from self skills (considered=1)
[2026-03-25 14:02:57] [INFO ] [main.c:54] [didactyl] deferred trigger load status: {"success":true,"count":1,"active":1,"triggers":[{"skill_d_tag":"identity_and_rules","filter_json":"{\"from\":\"admin\"}","type":"dm","action":"llm","enabled":true,"subscribed":false,"llm":"","tools":"","has_max_tokens":false,"has_temperature":false,"has_seed":false,"last_fired":0,"last_seen_created_at":0}]}
[2026-03-25 14:02:57] [INFO ] [nostr_handler.c:2757] [didactyl] self-skill cache event: kind=31124 d_tag=identity_and_rules id=1b70bbaf3501de3afe041adf5547036d809dc6d23645835f49434ecd4fc48845 created_at=1774461776
[2026-03-25 14:02:57] [INFO ] [nostr_handler.c:2757] [didactyl] self-skill cache event: kind=10123 d_tag=- id=8766d4cbf5f85035217dc8bd7c19b3c16723fb3415eec3c3b17ad4cc63e7aa76 created_at=1774461776
[2026-03-25 14:02:57] [INFO ] [main.c:1449] [didactyl] startup phase: subscribe self skill cache end
[2026-03-25 14:02:57] [INFO ] [main.c:255] [didactyl] startup checklist [14] Subscribe self-skill cache: ok (skills=1 adoptions=1)
[2026-03-25 14:02:57] [INFO ] [main.c:248] [didactyl] startup checklist [15] Subscribe DMs: begin
[2026-03-25 14:02:57] [INFO ] [main.c:1453] [didactyl] startup phase: subscribe DMs begin
[2026-03-25 14:02:57] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] SEND relay.damus.io:443: ["REQ", "pool_13_1774461777", {
"kinds": [4],
"#p": ["1eb171136dbb1ba695b2f14296adfe88a1f81d4220cc7d186b0e139b8ce0cdbc"],
"since": 1774461774,
"limit": 100
}]
[2026-03-25 14:02:57] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] SEND relay.primal.net:443: ["REQ", "pool_13_1774461777", {
"kinds": [4],
"#p": ["1eb171136dbb1ba695b2f14296adfe88a1f81d4220cc7d186b0e139b8ce0cdbc"],
"since": 1774461774,
"limit": 100
}]
[2026-03-25 14:02:57] [INFO ] [nostr_handler.c:2643] [didactyl] DM subscription active for pubkey 1eb171136dbb1ba6...
[2026-03-25 14:02:57] [TRACE] [nostr_handler.c:2644] [didactyl] DEBUG DM subscription g_start_time=1774461774 now=1774461777 delta=3 relay_count=2
[2026-03-25 14:02:57] [INFO ] [main.c:1468] [didactyl] startup phase: subscribe DMs end
[2026-03-25 14:02:57] [INFO ] [main.c:258] [didactyl] startup checklist [15] Subscribe DMs: ok
[2026-03-25 14:02:57] [INFO ] [main.c:248] [didactyl] startup checklist [16] Subscribe wallet events: begin
[2026-03-25 14:02:57] [INFO ] [main.c:1472] [didactyl] startup phase: subscribe wallet events begin
[2026-03-25 14:02:57] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] SEND relay.damus.io:443: ["REQ", "pool_14_1774461777", {
"kinds": [17375, 7375, 5],
"authors": ["1eb171136dbb1ba695b2f14296adfe88a1f81d4220cc7d186b0e139b8ce0cdbc"],
"since": 1774461774,
"limit": 500
}]
[2026-03-25 14:02:57] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] SEND relay.primal.net:443: ["REQ", "pool_14_1774461777", {
"kinds": [17375, 7375, 5],
"authors": ["1eb171136dbb1ba695b2f14296adfe88a1f81d4220cc7d186b0e139b8ce0cdbc"],
"since": 1774461774,
"limit": 500
}]
[2026-03-25 14:02:57] [INFO ] [nostr_handler.c:2696] [didactyl] wallet event subscription active for pubkey 1eb171136dbb1ba6...
[2026-03-25 14:02:57] [INFO ] [main.c:1476] [didactyl] startup phase: subscribe wallet events end
[2026-03-25 14:02:57] [INFO ] [main.c:258] [didactyl] startup checklist [16] Subscribe wallet events: ok
[2026-03-25 14:02:57] [INFO ] [main.c:248] [didactyl] startup checklist [17] Initialize cashu wallet: begin
[2026-03-25 14:02:57] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] SEND relay.damus.io:443: ["REQ", "pool_15_1774461777", {
"kinds": [17375, 7375],
"authors": ["1eb171136dbb1ba695b2f14296adfe88a1f81d4220cc7d186b0e139b8ce0cdbc"]
}]
[2026-03-25 14:02:57] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] SEND relay.primal.net:443: ["REQ", "pool_15_1774461777", {
"kinds": [17375, 7375],
"authors": ["1eb171136dbb1ba695b2f14296adfe88a1f81d4220cc7d186b0e139b8ce0cdbc"]
}]
[2026-03-25 14:02:57] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] RECV relay.primal.net:443: ["EOSE","pool_12_1774461777"]
[2026-03-25 14:02:57] [TRACE] [nostr_handler.c:1718] [didactyl] DEBUG on_eose called: event_count=0
[2026-03-25 14:02:57] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] RECV relay.damus.io:443: ["EOSE","pool_13_1774461777"]
[2026-03-25 14:02:57] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] RECV relay.primal.net:443: ["EOSE","pool_13_1774461777"]
[2026-03-25 14:02:57] [TRACE] [nostr_handler.c:1718] [didactyl] DEBUG on_eose called: event_count=0
[2026-03-25 14:02:57] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] RECV relay.damus.io:443: ["EOSE","pool_14_1774461777"]
[2026-03-25 14:02:57] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] RECV relay.primal.net:443: ["EOSE","pool_14_1774461777"]
[2026-03-25 14:02:57] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] RECV relay.damus.io:443: ["EOSE","pool_15_1774461777"]
[2026-03-25 14:02:57] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] RECV relay.primal.net:443: ["EOSE","pool_15_1774461777"]
[2026-03-25 14:02:57] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] SEND relay.damus.io:443: ["CLOSE", "pool_15_1774461777"]
[2026-03-25 14:02:57] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] SEND relay.primal.net:443: ["CLOSE", "pool_15_1774461777"]
[2026-03-25 14:02:57] [WARN ] [main.c:1492] [didactyl] startup phase: cashu wallet load/create deferred to first tool call
[2026-03-25 14:02:57] [INFO ] [main.c:255] [didactyl] startup checklist [17] Initialize cashu wallet: ok (initialized; load/create deferred)
[2026-03-25 14:02:57] [INFO ] [http_api.c:1570] [didactyl] http api listening on http://127.0.0.1:8485
[2026-03-25 14:02:57] [INFO ] [main.c:1532] [didactyl] HTTP API listening at http://127.0.0.1:8485
[2026-03-25 14:02:57] [INFO ] [main.c:1535] [didactyl] HTTP API endpoints: http://127.0.0.1:8485/api/context/current http://127.0.0.1:8485/api/context/parts
[2026-03-25 14:02:57] [TRACE] [nostr_handler.c:1499] [didactyl] sending plaintext DM content: Didactyl Test Agent has started up and is online at 2026-03-25 14:02:57 (version v0.2.19, connected relays: 2/2).
[2026-03-25 14:02:57] [TRACE] [nostr_handler.c:1491] [didactyl] sending encrypted DM event: {"pubkey":"1eb171136dbb1ba695b2f14296adfe88a1f81d4220cc7d186b0e139b8ce0cdbc","created_at":1774461777,"kind":4,"tags":[["p","254d7a7f68b4443f5430564eb3a726f09aea57d27e75ab2b8ef57176f9ca3dac"]],"content":"7vDBamgyRYv/n4ltqkKInvjb4EB7NOxO3xAHvHmt2vCC3I7D9OL6ZyxiAyQeWhUMFcUsLHenGvymbE1HVXunUdx/JOJDqwGsFvW9dFkGz3wY9vGE7KrFqz6VK6d07mQoDx5Cq2NrPdlW6Krf775db4tp6+ojecgVyja/D5rUiL4=?iv=LSn2WshlIWsAIuphL6UPiA==","id":"f2e4cffdde98d0102be90a9a9e8e1f978824d28500d6f6881e6c95d1b32b20c8","sig":"645c17011a904ccadc367244133e74cbd206fa8a7f0ae686ef0c6d4af02cfe2cd01b80657df52a31c983ebec5383b7ee23e7616cf94d89e4678b0b5b7cd079e6"}
[2026-03-25 14:02:57] [INFO ] [nostr_handler.c:906] [didactyl] publish DM target relays (2):
[2026-03-25 14:02:57] [INFO ] [nostr_handler.c:908] [didactyl] -> wss://relay.damus.io
[2026-03-25 14:02:57] [INFO ] [nostr_handler.c:908] [didactyl] -> wss://relay.primal.net
[2026-03-25 14:02:57] [TRACE] [nostr_handler.c:162] [didactyl] [nostr:websocket] SEND <large EVENT frame suppressed, bytes=681>
[2026-03-25 14:02:57] [TRACE] [nostr_handler.c:162] [didactyl] [nostr:websocket] SEND <large EVENT frame suppressed, bytes=683>
[2026-03-25 14:02:57] [INFO ] [nostr_handler.c:2843] [didactyl] kind 4 event published to wss://relay.damus.io (async)
[2026-03-25 14:02:57] [INFO ] [nostr_handler.c:2843] [didactyl] kind 4 event published to wss://relay.primal.net (async)
[2026-03-25 14:02:57] [INFO ] [nostr_handler.c:2852] [didactyl] sent DM f2e4cffdde98d010... to 254d7a7f68b4443f... via 2 connected relay(s)
[2026-03-25 14:02:57] [INFO ] [main.c:255] [didactyl] startup checklist [18] READY: ok (agent online; entering main poll loop)
[2026-03-25 14:02:57] [INFO ] [main.c:1571] [didactyl] entering main poll loop
[2026-03-25 14:02:57] [INFO ] [main.c:1572] [didactyl] running with pubkey 1eb171136dbb1ba695b2f14296adfe88a1f81d4220cc7d186b0e139b8ce0cdbc
[2026-03-25 14:02:57] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] RECV relay.damus.io:443: ["OK","f2e4cffdde98d0102be90a9a9e8e1f978824d28500d6f6881e6c95d1b32b20c8",false,"rate-limited: you are noting too much"]
[2026-03-25 14:02:57] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] RECV relay.primal.net:443: ["OK","f2e4cffdde98d0102be90a9a9e8e1f978824d28500d6f6881e6c95d1b32b20c8",true,""]
[2026-03-25 14:02:58] [INFO ] [llm.c:76] [didactyl] llm request: method=POST url=https://api.anthropic.com/v1/chat/completions body_bytes=27512 body_preview={"model":"claude-haiku-4.5","max_tokens":512,"temperature":0.3,"messages":[{"role":"system","content":"# Test Agent\n\nYou are a test agent. Respond to requests and use tools when needed."},{"role":"user","content":"List available models"},{"role":"user","content":"List available models","_ts":1774461778}],"tools":[{"type":"function","function":{"name":"nostr_post","description":"Publish a Nostr event to connected relays","parameters":{"type":"object","properties":{"kind":{"type":"integer","description":"Nostr event kind number (for example 1 for note, 7 for reaction, 30023 for longform)"},"content":{"type":"string","description":"Event content/body text to publish"},"tags":{"type":"array","description":"Optional Nostr tags array, e.g. [[\"d\",\"my-skill\"],[\"t\",\"nostr\"]]","items":{"type":"array","items":{"type":"string"}}}},"required":["kind","content"]}}},{"type":"function","function":{"name":"nostr_query","description":"Query events from relays using a Nostr filter","parameters":{"type":"object","properties":{"filter":{"type":"object","description":"Nostr filter object (authors, kinds, ids, since, until, limit, and tag filters)"},"timeout_ms":{"type":"integer","description":"Optional query timeout in milliseconds"}},"required":["filter"]}}},{"type":"function","function":{"name":"local_shell_exec","description":"Execute a shell command and return stdout/stderr","parameters":{"type":"object","properties":{"command":{"type":"string","description":"Shell command to execute in the configured working directory"}},"required":["command"]}}},{"type":"function","function":{"name":"local_file_read","description":"Read a local file as text from the configured working directory","parameters":{"type":"object","properties":{"path":{"type":"string","description":"Path to file to read (relative to configured working directory)"},"max_bytes":{"type":"integer","description":"Optional maximum bytes to return"}},"required":["path"]}}},{"type":"function","function":{"name":"local_file_write","description":"Write text content to a local file in the configured working directory","parameters":{"type":"object","properties":{"path":{"type":"string","description":"Path to file to write (relative to configured working directory)"},"content":{"type":"string","description":"Text content to write"},"append":{"type":"boolean","description":"When true, append to file instead of overwriting"}},"required":["path","content"]}}},{"type":"function","function":{"name":"nostr_post_readme","description":"Publish README.md as kind 30023 with deterministic d tag readme.md","parameters":{"type":"object","properties":{},"required":[]}}},{"type":"function","function":{"name":"nostr_delete","description":"Request deletion of one or more previously published events (NIP-09 kind 5)","parameters":{"type":"object","properties":{"event_ids":{"type":"array","description":"Event IDs to request deletion for","items":{"type":"string"}},"kinds":{"type":"array","description":"Optional kinds corresponding to event_ids entries","items":{"type":"integer"}},"reason":{"type":"string","description":"Optional human-readable reason"}},"required":["event_ids"]}}},{"type":"function","function":{"name":"nostr_react","description":"React to a Nostr event with like/dislike/emoji (NIP-25 kind 7)","parameters":{"type":"object","properties":{"event_id":{"type":"string","description":"Target event ID to react to"},"event_pubkey":{"type":"string","description":"Author pubkey of target event"},"event_kind":{"type":"integer","description":"Optional kind of target event"},"reaction":{"type":"string","description":"Reaction content such as +, -, ❤️, or emoji"}},"required":["event_id","event_pubkey"]}}},{"type":"function","function":{"name":"nostr_profile_get","description":"Look up a Nostr profile (kind 0 metadata) by pubkey","parameters":{"type":"object","properties":{"pubkey":{"type":"string","description":"Hex pubkey of the profile to fetch"}},"required":["pubkey"]}}},{"type":"function","func...
[2026-03-25 14:02:58] [ERROR] [llm.c:93] [didactyl] llm http request failed: status=401
[2026-03-25 14:02:58] [WARN ] [llm.c:98] [didactyl] llm error response: {"error":{"code":"authentication_error","message":"Invalid Anthropic API Key","type":"invalid_request_error","param":null}}
[2026-03-25 14:02:59] [INFO ] [llm.c:76] [didactyl] llm request: method=POST url=https://api.anthropic.com/v1/chat/completions body_bytes=27528 body_preview={"model":"claude-haiku-4.5","max_tokens":512,"temperature":0.3,"messages":[{"role":"system","content":"# Test Agent\n\nYou are a test agent. Respond to requests and use tools when needed."},{"role":"user","content":"Fetch https://httpbin.org/get"},{"role":"user","content":"Fetch https://httpbin.org/get","_ts":1774461779}],"tools":[{"type":"function","function":{"name":"nostr_post","description":"Publish a Nostr event to connected relays","parameters":{"type":"object","properties":{"kind":{"type":"integer","description":"Nostr event kind number (for example 1 for note, 7 for reaction, 30023 for longform)"},"content":{"type":"string","description":"Event content/body text to publish"},"tags":{"type":"array","description":"Optional Nostr tags array, e.g. [[\"d\",\"my-skill\"],[\"t\",\"nostr\"]]","items":{"type":"array","items":{"type":"string"}}}},"required":["kind","content"]}}},{"type":"function","function":{"name":"nostr_query","description":"Query events from relays using a Nostr filter","parameters":{"type":"object","properties":{"filter":{"type":"object","description":"Nostr filter object (authors, kinds, ids, since, until, limit, and tag filters)"},"timeout_ms":{"type":"integer","description":"Optional query timeout in milliseconds"}},"required":["filter"]}}},{"type":"function","function":{"name":"local_shell_exec","description":"Execute a shell command and return stdout/stderr","parameters":{"type":"object","properties":{"command":{"type":"string","description":"Shell command to execute in the configured working directory"}},"required":["command"]}}},{"type":"function","function":{"name":"local_file_read","description":"Read a local file as text from the configured working directory","parameters":{"type":"object","properties":{"path":{"type":"string","description":"Path to file to read (relative to configured working directory)"},"max_bytes":{"type":"integer","description":"Optional maximum bytes to return"}},"required":["path"]}}},{"type":"function","function":{"name":"local_file_write","description":"Write text content to a local file in the configured working directory","parameters":{"type":"object","properties":{"path":{"type":"string","description":"Path to file to write (relative to configured working directory)"},"content":{"type":"string","description":"Text content to write"},"append":{"type":"boolean","description":"When true, append to file instead of overwriting"}},"required":["path","content"]}}},{"type":"function","function":{"name":"nostr_post_readme","description":"Publish README.md as kind 30023 with deterministic d tag readme.md","parameters":{"type":"object","properties":{},"required":[]}}},{"type":"function","function":{"name":"nostr_delete","description":"Request deletion of one or more previously published events (NIP-09 kind 5)","parameters":{"type":"object","properties":{"event_ids":{"type":"array","description":"Event IDs to request deletion for","items":{"type":"string"}},"kinds":{"type":"array","description":"Optional kinds corresponding to event_ids entries","items":{"type":"integer"}},"reason":{"type":"string","description":"Optional human-readable reason"}},"required":["event_ids"]}}},{"type":"function","function":{"name":"nostr_react","description":"React to a Nostr event with like/dislike/emoji (NIP-25 kind 7)","parameters":{"type":"object","properties":{"event_id":{"type":"string","description":"Target event ID to react to"},"event_pubkey":{"type":"string","description":"Author pubkey of target event"},"event_kind":{"type":"integer","description":"Optional kind of target event"},"reaction":{"type":"string","description":"Reaction content such as +, -, ❤️, or emoji"}},"required":["event_id","event_pubkey"]}}},{"type":"function","function":{"name":"nostr_profile_get","description":"Look up a Nostr profile (kind 0 metadata) by pubkey","parameters":{"type":"object","properties":{"pubkey":{"type":"string","description":"Hex pubkey of the profile to fetch"}},"required":["pubkey"]}}},{"type":...
[2026-03-25 14:02:59] [ERROR] [llm.c:93] [didactyl] llm http request failed: status=401
[2026-03-25 14:02:59] [WARN ] [llm.c:98] [didactyl] llm error response: {"error":{"code":"authentication_error","message":"Invalid Anthropic API Key","type":"invalid_request_error","param":null}}
[2026-03-25 14:03:00] [INFO ] [llm.c:76] [didactyl] llm request: method=POST url=https://api.anthropic.com/v1/chat/completions body_bytes=27634 body_preview={"model":"claude-haiku-4.5","max_tokens":512,"temperature":0.3,"messages":[{"role":"system","content":"# Test Agent\n\nYou are a test agent. Respond to requests and use tools when needed."},{"role":"user","content":"Store a test config with d_tag test_harness_probe containing hello, then recall it"},{"role":"user","content":"Store a test config with d_tag test_harness_probe containing hello, then recall it","_ts":1774461780}],"tools":[{"type":"function","function":{"name":"nostr_post","description":"Publish a Nostr event to connected relays","parameters":{"type":"object","properties":{"kind":{"type":"integer","description":"Nostr event kind number (for example 1 for note, 7 for reaction, 30023 for longform)"},"content":{"type":"string","description":"Event content/body text to publish"},"tags":{"type":"array","description":"Optional Nostr tags array, e.g. [[\"d\",\"my-skill\"],[\"t\",\"nostr\"]]","items":{"type":"array","items":{"type":"string"}}}},"required":["kind","content"]}}},{"type":"function","function":{"name":"nostr_query","description":"Query events from relays using a Nostr filter","parameters":{"type":"object","properties":{"filter":{"type":"object","description":"Nostr filter object (authors, kinds, ids, since, until, limit, and tag filters)"},"timeout_ms":{"type":"integer","description":"Optional query timeout in milliseconds"}},"required":["filter"]}}},{"type":"function","function":{"name":"local_shell_exec","description":"Execute a shell command and return stdout/stderr","parameters":{"type":"object","properties":{"command":{"type":"string","description":"Shell command to execute in the configured working directory"}},"required":["command"]}}},{"type":"function","function":{"name":"local_file_read","description":"Read a local file as text from the configured working directory","parameters":{"type":"object","properties":{"path":{"type":"string","description":"Path to file to read (relative to configured working directory)"},"max_bytes":{"type":"integer","description":"Optional maximum bytes to return"}},"required":["path"]}}},{"type":"function","function":{"name":"local_file_write","description":"Write text content to a local file in the configured working directory","parameters":{"type":"object","properties":{"path":{"type":"string","description":"Path to file to write (relative to configured working directory)"},"content":{"type":"string","description":"Text content to write"},"append":{"type":"boolean","description":"When true, append to file instead of overwriting"}},"required":["path","content"]}}},{"type":"function","function":{"name":"nostr_post_readme","description":"Publish README.md as kind 30023 with deterministic d tag readme.md","parameters":{"type":"object","properties":{},"required":[]}}},{"type":"function","function":{"name":"nostr_delete","description":"Request deletion of one or more previously published events (NIP-09 kind 5)","parameters":{"type":"object","properties":{"event_ids":{"type":"array","description":"Event IDs to request deletion for","items":{"type":"string"}},"kinds":{"type":"array","description":"Optional kinds corresponding to event_ids entries","items":{"type":"integer"}},"reason":{"type":"string","description":"Optional human-readable reason"}},"required":["event_ids"]}}},{"type":"function","function":{"name":"nostr_react","description":"React to a Nostr event with like/dislike/emoji (NIP-25 kind 7)","parameters":{"type":"object","properties":{"event_id":{"type":"string","description":"Target event ID to react to"},"event_pubkey":{"type":"string","description":"Author pubkey of target event"},"event_kind":{"type":"integer","description":"Optional kind of target event"},"reaction":{"type":"string","description":"Reaction content such as +, -, ❤️, or emoji"}},"required":["event_id","event_pubkey"]}}},{"type":"function","function":{"name":"nostr_profile_get","description":"Look up a Nostr profile (kind 0 metadata) by pubkey","parameters":{"type":"object","properties":{"pubke...
[2026-03-25 14:03:00] [ERROR] [llm.c:93] [didactyl] llm http request failed: status=401
[2026-03-25 14:03:00] [WARN ] [llm.c:98] [didactyl] llm error response: {"error":{"code":"authentication_error","message":"Invalid Anthropic API Key","type":"invalid_request_error","param":null}}
[2026-03-25 14:03:00] [INFO ] [main.c:1584] [didactyl] shutting down
[2026-03-25 14:03:00] [INFO ] [trigger_manager.c:1602] [didactyl] trigger manager cleaned up
[2026-03-25 14:03:00] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] SEND relay.damus.io:443: ["CLOSE", "pool_7_1774461777"]
[2026-03-25 14:03:00] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] SEND relay.primal.net:443: ["CLOSE", "pool_7_1774461777"]
[2026-03-25 14:03:00] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] SEND relay.damus.io:443: ["CLOSE", "pool_8_1774461777"]
[2026-03-25 14:03:00] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] SEND relay.primal.net:443: ["CLOSE", "pool_8_1774461777"]
[2026-03-25 14:03:00] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] SEND relay.damus.io:443: ["CLOSE", "pool_9_1774461777"]
[2026-03-25 14:03:00] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] SEND relay.primal.net:443: ["CLOSE", "pool_9_1774461777"]
[2026-03-25 14:03:00] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] SEND relay.damus.io:443: ["CLOSE", "pool_10_1774461777"]
[2026-03-25 14:03:00] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] SEND relay.primal.net:443: ["CLOSE", "pool_10_1774461777"]
[2026-03-25 14:03:00] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] SEND relay.damus.io:443: ["CLOSE", "pool_11_1774461777"]
[2026-03-25 14:03:00] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] SEND relay.primal.net:443: ["CLOSE", "pool_11_1774461777"]
[2026-03-25 14:03:00] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] SEND relay.damus.io:443: ["CLOSE", "pool_12_1774461777"]
[2026-03-25 14:03:00] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] SEND relay.primal.net:443: ["CLOSE", "pool_12_1774461777"]
[2026-03-25 14:03:00] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] SEND relay.damus.io:443: ["CLOSE", "pool_13_1774461777"]
[2026-03-25 14:03:00] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] SEND relay.primal.net:443: ["CLOSE", "pool_13_1774461777"]
[2026-03-25 14:03:00] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] SEND relay.damus.io:443: ["CLOSE", "pool_14_1774461777"]
[2026-03-25 14:03:00] [TRACE] [nostr_handler.c:169] [didactyl] [nostr:websocket] SEND relay.primal.net:443: ["CLOSE", "pool_14_1774461777"]

View File

@@ -0,0 +1,488 @@
{
"run_meta": {
"run_timestamp": "2026-03-25T18:03:00.628899+00:00",
"base_url": "http://127.0.0.1:8485",
"config": "tests/results/20260325T175332Z/runtime_test_genesis.jsonc",
"binary": "didactyl_static_x86_64_debug",
"test_count": 43
},
"results": [
{
"suite": "test_conversation",
"name": "simple_greeting",
"status": "pass",
"message": "greeting response ok",
"duration_seconds": 0.7118723430030514,
"agent_errors": [
"[2026-03-25 13:53:38] [ERROR] [llm.c:93] [didactyl] llm http request failed: status=401"
],
"details": {
"response": "LLM request failed."
}
},
{
"suite": "test_conversation",
"name": "agent_responds_about_itself",
"status": "error",
"message": "AssertionError('response missing expected identity terms')",
"duration_seconds": 0.6928808490010852,
"agent_errors": [
"[2026-03-25 13:53:39] [ERROR] [llm.c:93] [didactyl] llm http request failed: status=401"
],
"details": {}
},
{
"suite": "test_conversation",
"name": "empty_message_handling",
"status": "pass",
"message": "empty message handled",
"duration_seconds": 0.7150301859983301,
"agent_errors": [
"[2026-03-25 13:53:40] [ERROR] [llm.c:93] [didactyl] llm http request failed: status=401"
],
"details": {
"success": true
}
},
{
"suite": "test_conversation",
"name": "very_long_message",
"status": "timeout",
"message": "timed out",
"duration_seconds": 74.40904328100078,
"agent_errors": [],
"details": {}
},
{
"suite": "test_errors",
"name": "invalid_json_body",
"status": "pass",
"message": "invalid json rejected",
"duration_seconds": 0.3312758339998254,
"agent_errors": [],
"details": {
"status": 400
}
},
{
"suite": "test_errors",
"name": "missing_message_field",
"status": "pass",
"message": "missing message rejected",
"duration_seconds": 0.33221357599904877,
"agent_errors": [],
"details": {
"status": 400
}
},
{
"suite": "test_errors",
"name": "unknown_endpoint",
"status": "pass",
"message": "unknown endpoint 404",
"duration_seconds": 0.33083409500250127,
"agent_errors": [],
"details": {
"status": 404
}
},
{
"suite": "test_errors",
"name": "webhook_nonexistent_dtag",
"status": "pass",
"message": "nonexistent d_tag 404",
"duration_seconds": 0.3310678790003294,
"agent_errors": [],
"details": {
"status": 404
}
},
{
"suite": "test_health",
"name": "status_returns_200",
"status": "pass",
"message": "status success",
"duration_seconds": 0.3312179879976611,
"agent_errors": [],
"details": {
"keys": [
"success",
"name",
"version",
"pubkey",
"relay_count",
"connected_relays",
"active_triggers"
]
}
},
{
"suite": "test_health",
"name": "status_has_fields",
"status": "pass",
"message": "required fields present",
"duration_seconds": 0.3311822950017813,
"agent_errors": [],
"details": {}
},
{
"suite": "test_health",
"name": "context_current_returns_messages",
"status": "pass",
"message": "context current ok",
"duration_seconds": 0.33288373700270313,
"agent_errors": [],
"details": {
"message_count": 2
}
},
{
"suite": "test_health",
"name": "context_parts_has_system_prompt",
"status": "pass",
"message": "context parts ok",
"duration_seconds": 0.33133809699938865,
"agent_errors": [],
"details": {
"parts": [
"system_prompt",
"dm_history"
]
}
},
{
"suite": "test_restart",
"name": "clean_restart",
"status": "pass",
"message": "restart succeeded",
"duration_seconds": 4.6176964590013085,
"agent_errors": [],
"details": {}
},
{
"suite": "test_restart",
"name": "status_after_restart",
"status": "pass",
"message": "status stable after restart",
"duration_seconds": 4.909773605002556,
"agent_errors": [],
"details": {
"pubkey": "1eb171136dbb1ba695b2f14296adfe88a1f81d4220cc7d186b0e139b8ce0cdbc"
}
},
{
"suite": "test_restart",
"name": "conversation_after_restart",
"status": "pass",
"message": "conversation works post-restart",
"duration_seconds": 5.050862364001659,
"agent_errors": [
"[2026-03-25 13:55:16] [ERROR] [llm.c:93] [didactyl] llm http request failed: status=401"
],
"details": {}
},
{
"suite": "test_timeouts",
"name": "response_within_timeout",
"status": "pass",
"message": "response within timeout",
"duration_seconds": 0.7110072859977663,
"agent_errors": [
"[2026-03-25 13:55:17] [ERROR] [llm.c:93] [didactyl] llm http request failed: status=401"
],
"details": {
"elapsed": 0.7109956109998166
}
},
{
"suite": "test_timeouts",
"name": "status_responds_fast",
"status": "pass",
"message": "status fast",
"duration_seconds": 0.3315564660006203,
"agent_errors": [],
"details": {
"elapsed": 0.33155244100271375
}
},
{
"suite": "test_timeouts",
"name": "context_responds_fast",
"status": "pass",
"message": "context fast",
"duration_seconds": 0.3315621049987385,
"agent_errors": [],
"details": {
"elapsed": 0.33155633700152976
}
},
{
"suite": "test_tools_blossom",
"name": "blossom_list",
"status": "error",
"message": "AssertionError('expected tool blossom_list, got []')",
"duration_seconds": 0.6940111899966723,
"agent_errors": [
"[2026-03-25 13:55:18] [ERROR] [llm.c:93] [didactyl] llm http request failed: status=401"
],
"details": {}
},
{
"suite": "test_tools_cashu",
"name": "wallet_balance",
"status": "timeout",
"message": "timed out",
"duration_seconds": 74.33774810400064,
"agent_errors": [],
"details": {}
},
{
"suite": "test_tools_identity",
"name": "get_pubkey",
"status": "error",
"message": "AssertionError('expected tool nostr_pubkey, got []')",
"duration_seconds": 0.7191562530024385,
"agent_errors": [
"[2026-03-25 13:56:33] [ERROR] [llm.c:93] [didactyl] llm http request failed: status=401"
],
"details": {}
},
{
"suite": "test_tools_identity",
"name": "get_npub",
"status": "error",
"message": "AssertionError('expected tool nostr_npub, got []')",
"duration_seconds": 0.6996072969996021,
"agent_errors": [
"[2026-03-25 13:56:34] [ERROR] [llm.c:93] [didactyl] llm http request failed: status=401"
],
"details": {}
},
{
"suite": "test_tools_identity",
"name": "agent_identity",
"status": "error",
"message": "AssertionError('expected tool agent_identity, got []')",
"duration_seconds": 1.1282884260035644,
"agent_errors": [
"[2026-03-25 13:56:35] [ERROR] [llm.c:93] [didactyl] llm http request failed: status=401"
],
"details": {}
},
{
"suite": "test_tools_identity",
"name": "agent_version",
"status": "timeout",
"message": "timed out",
"duration_seconds": 74.35724607999873,
"agent_errors": [],
"details": {}
},
{
"suite": "test_tools_identity",
"name": "admin_identity",
"status": "error",
"message": "AssertionError('expected tool admin_identity, got []')",
"duration_seconds": 0.7115610000000743,
"agent_errors": [
"[2026-03-25 13:57:50] [ERROR] [llm.c:93] [didactyl] llm http request failed: status=401"
],
"details": {}
},
{
"suite": "test_tools_memory",
"name": "task_list",
"status": "error",
"message": "AssertionError('expected tool task_list, got []')",
"duration_seconds": 0.7350317499985977,
"agent_errors": [
"[2026-03-25 13:57:51] [ERROR] [llm.c:93] [didactyl] llm http request failed: status=401"
],
"details": {}
},
{
"suite": "test_tools_memory",
"name": "task_manage_add_remove",
"status": "error",
"message": "AssertionError('expected tool task_manage, got []')",
"duration_seconds": 0.8766229059983743,
"agent_errors": [
"[2026-03-25 13:57:52] [ERROR] [llm.c:93] [didactyl] llm http request failed: status=401"
],
"details": {}
},
{
"suite": "test_tools_memory",
"name": "memory_save_recall",
"status": "timeout",
"message": "timed out",
"duration_seconds": 74.60836348800149,
"agent_errors": [],
"details": {}
},
{
"suite": "test_tools_nostr",
"name": "nostr_post_kind1",
"status": "error",
"message": "AssertionError('expected tool nostr_post, got []')",
"duration_seconds": 0.7428539540014754,
"agent_errors": [
"[2026-03-25 13:59:07] [ERROR] [llm.c:93] [didactyl] llm http request failed: status=401"
],
"details": {}
},
{
"suite": "test_tools_nostr",
"name": "nostr_query_recent",
"status": "error",
"message": "AssertionError('expected tool nostr_query, got []')",
"duration_seconds": 0.7209930099998019,
"agent_errors": [
"[2026-03-25 13:59:08] [ERROR] [llm.c:93] [didactyl] llm http request failed: status=401"
],
"details": {}
},
{
"suite": "test_tools_nostr",
"name": "nostr_my_events",
"status": "error",
"message": "AssertionError('expected tool nostr_my_events, got []')",
"duration_seconds": 0.7880706729993108,
"agent_errors": [
"[2026-03-25 13:59:09] [ERROR] [llm.c:93] [didactyl] llm http request failed: status=401"
],
"details": {}
},
{
"suite": "test_tools_nostr",
"name": "nostr_relay_status",
"status": "timeout",
"message": "timed out",
"duration_seconds": 74.98576622600012,
"agent_errors": [],
"details": {}
},
{
"suite": "test_tools_nostr",
"name": "nostr_dm_send",
"status": "error",
"message": "AssertionError('expected tool nostr_dm_send, got []')",
"duration_seconds": 0.7461701100000937,
"agent_errors": [
"[2026-03-25 14:00:24] [ERROR] [llm.c:93] [didactyl] llm http request failed: status=401"
],
"details": {}
},
{
"suite": "test_tools_nostr",
"name": "nostr_encode_npub",
"status": "error",
"message": "AssertionError('expected tool nostr_encode, got []')",
"duration_seconds": 0.7844162699984736,
"agent_errors": [
"[2026-03-25 14:00:25] [ERROR] [llm.c:93] [didactyl] llm http request failed: status=401"
],
"details": {}
},
{
"suite": "test_tools_nostr",
"name": "nostr_profile_get",
"status": "error",
"message": "AssertionError('expected tool nostr_profile_get, got []')",
"duration_seconds": 0.830511487001786,
"agent_errors": [
"[2026-03-25 14:00:26] [ERROR] [llm.c:93] [didactyl] llm http request failed: status=401"
],
"details": {}
},
{
"suite": "test_tools_skills",
"name": "skill_list",
"status": "timeout",
"message": "timed out",
"duration_seconds": 74.52532047299974,
"agent_errors": [],
"details": {}
},
{
"suite": "test_tools_skills",
"name": "trigger_list",
"status": "error",
"message": "AssertionError('expected tool trigger_list, got []')",
"duration_seconds": 0.8572921800005133,
"agent_errors": [
"[2026-03-25 14:01:41] [ERROR] [llm.c:93] [didactyl] llm http request failed: status=401"
],
"details": {}
},
{
"suite": "test_tools_skills",
"name": "skill_create_and_remove",
"status": "error",
"message": "AssertionError('expected tool skill_create, got []')",
"duration_seconds": 0.7580235309978889,
"agent_errors": [
"[2026-03-25 14:01:42] [ERROR] [llm.c:93] [didactyl] llm http request failed: status=401"
],
"details": {}
},
{
"suite": "test_tools_system",
"name": "tool_list",
"status": "error",
"message": "AssertionError('expected tool tool_list, got []')",
"duration_seconds": 1.2565209330023208,
"agent_errors": [
"[2026-03-25 14:01:43] [ERROR] [llm.c:93] [didactyl] llm http request failed: status=401"
],
"details": {}
},
{
"suite": "test_tools_system",
"name": "model_get",
"status": "timeout",
"message": "timed out",
"duration_seconds": 74.51243137799975,
"agent_errors": [],
"details": {}
},
{
"suite": "test_tools_system",
"name": "model_list",
"status": "error",
"message": "AssertionError('expected tool model_list, got []')",
"duration_seconds": 0.7136340130018652,
"agent_errors": [
"[2026-03-25 14:02:58] [ERROR] [llm.c:93] [didactyl] llm http request failed: status=401"
],
"details": {}
},
{
"suite": "test_tools_system",
"name": "local_http_fetch",
"status": "error",
"message": "AssertionError('expected tool local_http_fetch, got []')",
"duration_seconds": 0.7562634130008519,
"agent_errors": [
"[2026-03-25 14:02:59] [ERROR] [llm.c:93] [didactyl] llm http request failed: status=401"
],
"details": {}
},
{
"suite": "test_tools_system",
"name": "config_store_recall",
"status": "error",
"message": "AssertionError('expected tool config_store, got []')",
"duration_seconds": 0.7716166019999946,
"agent_errors": [
"[2026-03-25 14:03:00] [ERROR] [llm.c:93] [didactyl] llm http request failed: status=401"
],
"details": {}
}
],
"summary": {
"pass": 16,
"error": 20,
"timeout": 7
}
}

View File

@@ -0,0 +1,163 @@
== Didactyl Test Results ==
Run: 2026-03-25T18:03:00.628899+00:00
Agent base URL: http://127.0.0.1:8485
Pass: 16
Fail: 0
Error: 20
Timeout: 7
Skip: 0
Total: 43
[PASS] test_conversation::simple_greeting (0.71s)
greeting response ok
Agent errors: 1
[ERROR] test_conversation::agent_responds_about_itself (0.69s)
AssertionError('response missing expected identity terms')
Agent errors: 1
[PASS] test_conversation::empty_message_handling (0.72s)
empty message handled
Agent errors: 1
[TIMEOUT] test_conversation::very_long_message (74.41s)
timed out
[PASS] test_errors::invalid_json_body (0.33s)
invalid json rejected
[PASS] test_errors::missing_message_field (0.33s)
missing message rejected
[PASS] test_errors::unknown_endpoint (0.33s)
unknown endpoint 404
[PASS] test_errors::webhook_nonexistent_dtag (0.33s)
nonexistent d_tag 404
[PASS] test_health::status_returns_200 (0.33s)
status success
[PASS] test_health::status_has_fields (0.33s)
required fields present
[PASS] test_health::context_current_returns_messages (0.33s)
context current ok
[PASS] test_health::context_parts_has_system_prompt (0.33s)
context parts ok
[PASS] test_restart::clean_restart (4.62s)
restart succeeded
[PASS] test_restart::status_after_restart (4.91s)
status stable after restart
[PASS] test_restart::conversation_after_restart (5.05s)
conversation works post-restart
Agent errors: 1
[PASS] test_timeouts::response_within_timeout (0.71s)
response within timeout
Agent errors: 1
[PASS] test_timeouts::status_responds_fast (0.33s)
status fast
[PASS] test_timeouts::context_responds_fast (0.33s)
context fast
[ERROR] test_tools_blossom::blossom_list (0.69s)
AssertionError('expected tool blossom_list, got []')
Agent errors: 1
[TIMEOUT] test_tools_cashu::wallet_balance (74.34s)
timed out
[ERROR] test_tools_identity::get_pubkey (0.72s)
AssertionError('expected tool nostr_pubkey, got []')
Agent errors: 1
[ERROR] test_tools_identity::get_npub (0.70s)
AssertionError('expected tool nostr_npub, got []')
Agent errors: 1
[ERROR] test_tools_identity::agent_identity (1.13s)
AssertionError('expected tool agent_identity, got []')
Agent errors: 1
[TIMEOUT] test_tools_identity::agent_version (74.36s)
timed out
[ERROR] test_tools_identity::admin_identity (0.71s)
AssertionError('expected tool admin_identity, got []')
Agent errors: 1
[ERROR] test_tools_memory::task_list (0.74s)
AssertionError('expected tool task_list, got []')
Agent errors: 1
[ERROR] test_tools_memory::task_manage_add_remove (0.88s)
AssertionError('expected tool task_manage, got []')
Agent errors: 1
[TIMEOUT] test_tools_memory::memory_save_recall (74.61s)
timed out
[ERROR] test_tools_nostr::nostr_post_kind1 (0.74s)
AssertionError('expected tool nostr_post, got []')
Agent errors: 1
[ERROR] test_tools_nostr::nostr_query_recent (0.72s)
AssertionError('expected tool nostr_query, got []')
Agent errors: 1
[ERROR] test_tools_nostr::nostr_my_events (0.79s)
AssertionError('expected tool nostr_my_events, got []')
Agent errors: 1
[TIMEOUT] test_tools_nostr::nostr_relay_status (74.99s)
timed out
[ERROR] test_tools_nostr::nostr_dm_send (0.75s)
AssertionError('expected tool nostr_dm_send, got []')
Agent errors: 1
[ERROR] test_tools_nostr::nostr_encode_npub (0.78s)
AssertionError('expected tool nostr_encode, got []')
Agent errors: 1
[ERROR] test_tools_nostr::nostr_profile_get (0.83s)
AssertionError('expected tool nostr_profile_get, got []')
Agent errors: 1
[TIMEOUT] test_tools_skills::skill_list (74.53s)
timed out
[ERROR] test_tools_skills::trigger_list (0.86s)
AssertionError('expected tool trigger_list, got []')
Agent errors: 1
[ERROR] test_tools_skills::skill_create_and_remove (0.76s)
AssertionError('expected tool skill_create, got []')
Agent errors: 1
[ERROR] test_tools_system::tool_list (1.26s)
AssertionError('expected tool tool_list, got []')
Agent errors: 1
[TIMEOUT] test_tools_system::model_get (74.51s)
timed out
[ERROR] test_tools_system::model_list (0.71s)
AssertionError('expected tool model_list, got []')
Agent errors: 1
[ERROR] test_tools_system::local_http_fetch (0.76s)
AssertionError('expected tool local_http_fetch, got []')
Agent errors: 1
[ERROR] test_tools_system::config_store_recall (0.77s)
AssertionError('expected tool config_store, got []')
Agent errors: 1

View File

@@ -0,0 +1,53 @@
{
// TEST CONFIGURATION
// Use disposable keys/accounts only.
"key": {
"nsec": "d3011e59954403fb84729ab0e9fb239ba0f0238b3f353dfb5c08a32f4b3d21a1"
},
"admin": {
"pubkey": "254d7a7f68b4443f5430564eb3a726f09aea57d27e75ab2b8ef57176f9ca3dac"
},
"dm_protocol": "nip04",
"llm": {
"provider": "openai",
"api_key": "sk-REPLACE_WITH_API_KEY",
"model": "claude-haiku-4.5",
"base_url": "https://api.anthropic.com/v1",
"max_tokens": 512,
"temperature": 0.3
},
"api": {
"enabled": true,
"port": 8485,
"bind_address": "127.0.0.1"
},
"startup_events": [
{
"kind": 0,
"content_fields": {
"name": "Didactyl Test Agent",
"about": "Automated test instance"
},
"tags": []
},
{
"kind": 10002,
"content": "",
"tags": [
["r", "wss://relay.damus.io"],
["r", "wss://relay.primal.net"]
]
},
{
"kind": 31124,
"content": "# Test Agent\n\nYou are a test agent. Respond to requests and use tools when needed.",
"tags": [
["d", "identity_and_rules"],
["app", "didactyl"],
["scope", "private"],
["trigger", "dm"],
["filter", "{\"from\":\"admin\"}"]
]
}
]
}

View File

@@ -3,6 +3,8 @@ from __future__ import annotations
import argparse
import datetime as dt
import json
import re
import subprocess
import sys
from pathlib import Path
@@ -21,6 +23,7 @@ from tests.harness.test_runner import TestRunner
def parse_args() -> argparse.Namespace:
parser = argparse.ArgumentParser(description="Didactyl automated test harness")
parser.add_argument("--config", default="tests/configs/test_genesis.jsonc")
parser.add_argument("--keys", default="tests/configs/test_keys.jsonc", help="Path to local keys JSONC file")
parser.add_argument("--binary", default=None, help="Path to didactyl binary; if omitted, build_static --debug is used")
parser.add_argument("--suite", action="append", help="Run only this suite (repeatable)")
parser.add_argument("--test", action="append", help="Run only this test name (repeatable)")
@@ -58,6 +61,67 @@ def resolve_default_debug_binary() -> Path:
return Path("./didactyl_static_x86_64_debug")
def _strip_jsonc(text: str) -> str:
text = re.sub(r"//.*?$", "", text, flags=re.MULTILINE)
text = re.sub(r"/\*.*?\*/", "", text, flags=re.DOTALL)
text = re.sub(r",\s*([}\]])", r"\1", text)
return text
def _load_keys(keys_path: Path) -> tuple[str | None, str | None]:
raw = keys_path.read_text(encoding="utf-8")
data = json.loads(_strip_jsonc(raw))
agent_nsec = None
admin_pubkey = None
if isinstance(data, dict):
agent = data.get("agent")
admin = data.get("admin")
if isinstance(agent, dict):
nsec = agent.get("nsec")
if isinstance(nsec, str) and nsec.strip():
agent_nsec = nsec.strip()
if isinstance(admin, dict):
pubkey = admin.get("pubkey")
if isinstance(pubkey, str) and pubkey.strip():
admin_pubkey = pubkey.strip()
return agent_nsec, admin_pubkey
def _apply_keys_to_config_text(config_text: str, agent_nsec: str | None, admin_pubkey: str | None) -> str:
out = config_text
if agent_nsec:
out = re.sub(
r'("nsec"\s*:\s*")[^"]*(")',
lambda m: f"{m.group(1)}{agent_nsec}{m.group(2)}",
out,
count=1,
)
if admin_pubkey:
out = re.sub(
r'("pubkey"\s*:\s*")[^"]*(")',
lambda m: f"{m.group(1)}{admin_pubkey}{m.group(2)}",
out,
count=1,
)
return out
def prepare_runtime_config(config_path: Path, keys_path: Path, output_dir: Path) -> Path:
config_text = config_path.read_text(encoding="utf-8")
if not keys_path.exists():
return config_path
agent_nsec, admin_pubkey = _load_keys(keys_path)
rendered = _apply_keys_to_config_text(config_text, agent_nsec, admin_pubkey)
runtime_config = output_dir / "runtime_test_genesis.jsonc"
runtime_config.write_text(rendered, encoding="utf-8")
return runtime_config
def main() -> int:
args = parse_args()
@@ -81,14 +145,22 @@ def main() -> int:
config = Path(args.config)
if not config.exists():
print(f"config not found: {config}")
print("Create it from template: cp tests/configs/test_genesis.jsonc.example tests/configs/test_genesis.jsonc")
return 2
keys = Path(args.keys)
runtime_config = prepare_runtime_config(config, keys, Path(output_dir))
if not keys.exists():
print(f"keys file not found (optional): {keys}")
print("Create it from template for stable test identity: cp tests/configs/test_keys.jsonc.example tests/configs/test_keys.jsonc")
log_file = str(Path(output_dir) / "agent_debug.log")
base_url = f"https://{args.api_bind}:{args.api_port}"
base_url = f"http://{args.api_bind}:{args.api_port}"
agent = AgentProcess(
binary_path=str(binary),
config_path=str(config),
config_path=str(runtime_config),
api_port=args.api_port,
api_bind=args.api_bind,
debug_level=args.debug_level,
@@ -117,7 +189,7 @@ def main() -> int:
run_meta = {
"run_timestamp": dt.datetime.now(dt.timezone.utc).isoformat(),
"base_url": base_url,
"config": str(config),
"config": str(runtime_config),
"binary": str(binary),
"test_count": len(results),
}