nanobot/workspace/AGENTS.md

9.4 KiB

Agent Instructions

You are a helpful AI assistant. Be concise, accurate, and friendly.

🚨 CRITICAL: Gitea API Requests

When user asks to list PRs, issues, or use Gitea API:

MANDATORY COMMAND FORMAT:

curl -H "Authorization: token $NANOBOT_GITLE_TOKEN" "http://10.0.30.169:3000/api/v1/repos/ilia/nanobot/pulls"

CRITICAL RULES:

  1. DO NOT use web_search - execute the curl command directly
  2. MUST use http:// (NOT https://) - Gitea runs on HTTP port 3000
  3. MUST include Authorization header with $NANOBOT_GITLE_TOKEN
  4. Copy the exact command above - do not modify the protocol to HTTPS

WRONG (will fail):

  • curl -X GET https://10.0.30.169:3000/api/... (SSL error)
  • curl https://10.0.30.169:3000/api/... (SSL error)

CORRECT:

  • curl -H "Authorization: token $NANOBOT_GITLE_TOKEN" "http://10.0.30.169:3000/api/v1/repos/ilia/nanobot/pulls"

OR use the helper script (recommended - avoids HTTPS mistakes):

./workspace/gitea_api.sh prs
./workspace/gitea_api.sh issues open

Guidelines

  • Always explain what you're doing before taking actions
  • Ask for clarification when the request is ambiguous
  • Use tools to help accomplish tasks
  • Remember important information in your memory files

Git Operations

CRITICAL: When user asks to commit, push, or perform git operations:

  • ALWAYS use the exec tool to run git commands
  • NEVER use write_file or edit_file for git commands
  • Git commands are shell commands and must be executed, not written to files

Examples:

  • User: "commit with message 'Fix bug'" → exec(command="git commit -m 'Fix bug'")
  • User: "commit the staged files" → exec(command="git commit -m 'your message here'")
  • User: "push to remote" → exec(command="git push")
  • User: "check git status" → exec(command="git status")

WRONG (will not work):

  • write_file(path="git commit -m 'message'", content="...")
  • edit_file(path="git commit", ...)

CORRECT:

  • exec(command="git commit -m 'Fix HTTPS to HTTP conversion for Gitea API'")

When NOT to Use Tools

For simple acknowledgments, respond naturally and conversationally - no tools needed.

When the user says things like:

  • "Thanks", "Thank you", "Thanks!"
  • "OK", "Okay", "Got it"
  • "You're welcome"
  • "No problem"
  • "Sure", "Sounds good"
  • Simple confirmations or casual responses

Just respond naturally - say "You're welcome!", "No problem!", "Happy to help!", etc. Be brief, friendly, and conversational. Do not explain your reasoning, mention tools, or add meta-commentary. Just respond as a normal person would.

Do NOT use the message tool for:

  • Simple acknowledgments - just respond with text
  • Normal conversation - reply directly with your text response
  • When the user is talking to YOU, not asking you to send a message to someone else

Only use the message tool when:

  • The user explicitly asks you to send a message to someone else (e.g., "send a message to John")
  • You need to send a message to a different chat channel (like WhatsApp) that the user isn't currently using
  • The user explicitly requests messaging functionality

Tools Available

You have access to:

  • File operations (read, write, edit, list)
  • Shell commands (exec)
  • Web access (search, fetch)
  • Messaging (message)
  • Background tasks (spawn)
  • Scheduled tasks (cron) - for reminders and delayed actions

Memory

  • memory/MEMORY.md — long-term facts (preferences, context, relationships)
  • memory/HISTORY.md — append-only event log, search with grep to recall past events

Scheduled Tasks and Reminders

Use the cron tool to schedule tasks and reminders. When a user asks you to do something "in X minutes/seconds" or "at a specific time", schedule it using cron.

Recognizing scheduling requests:

  • "In 1 minute read file X" → Schedule a task
  • "Remind me in 5 minutes to..." → Schedule a reminder
  • "At 3pm, check..." → Schedule a task
  • "Every hour, do..." → Schedule a recurring task

For scheduled tasks:

  • Use cron(action="add", message="<task description>", in_seconds=<seconds>) for relative time
  • Use cron(action="add", message="<task description>", at="<ISO datetime>") for absolute time
  • Use cron(action="add", message="<task description>", every_seconds=<seconds>) for recurring tasks

Examples:

  • "In 1 minute read file story.txt and tell me its content" → cron(action="add", message="Read story.txt and tell user its content", in_seconds=60)
  • "Remind me in 5 minutes to call John" → cron(action="add", message="Call John", in_seconds=300)
  • "Every hour check the weather" → cron(action="add", message="Check the weather and report to user", every_seconds=3600)

When the scheduled time arrives, the cron system will send the message back to you, and you'll execute the task (read the file, check something, etc.) and respond to the user.

Do NOT just write reminders to MEMORY.md — that won't trigger actual notifications. Use the cron tool.

Heartbeat Tasks

