[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"project-1312":3},{"id":4,"name":5,"fullName":6,"owner":7,"repo":5,"description":8,"homepage":9,"htmlUrl":10,"language":11,"languages":10,"totalLinesOfCode":10,"stars":12,"forks":13,"watchers":14,"openIssues":15,"contributorsCount":16,"subscribersCount":16,"size":16,"stars1d":17,"stars7d":17,"stars30d":18,"stars90d":16,"forks30d":16,"starsTrendScore":19,"compositeScore":20,"rankGlobal":10,"rankLanguage":10,"license":21,"archived":22,"fork":22,"defaultBranch":23,"hasWiki":24,"hasPages":24,"topics":25,"createdAt":10,"pushedAt":10,"updatedAt":33,"readmeContent":34,"aiSummary":35,"trendingCount":16,"starSnapshotCount":16,"syncStatus":36,"lastSyncTime":37,"discoverSource":38},1312,"hermes-labyrinth","stainlu\u002Fhermes-labyrinth","stainlu","Read-only observability plugin for Hermes Agent: journeys, crossings, guideposts, and reports.","https:\u002F\u002Fstainlu.github.io\u002Fhermes-labyrinth\u002F",null,"HTML",281,22,257,1,0,3,16,9,4.09,"MIT License",false,"main",true,[26,27,28,29,30,31,32],"agent-observability","autonomous-agents","dashboard-plugin","hackathon","hermes-agent","nous-research","observability","2026-06-12 02:00:26","# Hermes Labyrinth\n\n[![Live demo](https:\u002F\u002Fimg.shields.io\u002Fbadge\u002Fdemo-live-f0ede4?style=flat-square)](https:\u002F\u002Fstainlu.github.io\u002Fhermes-labyrinth\u002F)\n[![Version](https:\u002F\u002Fimg.shields.io\u002Fgithub\u002Fv\u002Ftag\u002Fstainlu\u002Fhermes-labyrinth?style=flat-square)](https:\u002F\u002Fgithub.com\u002Fstainlu\u002Fhermes-labyrinth\u002Freleases)\n[![License: MIT](https:\u002F\u002Fimg.shields.io\u002Fbadge\u002Flicense-MIT-blue.svg?style=flat-square)](.\u002FLICENSE)\n[![Smoke tested](https:\u002F\u002Fimg.shields.io\u002Fbadge\u002Fsmoke-tested-3a6a3a?style=flat-square)](#verification)\n[![Hermes Agent](https:\u002F\u002Fimg.shields.io\u002Fbadge\u002FHermes-Agent-14130f?style=flat-square)](https:\u002F\u002Fgithub.com\u002FNousResearch\u002Fhermes-agent)\n\nRead-only observability for [Hermes Agent](https:\u002F\u002Fgithub.com\u002FNousResearch\u002Fhermes-agent).\n\nHermes Labyrinth turns autonomous work into a map of crossings: prompts, tool\ncalls, tool results, failures, model switches, subagents, approvals, memory\nhits, redactions, context compression, cron runs, and exportable evidence.\n\nIt is not a chat UI. It is a black-box recorder for agents moving through\nunknown work.\n\n![Hermes Labyrinth dashboard screenshot](.\u002Fscreenshot.png)\n\n## Demo\n\n- Live demo: https:\u002F\u002Fstainlu.github.io\u002Fhermes-labyrinth\u002F\n- Current release: [`v0.1.3`](https:\u002F\u002Fgithub.com\u002Fstainlu\u002Fhermes-labyrinth\u002Freleases\u002Ftag\u002Fv0.1.3)\n- Hermes Agent: https:\u002F\u002Fgithub.com\u002FNousResearch\u002Fhermes-agent\n\nThe public demo is static and uses mocked Hermes state so it can run on GitHub\nPages. The installable dashboard plugin reads local Hermes state through Hermes\ndashboard plugin routes.\n\n## Highlights\n\n- **Journey index**: recent CLI, dashboard, gateway, cron, and delegated work.\n- **Labyrinth map**: ordered crossings through a selected agent journey.\n- **Inspector**: input, output, duration, status, evidence, and guideposts for\n  a selected crossing.\n- **Guideposts**: generated observations backed by local evidence.\n- **Skill atlas**: effective skills plus shadowed overrides and true\n  duplicate diagnostics.\n- **Cron gate**: scheduled autonomy, next runs, last failures, and workdirs.\n- **Model ferry**: model\u002Fprovider transitions across sessions.\n- **Reports**: redacted Markdown and JSON exports for one journey.\n\n## Install\n\nInstall into the Hermes user plugin directory:\n\n```bash\nmkdir -p ~\u002F.hermes\u002Fplugins\ngit clone https:\u002F\u002Fgithub.com\u002Fstainlu\u002Fhermes-labyrinth.git ~\u002F.hermes\u002Fplugins\u002Fhermes-labyrinth\n```\n\nStart the dashboard after installing:\n\n```bash\nhermes dashboard\n```\n\nIf the dashboard was already running, fully stop and restart it after a first\ninstall or after updating `dashboard\u002Fplugin_api.py`. The frontend plugin list\ncan be rescanned, but Python API routes are mounted during dashboard startup.\nIf the Labyrinth tab shows a backend\u002FAPI diagnostic, restart the dashboard and\ncheck the dashboard startup logs for plugin API import errors.\n\nRescan is only for refreshing discovered frontend manifests\u002Fassets in the\ncurrent dashboard process:\n\n```bash\ncurl http:\u002F\u002F127.0.0.1:9119\u002Fapi\u002Fdashboard\u002Fplugins\u002Frescan\n```\n\nOpen the dashboard and select the `Labyrinth` tab.\n\nOptional theme scaffold:\n\n```bash\nmkdir -p ~\u002F.hermes\u002Fdashboard-themes\ncp ~\u002F.hermes\u002Fplugins\u002Fhermes-labyrinth\u002Ftheme\u002Fhermes-labyrinth.yaml ~\u002F.hermes\u002Fdashboard-themes\u002F\n```\n\n## Safe Docker PoC\n\nFor Docker-based Hermes installs, test Labyrinth against a dedicated Hermes\nhome first. Do not mount a production profile with live provider, OAuth,\nwebhook, Discord, Telegram, or deployment tokens until the redaction smoke test\nbelow passes.\n\nPin a known commit instead of tracking `main` blindly:\n\n```bash\nmkdir -p ~\u002F.hermes\u002Fplugins\ngit clone https:\u002F\u002Fgithub.com\u002Fstainlu\u002Fhermes-labyrinth.git ~\u002F.hermes\u002Fplugins\u002Fhermes-labyrinth\ncd ~\u002F.hermes\u002Fplugins\u002Fhermes-labyrinth\ngit checkout \u003Creviewed-tag-or-commit>\n```\n\nMount the host Hermes home into the dashboard container using the same path the\ndashboard expects for user plugins. Keep the dashboard bound to localhost or a\nprivate network while evaluating trace data.\n\nBefore production use:\n\n- create a test journey containing dummy API keys, webhook secrets, OAuth\n  tokens, and tool outputs\n- inspect the Labyrinth UI\n- inspect `\u002Freports\u002F\u003Cjourney_id>.json`\n- inspect `\u002Freports\u002F\u003Cjourney_id>.md`\n- confirm dummy secrets are absent from every surface\n\nRollback is just plugin disable\u002Fremove plus a dashboard restart or rescan:\n\n```bash\nhermes plugins disable hermes-labyrinth\nrm -rf ~\u002F.hermes\u002Fplugins\u002Fhermes-labyrinth\ncurl http:\u002F\u002F127.0.0.1:9119\u002Fapi\u002Fdashboard\u002Fplugins\u002Frescan\n```\n\nUse a full dashboard restart when rollback or update changes Python API files;\nrescan alone cannot unmount or remount FastAPI routes in the current process.\n\n## Data Policy\n\nHermes Labyrinth is read-only by design.\n\n- It does not start, stop, resume, mutate, or create Hermes sessions.\n- Secret redaction is applied to journey summaries, previews, and reports.\n- If the Hermes core redactor cannot be loaded or throws, Labyrinth fails\n  closed and shows `[redaction unavailable]` instead of raw trace text.\n- Unknown fields stay unknown.\n- Reports are generated from local Hermes state.\n- The public demo uses sample data and should not be treated as live telemetry.\n\n## Verification\n\n```bash\nnpm test\n```\n\n`npm test` runs:\n\n- reproducible build checks for `dashboard\u002Fdist` and `index.html`\n- frontend JavaScript parse checks\n- backend Python parse checks\n- API normalization fixture tests, including numeric Hermes timestamps\n- packed-artifact and dead-control regressions\n- headless Chrome smoke coverage for map modes, route changes, search,\n  dataset switching, and the threshold filter\n\nTo smoke-test the deployed Pages build:\n\n```bash\nnpm run smoke:live\n```\n\n## Development\n\n```bash\nnpm run build\nnpm run check\nnpm run smoke\n```\n\n`dashboard\u002Fdist\u002F` is generated from `src\u002Fparts\u002F*.js` and `src\u002Flabyrinth.css`.\n`index.html` is generated from `src\u002Fdemo\u002Findex.html` with content-hash query\nstrings on the local JS\u002FCSS assets. These files are checked in because Hermes\ndashboard plugins and GitHub Pages are loaded directly from built static files.\n\n## Repository Layout\n\n```text\n.\n├── dashboard\u002F\n│   ├── manifest.json        # Hermes dashboard plugin manifest\n│   ├── plugin_api.py        # Read-only API over local Hermes state\n│   └── dist\u002F                # Generated dashboard plugin bundle\n├── docs\u002F\n│   ├── CONCEPT.md\n│   ├── DESIGN_BRIEF.md\n│   └── FUNCTIONAL_SPEC.md\n├── scripts\u002F\n│   ├── build-plugin.mjs     # Builds dashboard\u002Fdist and index.html from src\n│   ├── smoke-demo.mjs       # Browser smoke test for the public demo\n│   ├── test-plugin-api.py   # Fixture tests for API normalization helpers\n│   └── verify.mjs           # Local verification checks\n├── src\u002F\n│   ├── demo\u002F                # GitHub Pages demo source\n│   ├── parts\u002F               # Ordered frontend source chunks\n│   └── labyrinth.css        # Frontend CSS source\n├── theme\u002F\n│   └── hermes-labyrinth.yaml\n├── index.html               # Generated GitHub Pages demo\n├── screenshot.png           # README screenshot\n└── package.json             # Build\u002Fcheck\u002Fsmoke scripts\n```\n\n## Architecture\n\n```text\nHermes local state\n  ├─ state.db sessions\u002Fmessages\n  ├─ skills directories\n  └─ cron config\n        ↓\ndashboard\u002Fplugin_api.py\n        ↓\n\u002Fapi\u002Fplugins\u002Fhermes-labyrinth\u002F*\n        ↓\nsrc\u002Fparts\u002F*.js + src\u002Flabyrinth.css\n        ↓ npm run build\ndashboard\u002Fdist\u002F*\n        ↓\nHermes dashboard tab: Labyrinth\n```\n\n## API Surface\n\n```text\nGET \u002Fapi\u002Fplugins\u002Fhermes-labyrinth\u002Fhealth\nGET \u002Fapi\u002Fplugins\u002Fhermes-labyrinth\u002Fjourneys\nGET \u002Fapi\u002Fplugins\u002Fhermes-labyrinth\u002Fjourneys\u002F{journey_id}\nGET \u002Fapi\u002Fplugins\u002Fhermes-labyrinth\u002Fjourneys\u002F{journey_id}\u002Fcrossings\nGET \u002Fapi\u002Fplugins\u002Fhermes-labyrinth\u002Fskills\nGET \u002Fapi\u002Fplugins\u002Fhermes-labyrinth\u002Fcron\nGET \u002Fapi\u002Fplugins\u002Fhermes-labyrinth\u002Fguideposts\nGET \u002Fapi\u002Fplugins\u002Fhermes-labyrinth\u002Freports\u002F{journey_id}.json\nGET \u002Fapi\u002Fplugins\u002Fhermes-labyrinth\u002Freports\u002F{journey_id}.md\n```\n\n`\u002Fskills` returns effective `skills`, expected `shadowed` overrides, true\n`duplicates`, and scan `errors` separately so normal user-over-bundled\noverrides do not hide real filesystem problems.\n\n## Project Status\n\n`v0.1.3` is a hackathon preview that is stable enough to demo and install as a\nread-only dashboard plugin. The public demo and main UI flows are covered by\nbrowser smoke tests; full Hermes dashboard integration tests are still on the\nroadmap.\n\nSee [Known Limitations](.\u002FKNOWN_LIMITATIONS.md), [Roadmap](.\u002FROADMAP.md), and\n[Changelog](.\u002FCHANGELOG.md).\n","Hermes Labyrinth 是一个针对 Hermes Agent 的只读可观测性插件，能够将自主工作的流程可视化为一系列的交点。该项目的核心功能包括旅程索引、迷宫地图、检查器、路标、技能图谱、定时任务门和模型渡轮等，可以展示从提示到工具调用、结果、失败、模型切换等一系列工作流程，并提供可导出的证据报告。技术上基于 HTML 构建，适合需要对自主代理的工作流进行监控和分析的场景，如研究开发、调试或展示自定义智能代理的行为模式。",2,"2026-06-11 02:42:57","CREATED_QUERY"]