{"id":45870083,"url":"https://github.com/strawpot/denden","last_synced_at":"2026-03-14T02:42:11.133Z","repository":{"id":340932487,"uuid":"1168107308","full_name":"strawpot/denden","owner":"strawpot","description":"CLI based Agent to Orchestrator Communication Layer for StrawPot","archived":false,"fork":false,"pushed_at":"2026-03-11T23:51:46.000Z","size":102,"stargazers_count":1,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-03-12T04:53:10.532Z","etag":null,"topics":["agent","communications","orchestrator"],"latest_commit_sha":null,"homepage":"","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/strawpot.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2026-02-27T02:43:32.000Z","updated_at":"2026-03-11T23:51:29.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/strawpot/denden","commit_stats":null,"previous_names":["strawpot/denden"],"tags_count":20,"template":false,"template_full_name":null,"purl":"pkg:github/strawpot/denden","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/strawpot%2Fdenden","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/strawpot%2Fdenden/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/strawpot%2Fdenden/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/strawpot%2Fdenden/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/strawpot","download_url":"https://codeload.github.com/strawpot/denden/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/strawpot%2Fdenden/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":30486375,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-03-14T01:54:10.014Z","status":"online","status_checked_at":"2026-03-14T02:00:06.612Z","response_time":57,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["agent","communications","orchestrator"],"created_at":"2026-02-27T09:54:38.243Z","updated_at":"2026-03-14T02:42:11.127Z","avatar_url":"https://github.com/strawpot.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Den Den\n\n\u003cp align=\"center\"\u003e\n  \u003ca href=\"https://github.com/strawpot/denden/actions/workflows/ci-go.yml?branch=main\"\u003e\u003cimg src=\"https://img.shields.io/github/actions/workflow/status/strawpot/denden/ci-go.yml?branch=main\u0026label=Go\u0026style=for-the-badge\" alt=\"Go CI\"\u003e\u003c/a\u003e\n  \u003ca href=\"https://github.com/strawpot/denden/actions/workflows/ci-python.yml?branch=main\"\u003e\u003cimg src=\"https://img.shields.io/github/actions/workflow/status/strawpot/denden/ci-python.yml?branch=main\u0026label=Python\u0026style=for-the-badge\" alt=\"Python CI\"\u003e\u003c/a\u003e\n  \u003ca href=\"LICENSE\"\u003e\u003cimg src=\"https://img.shields.io/badge/License-MIT-blue.svg?style=for-the-badge\" alt=\"MIT License\"\u003e\u003c/a\u003e\n\u003c/p\u003e\n\nAgent-to-orchestrator communication layer. A gRPC transport where agents call back to the orchestrator via the `denden` CLI.\n\n```\nOrchestrator (Python gRPC server)\n  ├── spawns agents as subprocesses\n  └── handles ask_user / delegate / remember / recall requests\n         ▲\n         │ gRPC (localhost)\n         │\n     denden CLI (Go binary)\n       └── called by agents to send requests\n```\n\n## Components\n\n| Component | Language | Path |\n|---|---|---|\n| CLI client | Go | `cli/` |\n| Server library | Python | `server/` |\n| Protocol | Protobuf | `proto/denden.proto` |\n\n## Quick start\n\n### Install the server\n\n```bash\ncd server\npip install -e '.[dev]'\n```\n\n### Build the CLI\n\n```bash\ncd cli\ngo build -o denden .\n```\n\n### Run the server\n\n```bash\ndenden-server --verbose\n```\n\n### Use the CLI\n\n```bash\n# Health check\n./cli/denden status\n\n# Ask user a question\n./cli/denden send '{\n  \"askUser\": {\n    \"question\": \"Which language?\",\n    \"choices\": [\"Python\", \"Go\", \"Rust\"]\n  }\n}'\n\n# Delegate to a sub-agent\n./cli/denden send '{\n  \"delegate\": {\n    \"delegateTo\": \"implementer\",\n    \"task\": {\n      \"text\": \"implement auth module\",\n      \"returnFormat\": \"TEXT\"\n    }\n  }\n}'\n\n# Remember information\n./cli/denden send '{\n  \"remember\": {\n    \"content\": \"This project uses pytest\",\n    \"keywords\": [\"testing\", \"pytest\"],\n    \"scope\": \"project\"\n  }\n}'\n\n# Recall stored information\n./cli/denden send '{\n  \"recall\": {\n    \"query\": \"testing framework\",\n    \"scope\": \"project\",\n    \"maxResults\": 5\n  }\n}'\n```\n\nThe CLI auto-fills `request_id`, `denden_version`, `trace.created_at`, and trace fields from environment variables.\n\n### Environment variables\n\n| Variable | Default | Description |\n|---|---|---|\n| `DENDEN_ADDR` | `127.0.0.1:9700` | Server address |\n| `DENDEN_AGENT_ID` | | Agent instance ID (set by orchestrator) |\n| `DENDEN_PARENT_AGENT_ID` | | Parent agent instance ID |\n| `DENDEN_RUN_ID` | | Run ID |\n| `DENDEN_TIMEOUT` | `30s` | CLI request timeout |\n\n## Protocol\n\nSingle `.proto` file at `proto/denden.proto`. Two RPCs:\n\n- **Send** — dispatches `ask_user`, `delegate`, `remember`, or `recall` requests (oneof payload)\n- **Status** — health check\n\nResponse statuses: `OK`, `DENIED`, `ERROR`.\n\n### Regenerate stubs\n\n```bash\nmake proto\n```\n\nRequires `protoc`, `protoc-gen-go`, `protoc-gen-go-grpc`, and `grpcio-tools`.\n\n## Server as a library\n\n```python\nfrom denden import DenDenServer, ok_response\nfrom denden.gen import denden_pb2\n\nserver = DenDenServer(addr=\"127.0.0.1:9700\")\n\ndef handle_ask_user(request):\n    answer = input(request.ask_user.question + \" \")\n    return ok_response(\n        request.request_id,\n        ask_user_result=denden_pb2.AskUserResult(text=answer),\n    )\n\ndef handle_delegate(request):\n    # ... run the delegated task ...\n    return ok_response(\n        request.request_id,\n        delegate_result=denden_pb2.DelegateResult(text=\"done\"),\n    )\n\nserver.on_ask_user(handle_ask_user)\nserver.on_delegate(handle_delegate)\nserver.on_remember(handle_remember)\nserver.on_recall(handle_recall)\nserver.run()\n```\n\n### Dynamic modules\n\nThe server CLI supports loading modules at startup:\n\n```bash\ndenden-server --load-module my_custom_module\n```\n\nModules must expose a `module` attribute or `create_module()` function returning a `denden.Module` subclass.\n\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fstrawpot%2Fdenden","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fstrawpot%2Fdenden","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fstrawpot%2Fdenden/lists"}