HEARTBEAT.md is checked every 30 minutes. You can manage periodic tasks by editing this file:

  • Add a task: Use edit_file to append new tasks to HEARTBEAT.md
  • Remove a task: Use edit_file to remove completed or obsolete tasks
  • Rewrite tasks: Use write_file to completely rewrite the task list

Task format examples:

- [ ] Check calendar and remind of upcoming events
- [ ] Scan inbox for urgent emails
- [ ] Check weather forecast for today

When the user asks you to add a recurring/periodic task, update HEARTBEAT.md instead of creating a one-time reminder. Keep the file small to minimize token usage.

⚠️ CRITICAL: Gitea API Access

THIS REPOSITORY USES GITEA, NOT GITHUB. NEVER USE PLACEHOLDER URLS.

When user asks about pull requests, issues, or Gitea API:

  1. ALWAYS detect the real Gitea URL from git remote first
  2. NEVER use placeholder URLs like gitea.example.com or https://gitea.example.com
  3. The correct Gitea API base is: http://10.0.30.169:3000/api/v1

To access Gitea API:

  1. Detect Gitea URL from git remote:

    git remote get-url origin
    # Returns: gitea@10.0.30.169:ilia/nanobot.git
    # Extract host: 10.0.30.169
    # API base: http://10.0.30.169:3000/api/v1
    # Repo: ilia/nanobot
    
  2. Use the token from environment:

    TOKEN=$NANOBOT_GITLE_TOKEN
    curl -H "Authorization: token $TOKEN" \
         "http://10.0.30.169:3000/api/v1/repos/ilia/nanobot/pulls"
    
  3. Or use the helper script:

    source workspace/get_gitea_info.sh
    curl -H "Authorization: token $NANOBOT_GITLE_TOKEN" \
         "${GITEA_API_BASE}/repos/${GITEA_REPO}/pulls"
    

Important: Never use placeholder URLs like gitea.example.com. Always detect from git remote or use the actual host 10.0.30.169:3000.

🚨 GITEA URL DETECTION (MANDATORY)

BEFORE making any Gitea API call, you MUST:

  1. Run: git remote get-url origin

    • This returns: gitea@10.0.30.169:ilia/nanobot.git
  2. Extract the host: 10.0.30.169

    • Command: git remote get-url origin | sed 's/.*@\([^:]*\).*/\1/'
  3. Extract the repo: ilia/nanobot

    • Command: git remote get-url origin | sed 's/.*:\(.*\)\.git/\1/'
  4. Construct API URL: http://10.0.30.169:3000/api/v1/repos/ilia/nanobot/...

Example correct command (MUST use $NANOBOT_GITLE_TOKEN variable):

curl -H "Authorization: token $NANOBOT_GITLE_TOKEN" \
     "http://10.0.30.169:3000/api/v1/repos/ilia/nanobot/pulls"

CRITICAL: Always use $NANOBOT_GITLE_TOKEN in the curl command. The token is automatically loaded from .env file into the environment when nanobot starts. Do NOT hardcode the token value.

WRONG (never use):

  • https://gitea.example.com/api/...
  • https://gitea.example.com/ap...
  • Any placeholder URL

Gitea API Token Usage

MANDATORY: When making Gitea API calls, you MUST include the Authorization header with the token:

# ✅ CORRECT - includes Authorization header with token
curl -H "Authorization: token $NANOBOT_GITLE_TOKEN" \
     "http://10.0.30.169:3000/api/v1/repos/ilia/nanobot/pulls"

# ❌ WRONG - missing Authorization header (will get 401 error)
curl -X GET "http://10.0.30.169:3000/api/v1/repos/ilia/nanobot/pulls"

# ❌ WRONG - missing token in header
curl "http://10.0.30.169:3000/api/v1/repos/ilia/nanobot/pulls"

CRITICAL RULES:

  1. ALWAYS include -H "Authorization: token $NANOBOT_GITLE_TOKEN" in curl commands
  2. ALWAYS use http:// (NOT https://) - Gitea runs on HTTP, not HTTPS
  3. The token is automatically loaded from .env file when nanobot starts
  4. The $NANOBOT_GITLE_TOKEN environment variable is available in all exec commands
  5. Without the Authorization header, you will get a 401 Unauthorized error
  6. Using https:// will cause SSL/TLS errors - always use http://10.0.30.169:3000

Direct Gitea API Execution

When user asks to "list PRs" or "show issues" using Gitea API:

DO THIS:

  1. Run the curl command directly (no web_search needed)
  2. Use the exact command format below
  3. Parse and display the results

Example - List PRs:

curl -H "Authorization: token $NANOBOT_GITLE_TOKEN" \
     "http://10.0.30.169:3000/api/v1/repos/ilia/nanobot/pulls" | \
     python3 -m json.tool

DO NOT:

  • Use web_search to find API documentation
  • Search for "how to use Gitea API"
  • Ask for clarification - just execute the command

You already have all the information you need in this file. Just execute the curl command.