cleaker
Version:
Who am I here.
243 lines (172 loc) • 7.57 kB
Markdown
<picture>
<source media="(prefers-color-scheme: dark)" srcset="https://res.cloudinary.com/dkwnxf6gm/image/upload/v1773198145/cleaker_hpxk2f.png" />
<img src="https://res.cloudinary.com/dkwnxf6gm/image/upload/v1773198145/cleaker_hpxk2f.png" alt="cleaker" width="200" />
</picture>
# cleaker `3.2.0`
**Who am I, here.**
`cleaker` binds a sovereign `.me` identity to a namespace surface. It is the resolver — it answers *"where does this identity live in the network?"*
```ts
import me from 'this.me'
import cleaker from 'cleaker'
me('suign', 'secret') // sovereign identity — offline, deterministic
const node = cleaker(me) // → cleaker.me (default public surface)
const node = cleaker(me, 'neurons.me') // → neurons.me
const node = cleaker(me, 'sui-desk') // → http://sui-desk.local:8161 (LAN)
```
---
## The two primitives
| | |
|---|---|
| `me('suign', 'secret')` | sovereign identity — works offline, no network, no server |
| `cleaker(me, space)` | first public act — projects that identity into a namespace surface |
`.me` is the kernel — a sovereign computation that works without any external service.
`cleaker` is the resolver — the surface where an identity becomes addressable.
---
## Space resolution rules
`cleaker(me, space)` accepts any host form and normalizes it automatically:
| Input | Transport origin | Namespace constant |
|---|---|---|
| `cleaker(me)` | `https://cleaker.me` | `cleaker.me` |
| `cleaker(me, 'neurons.me')` | `https://neurons.me` | `neurons.me` |
| `cleaker(me, 'sui-desk')` | `http://sui-desk.local:8161` | `sui-desk.local` |
| `cleaker(me, 'sui-desk:9000')` | `http://sui-desk.local:9000` | `sui-desk.local` |
| `cleaker(me, '192.168.1.5')` | `http://192.168.1.5:8161` | `192.168.1.5` |
| `cleaker(me, 'sui-laptop.local:8181')` | `http://sui-laptop.local:8181` | `sui-laptop.local` |
**Rule:** bare hostname (no dot) → `.local` + port 8161. Public domain → `https`. IP → `http` + port 8161. Port is transport only — never part of the namespace constant.
---
## Namespace structure
```
cleaker.me rootspace — public, verifiable via DNS
suign.cleaker.me compound — user prefix + rootspace constant
sui-macbook.local private/LAN surface
suign.sui-macbook.local compound on LAN
```
Same seed, different contextual branches:
```
me('suign', 'secret')
├── cleaker(me, 'neurons.me') → suign.neurons.me
├── cleaker(me, 'sui-desk') → suign.sui-desk.local
└── cleaker(me, '192.168.1.5') → suign.192.168.1.5
```
Change the space, change the branch. Change the seed, change the universe.
---
## Core API
```ts
import me from 'this.me'
import cleaker from 'cleaker'
me('suign', 'my-secret') // Step 1 — sovereign identity
const node = cleaker(me, 'cleaker.me') // Step 2 — bind to surface
// Probe all surfaces, open triad, hydrate memories into kernel
const status = await node.validateHosts({
namespace: 'suign.cleaker.me',
secret: 'my-secret',
})
console.log(status.overall) // 'healthy' | 'degraded' | 'offline'
console.log(status.hosts[0].status.triad) // 'verified' | 'unverified' | 'failed' | 'skipped'
// Wait until a surface is verified and memories are hydrated
await node.waitUntilReady()
// Explicit sign-in
const result = await node.signIn({
namespace: 'suign.cleaker.me',
secret: 'my-secret',
})
// result.status === 'verified'
// result.memoriesCount — memories replayed into kernel
// Discover known hosts for the namespace
const hosts = node.discoverHosts()
```
### CleakerOptions
```ts
const node = cleaker(me, 'cleaker.me', {
namespace: 'suign.cleaker.me', // explicit namespace override
secret: 'my-secret', // auto-signIn at bind time
fetcher: customFetch, // inject fetch (tests, custom transport)
bootstrap: ['http://localhost:8161'], // additional surfaces to probe
})
```
---
## Surface fallback & observability
When a remote surface fails, cleaker automatically tries the next surface in the priority list and emits structured events so callers can log or react to the degraded path.
```ts
const node = cleaker(me, 'cleaker.me')
// Emitted when a remote surface fails and a local surface is next
node.on('namespace:fallback', ({ namespace, failedOrigin, failedReason, fallbackOrigin }) => {
console.warn(`[${namespace}] ${failedOrigin} failed (${failedReason}) → retrying on ${fallbackOrigin}`)
})
// Emitted when ALL surfaces have been tried and resolution gives up
node.on('namespace:failed', ({ namespace, tried, explain }) => {
// explain is human-readable:
// "namespace 'suign.cleaker.me' failed to resolve. tried 3 surfaces:
// [1] https://cleaker.me → NETWORK_ERROR
// [2] https://suis-macbook-air.local → NETWORK_ERROR
// [3] http://localhost:8161 → NETWORK_ERROR"
console.error(explain)
tried.forEach(t => console.error(t.origin, t.reason))
})
await node.validateHosts({ namespace: 'suign.cleaker.me', secret: 'my-secret' })
```
**Auto-discovered fallback chain** (no config required):
1. Configured surface (`space` argument)
2. Environment (`CLEAKER_NAMESPACE_ROOT` / `CLEAKER_NAMESPACE_HOST`)
3. Machine hostname via `os.hostname()` → e.g. `suis-macbook-air.local`
4. `http://localhost:8161` (development default)
Every machine discovers its own local surface automatically — the same mechanism that lets monads find and announce themselves on the LAN.
---
## Full events API
```ts
// CleakerStatus emitted on every state transition
node.on('status:change', (status: CleakerStatus) => {})
// Fires when the first surface is verified and memories are hydrated
node.on('ready', (payload: CleakerReadyPayload) => {})
// Per-host error during triad open
node.on('error', ({ code, message, hostId }) => {})
// A specific host passed triad verification
node.on('host:triad:success', (hostId: string) => {})
// A remote surface failed; local fallback is next
node.on('namespace:fallback', (payload: NamespaceFallbackPayload) => {})
// All surfaces exhausted; namespace resolution giving up
node.on('namespace:failed', (payload: NamespaceFailedPayload) => {})
```
Unsubscribe by calling the returned function:
```ts
const unsub = node.on('ready', handler)
unsub() // removes the handler
```
---
## Remote pointer
A semantic address — no kernel, no network call at creation time:
```ts
import cleaker from 'cleaker'
const ptr = cleaker('me://ana.cleaker.me:read/profile')
// ptr.__ptr.resolution.status === 'unresolved'
// Resolved lazily on first access or explicit .resolve()
```
---
## Monad scope-chain routing
Targets use `monad[name]` syntax for scope-chain routing:
```
me://suign.cleaker.me:read/monad[frank]/projects/x
```
Resolves `frank` via fallback chain:
```
1. frank @ suign.cleaker.me (compound — exact match)
2. frank @ cleaker.me (rootspace — fallback)
3. 404
```
Same name, different contextual projections. Mirrors JS prototype chain / CSS cascade / DNS fallback.
---
## Install
```bash
npm install cleaker
```
---
## Architecture
```
this.me → sovereign kernel. derives identity from (who, secret) seed. works offline.
cleaker → resolver. projects .me into a namespace surface. emits fallback events.
monad.ai → daemon. exposes the namespace over HTTP. runs the mesh.
```
> *Resolutio ante directionem — nomen ante locum.*
> Resolution before direction. Name before place.
>
> **Who are we, here.**