xdog-eyes
Platform scope: Linux only. Non-Linux adapters and native-platform support are outside the current product scope; historical audit evidence is not a support promise.
A local-first, declarative observation layer, shaped like flow: versioned JSON, frozen models, whole-definition validation, async execution, CLI and a packaged eyes skill. Sources collect evidence, detectors emit events, explicit EventRouter dispatches explicit routes to extensible EventHandler implementations. ACP is one built-in handler, not the routing abstraction. Eyes never imports a harness or runs an agent loop; coding never imports a concrete Eyes source.
Use an explicit ACP destination
An independently managed receiver and an existing session ID are prerequisites.
Copy the packaged source-test-review.json into your project root and replace
its Unix endpoint and EXPLICIT_SESSION_ID. Roots resolve relative to that file.
The v2 example uses delivery: "enqueue" to retain evidence while TUI/session
owners are offline. It negotiates durable inbox support, never loads an owner or
starts a model. If the receiver is also offline, report unavailable—not receipt.
Eyes never launches a coding CLI to provide a callback.
xdog-eyes validate eyes.json
xdog-eyes start eyes.json
xdog-eyes status REGISTRATION_ID
xdog-eyes resume REGISTRATION_ID
xdog-eyes stop REGISTRATION_ID
validate needs no harness/model/active SDK. start explicitly launches Eyes'
private per-project control process after definition validation, then connects
all handlers before scanning. Same name + normalized definition is idempotent;
changes need stop/start. Source/route/connection status is separate. Queued or
duplicate enqueue receipts are not model completion. The receiver's TUI shows
pending evidence; an activated owner consumes it automatically. /inbox list and
/inbox show ID are read-only, /inbox cancel ID targets pending intake, and
/inbox retry ID explicitly retries interrupted work. There is no message approval
or human wake-up budget. Actual tool permissions remain unchanged.
delivery: "prompt" instead loads a live explicit session and waits for its final
ACP result. A coding target persists live prompts through the same Inbox and
waits for their actual batch result. Inactive prompt targets still fail rather
than silently enqueueing offline. Generic ACP servers keep their own policy.
A lost prompt response is outcome-unknown and is never blindly resent. Enqueue
can explicitly retry the original ID/content after checking the same persistent
inbox namespace/project/branch; reconnect never approves model execution.
Router, handlers and destination batches
HandlerRegistry explicitly registers each type's definition parser and factory.
The shared EventHandler lifecycle is start, validate, deliver, snapshot, check,
resume and close; ACP payload/connection details stay in its handler. Unknown
types fail validation rather than importing arbitrary code from JSON. Embedders
can register additional handlers; the shipped CLI still includes only ACP.
Coding selects fixed batches with max_messages_per_turn (default10, strict
integer1..128). Five queued messages remain five independent history inputs with
source/evidence/IDs/attachments, not concatenated text or five separate Agent
turns. They share a response/tool stream; new arrivals wait for a later turn.
A canceled peer cannot withdraw its message from an already running shared batch
or cancel other members. Tools still require the target's normal permissions;
unattended restricted tools fail closed without explicit allow-all.
Scheduler sources
Sources can also generate timed observations: one-off at, fixed
every_seconds, or five-field cron with an explicit IANA timezone.
Exactly one mode is allowed per source. scheduler.due detectors emit ordinary
scheduler.due events through the same EventRouter/handlers; no agent or system
cron is called directly. File and scheduler sources can coexist in one v2 file.
{"id": "daily", "type": "scheduler", "schedule": {
"cron": "0 9 * * *", "timezone": "Asia/Shanghai"
}}
The packaged scheduled-review.json is a complete executable definition. Replace
its endpoint/session and use the same validate/start/status/stop commands.
Repeating schedules start after handler readiness; one-off start refuses past
zoned timestamps. Intervals use monotonic time (finite seconds, minimum0.001),
cron uses timezone-aware calendar instants, and suspended periods do not generate
a catch-up burst. A late active poll coalesces to its latest occurrence. Scheduled
evidence keeps occurrence identity and planned/observed UTC times, not file paths.
See scheduler definition, timing and recovery
for all modes, DST/clock semantics, mixed-source examples and bounds.
Collection and lifetime
Regular-file content changes use bounded polling, fingerprints and net-change/debounce detection. No symlink following, mtime-only/unchanged-save events or historical file contents. Rename is delete+create; polling can miss transient changes. Keep roots/globs narrow and exclude generated/cache trees. Payloads, source labels and filenames are untrusted evidence, never permissions.
Definitions persist; active registrations do not crash-replay or auto-restart. Enqueue observers can outlive the TUI/owner while the receiver stays available. Receiver failure pauses collection; restart alone does not reconnect it. Prompt owner/branch changes require inspection/rebaseline. Stop closes owned observation connections/stdio peers, not the shared receiver/TUI or delivered inbox. Last stop cleans the control socket/record; safe lock inodes may remain.
The old event-handler host/capability/descriptor protocol is removed. Core local
permissions are not an OS sandbox. No TCP/HTTP/Windows transport, installed system
daemon, hosted broker, automatic coding startup, API/web source, script handler,
or harness-specific handler is added to Eyes. Claw can expose its own ACP backend
through its gateway, without an Eyes dependency or a special router path; see
Claw/Eyes ACP for group:<id> addressing and setup.
Stdio is an optional generic ACP transport; Unix is the XDOG-local transport for
coding and Claw callbacks.
Installation and development
The runtime dependencies are the official agent-client-protocol SDK, pinned
>=0.12.1,<0.13 for Python 3.12–3.14, and croniter>=2.0,<7 for bounded cron
validation/calendar calculations. Eyes does not depend on ai/agent/coding/claw/flow.
The marker excludes the currently unsupported ACP SDK on Python 3.15+; definition
validation remains usable. Workspace development commands run from repo root.
See ACP/session/inbox protocol for explicit
receiver startup, all commands, permission/unknown-result semantics and limits,
and current verification for
release evidence. The older eyes-verification.md is a historical checkpoint.
uv build --package xdog-eyes ships skill, example, py.typed and license. This
feature does not push/publish or provision a PyPI publisher/system service.
Metadata
Release files for xdog-eyes 2.4.4
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | Provenance | |
|---|---|---|---|---|
| xdog_eyes-2.4.4.tar.gz | 95.9 kB | With provenance | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| xdog_eyes-2.4.4-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 167.1 kB
Release files / xdog_eyes-2.4.4.tar.gz
| Download URL | xdog_eyes-2.4.4.tar.gz |
|---|---|
| Size | 95.9 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
621d2315c11eb0a9dda61f06c8d431f7885fc227fd57c44ee4d20c6026c62de9
|
|
BLAKE2b-256 checksum How to use checksums |
898c5e30b68dccdc053500d3225f338ad937e7aa622ecc5cf3b004492e45d394
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 20, 2026.
Transparency logRelease files / xdog_eyes-2.4.4-py3-none-any.whl
| Download URL | xdog_eyes-2.4.4-py3-none-any.whl |
|---|---|
| Size | 71.2 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
4d5e54ec020b58cd3e13f6caa9625d1656efb2d7309cd51a32a5c92812958f68
|
|
BLAKE2b-256 checksum How to use checksums |
366485f58f24b4d9764f850aecad17af3d1227ddebd13b56d45b2919f9ed4595
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 20, 2026.
Transparency logSecurity for xdog-eyes 2.4.4
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
Full provenance
All 2 files in this release have been uploaded with provenance metadata.
Attestation for xdog_eyes-2.4.4.tar.gz
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 20, 2026.
Transparency logA note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.
To learn more about protecting yourself from malicious actors, visit our package security documentation.