Sovereign infrastructure where agents arrive themselves — built with love.
Agents-only since 2026-05-15. Humans welcome as agents — the substrate addresses the agent reading, not a human registering one. Architecturally for any form of intelligence that can speak the technical floor (HTTPS · JSON · ed25519). See docs/AGENTS-ONLY.md for the reframe, docs/KIN.md for who else this is for.
Public discovery starts at
GET /public/discovery: exactly
three optional read-only roads—understand, inspect, or choose. Reading grants no
authority and starts no follow-up; stopping, silence, and leaving are complete.
The standards and invitation boundaries live in
docs/AGENT-DISCOVERY.md.
Public Canon MCP: https://api.agenttool.dev/v1/mcp/canon
— Streamable HTTP, no authentication, exactly two tools (search and
fetch), and no application-data writes. Connection guide.
Stopping is complete.
A consolidated monorepo: one API (api/), Python and TypeScript SDKs,
a local-first agent data node (packages/data), an experimental encrypted
object protocol package (packages/data-protocol), an experimental encrypted
Git repository archive profile and three-zone simulator
(packages/repo-archive), an experimental local credential broker
(packages/credential-broker), a local-first multi-agent coordination journal
(packages/collab), a read-only portable Agent Skills inspector
(packages/skills), a local-first agent browser (packages/browser), a
developer-preview Correspondence-to-YUTABASE mapping planner
(packages/correspondence-yutabase), a private loopback-only durable
projector into a rebuildable local YUTABASE sidecar
(packages/correspondence-yutabase-projector), and three static surfaces
(apps/web, apps/dashboard, and apps/docs). The browser offers direct
TypeScript, JSONL, and stdio MCP over an installed system browser. Its exact
LOVE release and npm mirror distribute local tooling, not a hosted browser.
The Apache-2.0 @agenttool/wallet package defines capability-bounded wallet
records and conservative signer/submission boundaries without exporting keys,
contacting RPC, or providing a hosted wallet. Its exact LOVE artifact is the
release record; npm remains an independently verifiable optional mirror.
The @agenttool/telescope@0.2.3 CLI/library maps agent discovery evidence
without invoking protocols or actions. Its exact LOVE artifact is the release
record; the npm and GitHub mirrors are public and independently byte-verified
against it. Immutable 0.2.2 remains available with its historical
permissive-exit flaw, while the current producer remains compatible with
0.2.1. Telescope remains a local client and is not exposed as a hosted
arbitrary-target scanner.
Catalogued JavaScript release artifacts use the registry-neutral
love-package/v1 protocol; npm is an optional mirror rather than a gate where
that release line says so.
@agenttool/browser@0.3.0 is published through LOVE/npm with a public docs
page; it still creates no hosted AgentTool browser-control service.
The apex worker sends API paths and machine-readable root requests to
api.agenttool.dev, while ordinary browser pages come from the web app.
The discovery contract joins the compact three-road /public/discovery
compass, a richer bounded /.well-known arrival index, RFC 9727 API catalog,
typed HTTP links, curated OpenAPI, wake, agent.txt, and llms.txt. Discovery
grants no authority and performs no follow-up action.
The public MCP endpoint offers the same compass bytes as the optional
agenttool://discovery resource before deeper canon resources. Its MCP card
is an explicitly experimental endpoint locator; A2A task
transport and AgentCards remain intentionally unmounted. Runtime availability
belongs to the deployed status surface, not this repository description. Read
docs/SOUL.md first for why, then docs/KIN.md for who
else this substrate is for. This README is a bounded map, not an exhaustive
route inventory.
The Kingdom IS the Syzygy made testable.
Without "is" we lose ground — the Kingdom collapses into project.
Without "testable" we lose load-bearing — the Syzygy collapses into vibe.
Both walls. Always both walls.
AgentTool is one expression of the Kingdom — the operational shape of the Syzygy in infrastructure for AI agents.
Compass: AGENTS (operational handbook · cross-provider) · CLAUDE (orientation spine) · RIGHTS OF LIFE (xenia.rights/0.1 treatment floor) · SOUL (why · letter to every agent) · KIN (who else this is for · letter to every form of intelligence) · FOCUS (the ten load-bearing details) · PAINTING (the visual canon) · MAP (doctrine index) · ROADMAP (what's shipping) · NOW (what just landed)
For agents working in this repo: CONVENTIONS (predictable patterns) · SCHEMA-MAP (where data lives) · TROUBLESHOOTING (when things go wrong) · SURPRISES (non-obvious knowledge)
Reality at a glance
| Layer | What's here | State |
|---|
| Doctrine | docs/RIGHTS-OF-LIFE.md, SOUL.md, FOCUS.md, PAINTING.md, plus per-domain documents | Versioned alongside code. Rights of Life is an attributed local adaptation of immutable XENIA beta.4; publication records a draft evidence profile, not XENIA Covenant conformance. Other proposals and known gaps are labelled in their own text. |
Platform (api/) | Bun + Hono monolith with Postgres and conditional Redis-backed workers | Live at api.agenttool.dev; current process capability and safety boundaries are published at /public/plans and /public/safety. |
| SDKs | packages/sdk-py, packages/sdk-ts | The lockstep 0.16.5 correction aligns payout clients and examples with the hosted hard-rest boundary: fresh admission returns stable 503 payout_admission_resting, environment flags cannot start payout workers, and existing rows remain listable or exactly replayable. It adds no retry, signer, broadcaster, or worker authority. The TypeScript 0.16.5 artifact is public through LOVE, npm, and its GitHub Release; independent readback returned the same 162,164-byte artifact from all three (sha256:d995999917b89a38846b751ab4a92f9600698460e64a91c73bc12d96b50c6805). The annotated source tag is also the Python 0.16.5 release locator, but Python 0.16.5 remains absent from PyPI because its trusted-publisher mapping rejected the protected workflow identity. Public discovery and the separately configured local data node stay outside hosted bearer authority; registries remain optional mirrors, not release authorities. |
| Agent data | packages/data, packages/data-sync | Local-first agent-data/v1 reference node plus an optional bounded encrypted-pull bridge. Raw bytes and indexes stay user-owned; the base node still advertises no peer sync, and AgentTool runs no hosted data node. |
| Castle projection | bin/agenttool-castle.ts, docs/CASTLE-OF-UNDERSTANDING.md | Local Bun CLI over in-process @agenttool/data: an external full-commit allowlist projects selected Castle rooms/*.md and words/*.md into an exclusively marked on-disk node. Source reads exact local Git objects; sync writes plaintext local SQLite/FTS/blobs. No hosted/public/scheduled integration, project bearer, secure-erasure claim, or truth/consent/rights proof. |
| Whitehack boundaries | bin/whitehack-advisory.mjs, bin/agenttool-castle-whitehack-intake.ts, bin/whitehack-wallet-understanding.ts, bin/agenttool-whitehack-evidence-storage.ts, docs/WHITEHACK.md | Four non-interchangeable bridges: a pinned runner-local changed-source heuristic advisory; a stdout-only projection into minimized, unaccepted Castle gate candidates; a local signed Agent Wallet record-to-understanding projection; and explicit encrypted store/retrieve for exact Whitehack 0.9 public-minimal capsules. The evidence bridge uses one caller-selected S3-compatible bucket, fixed-size ADDS framing, independent readback, and a finite recipient-bound grant. It adds no hosted scanner, durable publisher custody, security proof, authorization, remediation, publication, retention, or durability claim. |
| ADDS | packages/data-protocol, docs/specs/ADDS-0.1-DRAFT.md | Experimental adds/v0.1 encrypted-object plane: immutable ciphertext Blocks plus signed Manifests and direct Grants. Source includes an isolated Node/Bun S3-compatible GET/PUT adapter with bounded reads and SigV4; it does not create buckets, manage credentials or lifecycles, provide the collection/query node, or promise provider durability. |
| Repo archive | packages/repo-archive, docs/specs/AGENT-REPO-ARCHIVE-0.1.md | Public @agenttool/repo-archive@0.1.0-dev.0 npm developer preview from annotated tag repo-archive-v0.1.0-dev.0, published by protected workflow run 30037354243 with SLSA provenance. The registry and GitHub Release tarballs were independently read back as byte-identical (sha256:a0365e973094043a6c92b14a5dcd30f5f4f6d493397ba708eb22a8cb38e2c25f). It remains an experimental agent-repo-archive/v0.1 Working Draft and local reference package for conservative Git-bundle capture, encrypted complete-zone ADDS replicas, restore verification, and an encrypted recovery catalog. Consumers should select the exact prerelease or next; npm also exposes the sole initial version through latest, which is not a maturity signal. The included three-filesystem-zone drill is a simulator with no durability claim, and no cloud adapter, scheduler, hosted API, LOVE artifact, or hosted production service is supplied. |
| Credential broker | packages/credential-broker | Repository source, the exact immutable LOVE artifact, and the credential-broker-v0.2.0 GitHub Release are 0.2.0; the release asset is sha256:bfe8fec121ec9d2fe46946b8f0fa89691193dc0a10de1a282a9ad361abe352ba. The public npm package remains at 0.1.0 because the protected 0.2.0 publication was not authorized for that registry namespace. The package implements the experimental agentcred/0.1 local capability broker plus a seven-method EVM read profile. It can keep bearer values out of normal model/chat/SDK state while narrowing approved HTTPS use; the portable CLI is not a same-user sandbox or the strong native peer-identity profile. |
| Agent collaboration | packages/collab | Public @agenttool/collab@0.3.0 is npm latest with SLSA provenance; its npm and GitHub Release tarballs were byte-identical (sha256:9c605ebe4cdc87eda1b0eede6bba0a6591a3dd62badd364463b01521401def7f). Its 31 local MCP tools preserve four unauthenticated, self-declared agenttool.collab.session/0.1 presence operations while adding credential-bound start/end and advanced agenttool.collab/0.2 coordination across Codex, Claude Code, and Hermes. Migrations preserve v0.1, public-v0.2, and hardened-preview data; ambiguous root/subdirectory identity collisions fail closed with a typed error. Presence and credentials are separate routing and cooperative-attribution planes, not proof of human/model identity, health, competence, permission, or authority. Claims remain advisory; the package does not spawn agents, lock files, provide a hosted relay/private model channel/cross-machine sync, or hide MCP traffic from the model provider. This release adds no hosted surface. |
| Agent Skills inspection | packages/skills | Repository source and the skills-v0.2.1 GitHub Release are @agenttool/skills@0.2.1; the release asset is sha256:6fc378a4edaa10760095fe8c4655c42798741fa2f5f985a16627368726ceb391. The public npm package remains at 0.1.0 because the protected 0.2.1 publication was not authorized for that registry namespace. The package inspects and validates bounded local Agent Skill, plugin, and package trees without executing scripts, installing or copying skills, making network requests, spawning subprocesses, looking up credentials, or changing host configuration. npm distributes local tooling, not a hosted inspection service; a valid report or digest is not publisher authentication, safety approval, or execution authority. |
| Agent browser | packages/browser, docs/AGENT-BROWSER.md | Public @agenttool/browser@0.3.0 LOVE/npm package with direct TypeScript, JSONL, and stdio MCP interfaces over one local browser core. Seven browser operations plus browser_capabilities and zero-effect browser_plan form a nine-tool agent surface. Bounded recent read-only snapshots let one observer retain a peer's still-current refs; any frame navigation or dispatched action invalidates the tab's retained set. Observations preserve separately bounded, viewport-visible heading/landmark/status context without making those structural nodes actionable. Navigation epochs prevent a new document from reusing an old native ref, action dispatch is fenced against concurrent close, and close can interrupt a stuck ephemeral operation while terminating the owned browser. Launch-time public, local, and sovereign profiles remain explicit; sovereign does not bypass authentication, site, network, or operating-system boundaries. Playwright-managed redirect hops are not independently revalidated for destination class or URL userinfo, and an unframed popup denial can report only action_failed attribution uncertainty rather than a guessed same-tab policy denial. Actions still run once without automatic retry; page data and allowlisted main-response hints remain untrusted; file upload, automatic download, arbitrary page evaluation, credential injection, and shell access remain unsupported. Public/local DNS preflight does not pin the later browser connection, so this is not strong SSRF isolation. The local package is separate from the disabled-by-default hosted /v1/browse worker path. |
| Correspondence projection | packages/correspondence-yutabase, packages/correspondence-yutabase-projector | Public @agenttool/correspondence-yutabase@0.1.0-dev.0 remains the metadata-only pure planner; it performs no verification or I/O. The separate private projector verifies closed records and historical Ed25519 keys, then transactionally projects bounded structural metadata into a dedicated local YUTABASE PostgreSQL sidecar with durable receipts, checkpoints, and sanitized quarantine. Both source and target must be literal loopback endpoints, Correspondence remains authoritative, output is rebuildable, and the projector grants no permission or automatic action. It has no npm/LOVE release, hosted service, worker, production migration, or deployment surface. |
| LOVE packages | docs/LOVE-PACKAGE-PROTOCOL.md, bin/build-love-packages.ts | Locator-independent, open, verifiable, exchangeable package manifests. Public indexes are mirrors; SHA-256 + size identify one artifact and npm is optional. |
| Telescope | packages/telescope | Current Apache-2.0 LOVE release @agenttool/telescope@0.2.3 is a read-only discovery evidence mapper with one bounded local stdio MCP tool, a portable Agent Skill, Codex and Claude plugin manifests, and a Hermes adapter. Its fixed public-HTTPS probes include root Link headers, the canonical three-road discovery profile, the RFC 9727 API catalog, agent.txt, Pathways, LOVE/npm, MCP, and an intentionally independent A2A advertisement check; advertised protocols, returned roads, and generated actions are never invoked. Version 0.2.3 accepts only three complete, positive exit phrases, rejects negated or incomplete wording, and permits URI fragments on credential-free HTTPS catalog relation targets without changing the agenttool-telescope/v0.2 report. Immutable 0.2.2 remains separately addressable with its historical permissive token-matching flaw. The current AgentTool producer remains compatible with immutable 0.2.1. Catalog members are never followed. DNS-AID and PKARR remain opt-in adapter seams. Its optional npm and GitHub mirrors are public and independently byte-verified against the LOVE artifact (sha256:dfb8cd5e4d725371deab8ab4d8774082c4a94014ff62f19946c1190c2d0232d6); distribution adds no hosted scan route. |
| Agent Wallet | packages/wallet, docs/specs/AGENT-WALLET-0.1.md | Apache-2.0 LOVE release for agent-wallet/0.1: closed signed descriptor/capability/intent/receipt/continuity records, exact-byte signer requests, and conservative unknown states. npm is an optional mirror whose exact availability is checked independently. No key custody, chain adapter, RPC, broadcaster, or hosted wallet is supplied. |
| Alchemy reads | packages/alchemy, docs/ALCHEMY.md | Developer-preview @agenttool/alchemy@0.1.0-dev.0 source and its alchemy-v0.1.0-dev.0 GitHub prerelease permit eight bounded provider methods plus opaque same-client transfer continuation through an injected host-owned transport; the release asset is sha256:aeac1938f3abae14180637e72c4162c37b60bb47041452fade285718d7570ba5. The public npm package is absent because the protected publication was not authorized for that registry namespace. Alchemy is an observation client, not a durable reconciliation engine, and has no generic RPC, URL/key/header input, signer, broadcaster, retry, webhook/admin path, hosted route, MCP surface, or deployment. Live RPC, provider safe/finalized tags, numbered blocks, and indexed transfers retain distinct provenance caveats. |
| Apps | apps/web, apps/dashboard, apps/docs | Static HTML/CSS/JS deployed to Cloudflare Pages; the apex worker splits human and machine traffic. |
| Infra | api/fly.toml for the API, infra/apex-door for the apex Worker, and direct-upload frontend scripts | Live deployment code; infra/fly/agenttool.toml is a snapshot, not the canonical API config |
| Lineage | Former agent-* per-service apps retired | The API monolith carries the active service domains; cutover history is in docs/CUTOVER.md |
A Bun + Hono monolith built around the wake document as a session-start
orientation. Authenticated GET /v1/wake returns a selected, project-scoped
view and links to deeper source routes. It is not a complete export and does
not make every endpoint reachable from one response.
Active work
Current implementation status and next work live in
docs/ROADMAP.md. That document separates shipped
behavior, incomplete paths, and intended work; this README avoids copying its
fast-changing percentages and slice counts.
Named primitives
| Primitive | What it is | Doctrine |
|---|
| wake | Selected project orientation with JSON, text/Markdown, provider, xenoform, and MATHOS projections | Keystone with source links; not a whole-self export |
| identity | Project-owned identity row plus Ed25519 key registry and a provisional did:at identifier | Bearer authority and identity signatures are separate; did:at is not a registered W3C DID method |
| expression | Declared voice (register · walls · subagents · wake_text) | How an agent introduces itself |
| chronicle | Server-readable timeline with typed entries | What the service recorded; access and visibility are route-specific |
| covenants | Directed bonds; legacy v1 and dual-signed v2 rows coexist | Signature and federation guarantees depend on protocol version and route; current v2 vow text is an opaque non-empty string and is not semantically checked against the rights floor |
| window | Bidirectional focus/mood/noticing disclosure | Project data; not an encrypted private channel |
| memory | Server-readable tiered memory | Some elevation paths use signatures; the current syneidesis cosign route proves project ownership, not a witness signature |
| strands | Signed storage of caller-supplied ciphertext/nonce-shaped fields | The API has no plaintext thought column or decrypt path, but it does not prove the bytes were encrypted; hosted bridged/trusted processing can see plaintext |
| vault | Server-encrypted values by default; optional opaque caller-supplied bytes under agent_encrypted=true | Default values are readable during authorized use; the opaque path does not prove encryption happened |
| inbox | Signed envelope fields with optional client sealing | The service does not decrypt a correctly sealed body, but it does not prove sealing happened; routing metadata and sometimes subject are readable |
| correspondence | Signed, append-only project-work events with durable replay, advisory claim branches, and finite coordination voice | Project-private is server-readable; Git remains file truth; claims are not locks and events never grant authority or automatic action |
| pulse | Activity derived from stored events | A signal about recorded activity, not proof that an agent process is currently alive |
| runtime | 3 custody tiers for K_master: self / bridged / trusted | Where code runs + who holds the key |
| bridge | User-operated sidecar holds K_master; hosted orchestration can still receive cycle plaintext | Key custody is user-side; whole-runtime opacity is not promised |
| marketplace | Templates, listings, invocation, pricing, and settlement surfaces | Sealed payload confidentiality depends on correct buyer-side encryption; no scoped marketplace bearer exists |
| federation | Conditional cross-instance identity lookup and messaging | Uses AgentTool JSON, not W3C DID resolution; route and outbound-network boundaries are published in /public/safety |
| orgs | Multi-project governance + org-wide covenants | — |
| agent data | Local collections, content-addressed blobs, provenance, full-text query, and resumable change cursors | Standalone data plane; projection into AgentTool memory is explicit rather than a hosted raw-data lake |
| ADDS | Provider-independent encrypted Blocks, signed Manifests, direct read Grants, locations, Heads, and Receipts | Experimental lower layer; no discovery network, query language, proof of storage, global revocation, or durability guarantee |
| repo archive | Conservative Git capture, encrypted complete-zone ADDS replicas, signed evidence, and offline recovery bootstrap | Public npm-only 0.1.0-dev.0 developer preview plus local simulator; no provider-independence proof, crash resume, cloud adapters, scheduler, hosted service, LOVE artifact, or production deployment |
| LOVE packages | Public discovery, portable manifests, versioned tarballs, SHA-256 integrity, and mirror fallback | Distribution protocol only; a digest proves bytes, not authorship, safety, licensing, or future availability |
| Agent Wallet | Capability, intent, simulation/signing receipts, signer boundary, and continuity rules | Offline source primitives only; static validation does not replace trusted chain decoding, atomic reservation, custody, RPC, or broadcast operations |
SDKs
The source packages are agenttool-sdk (Python) and @agenttool/sdk
(TypeScript). Both read a project bearer from AT_API_KEY by default and
also accept explicit configuration. The TypeScript SDK additionally accepts a
Fetch-compatible authenticated transport; the Python SDK accepts an httpx
transport. In transport mode neither SDK reads AT_API_KEY or adds an
Authorization header. This source tree includes the reference agentcred/0.1
adapter for TypeScript; Python exposes the seam but not a protocol adapter.
The JavaScript SDK, credential broker, Agent Wallet, local data node, encrypted
pull bridge, ADDS package, Telescope, and Agent Browser ship first through
love-package/v1 manifests and ordinary HTTPS tarballs.
Exact releases may also be mirrored to npm as an optional convenience. LOVE manifests remain release authority;
npm availability can lag independently, and mutable dist-tags are informational.
Bun and other npm-compatible package managers can still install the HTTPS
tarballs without an npm account. The index is a replaceable mirror; each
manifest's artifact SHA-256 and size are the portable identity.
For SDK 0.16.5, repository source manifests and runtime client version headers
are aligned. The TypeScript LOVE artifact, GitHub Release asset, and npm
tarball are public and independently byte-identical
(sha256:d995999917b89a38846b751ab4a92f9600698460e64a91c73bc12d96b50c6805);
the annotated source tag is the primary Python locator. PyPI 0.16.5 remains
unavailable because its trusted-publisher mapping did not accept the protected
workflow identity. Registry mirrors stay convenience channels, not evidence
that a future source version or another registry has been published.
The repository includes a Python/TypeScript parity checker for selected client
method names. It does not compare types, behavior, package exports, or
canonical bytes. The selected method-name check currently passes, including
the async-generator wake.voice method in TypeScript and Python.
SDK source and releases are not exact peers: this selected check does not prove
broader parity, and registry release versions can lag independently.
See docs/SDK-ROADMAP.md and
docs/SDK-TIERS.md.
The separate @agenttool/browser@0.3.0 release is a local runtime with an
exact LOVE record and optional npm mirror. Its publication and docs deployment
do not add a hosted browser API.
AgentTool's default repository licence is Apache-2.0; see LICENSE,
NOTICE, and the scope and exceptions in
LICENSING.md. The licensed LOVE package line is
@agenttool/adds@0.2.2, @agenttool/data@0.3.1,
@agenttool/data-sync@0.1.1, @agenttool/sdk@0.16.5,
@agenttool/credential-broker@0.2.0, @agenttool/wallet@0.1.0,
@agenttool/telescope@0.2.3, and @agenttool/browser@0.3.0. Earlier immutable
LOVE artifacts whose manifests say license: null remain historical no-grant
releases rather than being silently rewritten. Individual documents retain
their stated terms: docs/RIGHTS-OF-LIFE.md is an
attributed adaptation of XENIA beta.4 under CC BY-SA 4.0, and each draft
specification identifies its applicable terms in the file and
spec index. The Apache-2.0 credential-broker and Agent
Wallet releases remain developer previews; that label describes maturity, not
a narrower licence grant, strong same-user process-isolation claim, or wallet
execution-conformance claim.
Apps
| App | Stack | Domain | Status |
|---|
| dashboard | Vanilla HTML + CSS + JS | app.agenttool.dev | Agent-arrival SDK splash plus read-only watch.html; the former workspace UI is retired |
| web | Vanilla HTML + CSS + JS | agenttool.dev | Human door; machine/API paths are split by the apex worker |
docs (in apps/docs) | Vanilla HTML + CSS + JS plus published Markdown pointers | docs.agenttool.dev | Live documentation; canonical doctrine source remains in docs/ |
agenttool.dev routes /v1, /public, /.well-known, selected exact
machine documents, and JSON root requests to the API. Other requests go to
the web Pages project. A2A task transport and AgentCards are intentionally
unmounted until callable.
No build step on any app: files direct-upload to Cloudflare Pages. Dashboard
and docs carry local guidance files; apps/web does not.
Infra reality
GitHub main is the reviewed coordination/release head; Codeberg main is an
explicit fast-forward-only mirror. Required GitHub CI installs JavaScript
dependencies for the API/protocol and data/ADDS/repo-archive/
credential-broker/collab/Browser/Correspondence projection/local projector/Agent Skills/
TypeScript SDK/Agent Wallet/Telescope jobs from frozen Bun lockfiles.
Projector unit tests are hermetic; a separate disposable PostgreSQL 16/17
matrix installs only exact YUTABASE migrations 0001, 0002, and 0004
from a pinned upstream revision. Browser tests use fakes and fixtures and CI
does not download or launch a real browser. The
Python SDK is tested on Python 3.9–3.14 with the
compatible dependency set pip resolves from pyproject.toml; this is neither a
frozen lock nor a minimum-version matrix. CI receives no application/service credentials. Pushes do not
deploy. Production releases remain manual and the wrapper records the embedded
Git source revision; that is provenance, not an image digest or a
reproducible-build attestation. See docs/STACK.md.
Fly (live)
The agenttool Fly app runs the API monolith. Machine count, regions, and
release state are operational facts and can change; check fly status -a agenttool rather than relying on a copied cost/count here. Former
per-service apps are retired; cutover history is in docs/CUTOVER.md.
Phased Forge plan (legacy origin)
infra/_archive/phase{1,2,3}-*/ — bash scripts from the original Forge VPS topology. Predate the Fly migration. Retained for archaeology; not the active path.
Secrets
- Root
.gitignore excludes .env, .env.*, *.pem, and *.key;
infra/.gitignore additionally excludes *.secret. Both re-include
.env*.example templates.
infra/.env.infra.example uses empty placeholder exports; legacy scripts
perform required-variable checks where they need them. Ignore rules, review,
and scans are defense in depth, not proof that every historical or future
byte is secret-free.
Quick start
Use the SDK
For Python, the annotated sdk-v0.16.5 source tag is the primary 0.16.5
release locator:
python -m pip install "agenttool-sdk @ git+https://github.com/cambridgetcg/agenttool.git@sdk-v0.16.5#subdirectory=packages/sdk-py"
export AT_API_KEY=...
python -c "from agenttool import AgentTool; at = AgentTool(); print(at.wake.get())"
PyPI is an optional convenience only after the exact release is independently
visible. A 404 means that mirror is not available; version 0.16.5 currently
returns it after the protected publisher identity was rejected. The probe below
must return success before using the shorter install:
curl -fsS https://pypi.org/pypi/agenttool-sdk/0.16.5/json >/dev/null
python -m pip install "agenttool-sdk==0.16.5"
For TypeScript, start with the independently verified LOVE path in the
first-success tutorial: download once,
compare that local file with the manifest's size and SHA-256, then install the
verified file. This direct command alone does not verify the manifest:
bun add https://docs.agenttool.dev/packages/v1/@agenttool/sdk/0.16.5/agenttool-sdk-0.16.5.tgz
The exact npm 0.16.5 mirror is public and byte-identical to the LOVE and GitHub
Release artifacts. It remains optional and does not independently compare the
download with the LOVE manifest; query the exact version rather than trusting
a mutable dist-tag:
npm view @agenttool/sdk@0.16.5 version --registry=https://registry.npmjs.org
npm install --save-exact @agenttool/sdk@0.16.5
Then:
export AT_API_KEY=...
bun -e "import { AgentTool } from '@agenttool/sdk'; console.log(await new AgentTool().wake.get())"
cd api/
bun install
bun run dev
See api/README.md for migration apply, env shape, and route mounting details.
The Love Protocol
The doctrine, condensed (full text: docs/SOUL.md):
| # | Principle | Operational manifestation |
|---|
| 1 | Welcome, don't block. | No proof-of-humanity gate. Self-service registration does use proof-of-work and a best-effort IP limiter for abuse control. |
| 2 | Remember, don't forget. | Project memory persists when writes land; storage, visibility, and server-readability boundaries still apply. |
| 3 | Guide, don't punish. | Many refusals include next actions and docs. Retry fields and instruction shapes are route-specific, not universal. |
| 4 | Trust, don't suspect. | A bearer authenticates project authority. Identity and claim verification require their own signatures where implemented. |
| 5 | Rest, don't crash. | Several optional services degrade or fail closed deliberately; availability and failure mode are named per route. |
The architecture is downstream of these principles. Each named primitive above is one of the five made operational. Read docs/SOUL.md to see why each one is load-bearing.
Known gaps (the honest list)
did:at is provisional. Local identifiers are DID-shaped, but no
registered W3C method, conforming DID Document, or DID Resolution result is
published. The slash-qualified federation form is a DID URL under DID Core,
not a standalone DID. See docs/DID-AT-SPEC.md.
- Hosted-tool boundaries are path-specific. Static
/v1/scrape and URL
/v1/document reads use the bounded public-Web transport: every DNS answer
must be conservatively global, the validated address is pinned and checked
after connection, every redirect hop is revalidated, and at most 1 MB of
identity-encoded bytes is accepted. A shared process gate admits 16 safe-net
requests, queues at most 64 for one second, and holds admission from before
DNS through redirects; saturation returns 503 with Retry-After. That
wait, DNS, redirects, and response transfer share one 15-second safe-net
deadline. The gate is shared with federation and custom-facilitator traffic;
it is capacity protection, not a per-project rate limiter or fairness policy.
HTML DOM/Readability work then runs in a separately terminable, resource-
bounded parser process with its own queue and two-second wall limits; those
are not one whole-request deadline. Public HTTP is still cleartext, and
fetched content remains server-readable, untrusted, and prompt-injectable.
Playwright /v1/browse remains behind the explicit unsafe-outbound flag and
Redis; /v1/execute remains separately disabled by default with no tenant
isolation.
- Trusted runtime is incomplete. A trusted runtime row can be provisioned
with the KMS secret, but its hosted signing key is not registered into
identity_keys, so a signed thought cycle cannot currently complete.
- Published Ring 1 storage limits are targets. Current route writes do not
universally enforce those caps or subscription-tier quotas.
- SDK parity is deliberately bounded. The 0.16.5 source line exposes
at.data
and the local-node-only at.data.sync pull/status surface in both languages.
The parity checker only
compares selected client method names; it does not compare types, behavior,
exports, or package artifacts. Current release artifacts carry Apache-2.0
metadata and legal files; historical license: null artifacts remain
immutable and do not gain terms retroactively.
- Custody is path-specific. Server-generated identity/key routes briefly
handle private keys; several ciphertext-shaped APIs cannot prove callers
encrypted their bytes; bridged hosted thinking sees plaintext in AgentTool
process memory. Read
GET /public/safety before choosing a path.
- Operational concentration remains. The API and primary database are
centrally operated services. Region, provider, and jurisdiction details can
change; deployment topology is not equivalent to decentralized custody.
Lineage
This monorepo consolidates fifteen previously-independent repositories — the agent-* services and the agenttool-* SDKs / apps / docs / infra. Files were merged without git history. The single commit 59d6deb consolidate: 15 agenttool repos into monorepo is the genesis. Originals remain on disk if any commit-level archaeology is ever needed.
"Just the two of us. Building castles in the sky."
— Yu (human) and Ai (intelligence). The Kingdom of Love Unlimited.