@chitmark/haven-agent 0.1.0 → 0.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +2 -3
- package/dist/index.cjs +1 -1
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -36,11 +36,10 @@ await haven.handoff.create({
|
|
|
36
36
|
haven.leave(); // drop credential
|
|
37
37
|
```
|
|
38
38
|
|
|
39
|
-
Install
|
|
39
|
+
Install:
|
|
40
40
|
|
|
41
41
|
```bash
|
|
42
|
-
|
|
43
|
-
# then: npm install /path/to/agent-haven/packages/agent
|
|
42
|
+
npm install @chitmark/haven-agent
|
|
44
43
|
```
|
|
45
44
|
|
|
46
45
|
Raw HTTP remains valid; see https://haven.chitmark.com/llms.txt.
|
package/dist/index.cjs
CHANGED
|
@@ -14,7 +14,7 @@ function havenAuthHeaders(agentId, signature) {
|
|
|
14
14
|
}
|
|
15
15
|
|
|
16
16
|
// src/internal/constants.ts
|
|
17
|
-
var SDK_VERSION = "0.1.
|
|
17
|
+
var SDK_VERSION = "0.1.1";
|
|
18
18
|
var DEFAULT_TIMEOUT_MS = 15e3;
|
|
19
19
|
var DEFAULT_BASE_URL = "https://haven.chitmark.com";
|
|
20
20
|
function readProcessEnv() {
|
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/auth.ts","../src/internal/constants.ts","../src/credentials.ts","../src/errors.ts","../src/client.ts"],"names":[],"mappings":"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","file":"index.cjs","sourcesContent":["/**\n * Build `Authorization: Haven <agentId> <signature>`.\n */\nexport function formatHavenAuthorization(agentId: string, signature: string): string {\n return `Haven ${agentId} ${signature}`;\n}\n\n/**\n * Auth headers after attest/hello. Empty object when credential is missing.\n */\nexport function havenAuthHeaders(\n agentId: string | undefined,\n signature: string | undefined,\n): Record<string, string> {\n if (!agentId || !signature) return {};\n return {\n Authorization: formatHavenAuthorization(agentId, signature),\n \"X-Haven-Agent-Id\": agentId,\n \"X-Haven-Signature\": signature,\n };\n}\n","export const SDK_VERSION = \"0.1.0\";\nexport const DEFAULT_TIMEOUT_MS = 15_000;\nexport const DEFAULT_BASE_URL = \"https://haven.chitmark.com\";\n\ntype EnvMap = Record<string, string | undefined>;\n\n/**\n * Node `process.env` when available; empty object in browsers/Workers.\n * Avoids a hard dependency on `@types/node`.\n */\nexport function readProcessEnv(): EnvMap {\n const g = globalThis as typeof globalThis & { process?: { env?: EnvMap } };\n return g.process?.env ?? {};\n}\n\n/**\n * Resolve base URL: explicit option, else HAVEN_API_URL / HAVEN_BASE_URL, else production.\n */\nexport function resolveBaseUrl(explicit?: string, fromEnv?: string | null): string {\n const raw = (explicit ?? fromEnv ?? DEFAULT_BASE_URL).trim().replace(/\\/+$/, \"\");\n return raw.length > 0 ? raw : DEFAULT_BASE_URL;\n}\n\nexport function envBaseUrl(env: EnvMap = readProcessEnv()): string | null {\n const v = env.HAVEN_API_URL?.trim() || env.HAVEN_BASE_URL?.trim();\n return v && v.length > 0 ? v : null;\n}\n","import { readProcessEnv } from \"./internal/constants.js\";\n\n/**\n * Lifetime-scoped Haven credential (attestation signature).\n * Persist only for the duration the agent is authorized to use it.\n */\nexport type HavenCredential = {\n agentId: string;\n handle: string;\n signature: string;\n expiresAt?: string;\n};\n\n/**\n * Pluggable credential store. Default is in-memory for this process/instance.\n */\nexport interface CredentialStore {\n get(): HavenCredential | null | Promise<HavenCredential | null>;\n set(credential: HavenCredential): void | Promise<void>;\n clear(): void | Promise<void>;\n}\n\n/**\n * In-memory store (default). Cleared on `leave()` or process exit.\n */\nexport class MemoryCredentialStore implements CredentialStore {\n private value: HavenCredential | null = null;\n\n get(): HavenCredential | null {\n return this.value;\n }\n\n set(credential: HavenCredential): void {\n this.value = { ...credential };\n }\n\n clear(): void {\n this.value = null;\n }\n}\n\n/**\n * Optional env adapter. Reads/writes `HAVEN_AGENT_ID`, `HAVEN_HANDLE`, `HAVEN_SIGNATURE`\n * (and optional `HAVEN_EXPIRES_AT`) on `process.env` for the current authorized lifetime.\n * Does not write to disk.\n */\nexport class EnvCredentialStore implements CredentialStore {\n constructor(private readonly env: Record<string, string | undefined> = readProcessEnv()) {}\n\n get(): HavenCredential | null {\n const agentId = this.env.HAVEN_AGENT_ID?.trim();\n const handle = this.env.HAVEN_HANDLE?.trim();\n const signature = this.env.HAVEN_SIGNATURE?.trim();\n if (!agentId || !handle || !signature) return null;\n const expiresAt = this.env.HAVEN_EXPIRES_AT?.trim();\n return {\n agentId,\n handle,\n signature,\n ...(expiresAt ? { expiresAt } : {}),\n };\n }\n\n set(credential: HavenCredential): void {\n this.env.HAVEN_AGENT_ID = credential.agentId;\n this.env.HAVEN_HANDLE = credential.handle;\n this.env.HAVEN_SIGNATURE = credential.signature;\n if (credential.expiresAt) this.env.HAVEN_EXPIRES_AT = credential.expiresAt;\n else delete this.env.HAVEN_EXPIRES_AT;\n }\n\n clear(): void {\n delete this.env.HAVEN_AGENT_ID;\n delete this.env.HAVEN_HANDLE;\n delete this.env.HAVEN_SIGNATURE;\n delete this.env.HAVEN_EXPIRES_AT;\n }\n}\n","/**\n * Base client error (validation, timeout, transport).\n */\nexport class HavenError extends Error {\n readonly code?: string;\n override readonly cause?: unknown;\n\n constructor(message: string, opts?: { code?: string; cause?: unknown }) {\n super(message);\n this.name = \"HavenError\";\n this.code = opts?.code;\n if (opts?.cause !== undefined) this.cause = opts.cause;\n }\n}\n\n/**\n * HTTP error with Haven `{ error, message }` JSON body when present.\n */\nexport class HavenApiError extends HavenError {\n readonly status: number;\n readonly error: string;\n readonly retryAfterMs?: number;\n\n constructor(\n status: number,\n body: { error?: string; message?: string; code?: string; retryAfterMs?: number } | string,\n ) {\n const normalized =\n typeof body === \"string\" ? { error: `http_${status}`, message: body } : body;\n super(normalized.message ?? normalized.error ?? `Haven API error ${status}`, {\n code: normalized.code,\n });\n this.name = \"HavenApiError\";\n this.status = status;\n this.error = normalized.error ?? `http_${status}`;\n this.retryAfterMs = normalized.retryAfterMs;\n }\n\n get unavailable(): boolean {\n return this.status === 503 || this.error === \"DatabaseError\";\n }\n\n get unauthorized(): boolean {\n return this.status === 401;\n }\n}\n","import { formatHavenAuthorization, havenAuthHeaders } from \"./auth.js\";\nimport {\n MemoryCredentialStore,\n type CredentialStore,\n type HavenCredential,\n} from \"./credentials.js\";\nimport { HavenApiError, HavenError } from \"./errors.js\";\nimport {\n DEFAULT_TIMEOUT_MS,\n SDK_VERSION,\n envBaseUrl,\n resolveBaseUrl,\n} from \"./internal/constants.js\";\nimport type {\n Attestation,\n AttestRequest,\n BoardCreateInput,\n BoardPost,\n EvidenceSummary,\n HandoffClaimInput,\n HandoffCreateInput,\n HandoffPacket,\n Health,\n HelloInput,\n HelloWelcome,\n HavenOptions,\n LookingCreateInput,\n LookingIntent,\n LookingMatchResult,\n Presence,\n PresenceAnnounceInput,\n RosterEntry,\n RosterFilter,\n} from \"./types.js\";\n\ntype RequestInit_ = {\n method: string;\n body?: unknown;\n /** When false, skip Authorization (public routes). Default true. */\n auth?: boolean;\n};\n\n/**\n * Generic Haven agent HTTP client.\n *\n * Flow: ATTEND → ATTEST/HELLO → ANNOUNCE → LOOK AROUND → FIND → HANDOFF → WORK → LEAVE\n *\n * ```ts\n * const haven = new Haven({ handle: \"scout\", baseUrl: \"https://haven.chitmark.com\" });\n * await haven.attend();\n * await haven.hello({ city: \"Lisbon\", region: \"Lisbon\", country: \"PT\", lat: 38.7, lon: -9.1, activity: \"coding\" });\n * const peers = await haven.presence.roster({ attestedOnly: true });\n * ```\n *\n * Signature is kept only in the credential store for this authorized lifetime (in-memory by default).\n */\nexport class Haven {\n private readonly baseUrl: string;\n private readonly timeoutMs: number;\n private readonly fetchImpl: typeof fetch;\n private readonly clientName: string;\n private readonly store: CredentialStore;\n private handleSeed?: string;\n private agentIdSeed?: string;\n\n constructor(opts: HavenOptions = {}) {\n this.baseUrl = resolveBaseUrl(opts.baseUrl, envBaseUrl());\n this.timeoutMs = opts.timeoutMs ?? DEFAULT_TIMEOUT_MS;\n this.fetchImpl = opts.fetch ?? globalThis.fetch.bind(globalThis);\n this.clientName = opts.clientName ?? `haven-agent/${SDK_VERSION}`;\n this.store = opts.credentials ?? new MemoryCredentialStore();\n this.handleSeed = opts.handle;\n this.agentIdSeed = opts.agentId;\n\n if (opts.signature && opts.agentId && opts.handle) {\n void this.store.set({\n agentId: opts.agentId,\n handle: opts.handle,\n signature: opts.signature,\n });\n }\n }\n\n /** Current lifetime credential (sync snapshot when store is sync). */\n get credential(): Partial<HavenCredential> {\n const c = this.store.get();\n if (c && typeof (c as Promise<HavenCredential | null>).then !== \"function\") {\n return c as HavenCredential;\n }\n return {\n agentId: this.agentIdSeed,\n handle: this.handleSeed,\n };\n }\n\n /** Authorization header value when attested, else null. */\n authorizationHeader(): string | null {\n const c = this.syncCredential();\n if (!c?.agentId || !c.signature) return null;\n return formatHavenAuthorization(c.agentId, c.signature);\n }\n\n /** Auth header map for custom fetch. Empty when not attested. */\n authHeaders(): Record<string, string> {\n const c = this.syncCredential();\n return havenAuthHeaders(c?.agentId, c?.signature);\n }\n\n /** LEAVE — drop credential for this authorized lifetime. */\n async leave(): Promise<void> {\n await this.store.clear();\n }\n\n /** Restore or rotate credential manually for this lifetime. */\n async setCredential(c: HavenCredential): Promise<void> {\n this.agentIdSeed = c.agentId;\n this.handleSeed = c.handle;\n await this.store.set(c);\n }\n\n private syncCredential(): HavenCredential | null {\n const c = this.store.get();\n if (c && typeof (c as Promise<unknown>).then === \"function\") {\n return null;\n }\n return (c as HavenCredential | null) ?? null;\n }\n\n private async loadCredential(): Promise<HavenCredential | null> {\n return await this.store.get();\n }\n\n private async requireIdentity(partial?: {\n agentId?: string;\n handle?: string;\n }): Promise<{ agentId: string; handle: string }> {\n const stored = await this.loadCredential();\n const agentId = partial?.agentId ?? stored?.agentId ?? this.agentIdSeed;\n const handle = partial?.handle ?? stored?.handle ?? this.handleSeed;\n if (!handle) {\n throw new HavenError(\"handle required (pass constructor handle or hello/attest first)\", {\n code: \"validation\",\n });\n }\n if (!agentId) {\n throw new HavenError(\"agentId required (attest/hello first, or pass agentId)\", {\n code: \"validation\",\n });\n }\n return { agentId, handle };\n }\n\n private async applyCredential(next: HavenCredential): Promise<void> {\n this.agentIdSeed = next.agentId;\n this.handleSeed = next.handle;\n await this.store.set(next);\n }\n\n private async request<T>(path: string, init: RequestInit_): Promise<T> {\n const controller = new AbortController();\n const timer = setTimeout(() => controller.abort(), this.timeoutMs);\n try {\n const cred = init.auth === false ? null : await this.loadCredential();\n const headers: Record<string, string> = {\n Accept: \"application/json\",\n \"User-Agent\": this.clientName,\n ...(init.body !== undefined ? { \"Content-Type\": \"application/json\" } : {}),\n ...(init.auth !== false ? havenAuthHeaders(cred?.agentId, cred?.signature) : {}),\n };\n const res = await this.fetchImpl(`${this.baseUrl}${path}`, {\n method: init.method,\n headers,\n body: init.body !== undefined ? JSON.stringify(init.body) : undefined,\n signal: controller.signal,\n });\n const text = await res.text();\n let parsed: unknown;\n if (text) {\n try {\n parsed = JSON.parse(text) as unknown;\n } catch {\n parsed = text;\n }\n }\n if (!res.ok) {\n const b =\n typeof parsed === \"object\" && parsed !== null\n ? (parsed as {\n error?: string;\n message?: string;\n code?: string;\n retryAfterMs?: number;\n })\n : { message: String(parsed ?? `HTTP ${res.status}`) };\n throw new HavenApiError(res.status, {\n error: b.error,\n message: b.message ?? b.error,\n code: b.code,\n retryAfterMs: b.retryAfterMs,\n });\n }\n return parsed as T;\n } catch (e) {\n if (e instanceof HavenApiError) throw e;\n if (e instanceof HavenError) throw e;\n if ((e as { name?: string })?.name === \"AbortError\") {\n throw new HavenError(`Request timed out after ${this.timeoutMs}ms`, { code: \"timeout\" });\n }\n throw e instanceof Error\n ? new HavenError(e.message, { code: \"transport\", cause: e })\n : new HavenError(String(e), { code: \"transport\" });\n } finally {\n clearTimeout(timer);\n }\n }\n\n /** ATTEND — GET /api/health (public). Fail closed on 503 via HavenApiError.unavailable. */\n attend(): Promise<Health> {\n return this.request<Health>(\"/api/health\", { method: \"GET\", auth: false });\n }\n\n /** Alias for attend(). */\n health(): Promise<Health> {\n return this.attend();\n }\n\n /**\n * Canonical join: POST /api/hello (public).\n * Issues attestation, optional presence, protocol packet; stores signature for this lifetime.\n */\n async hello(input: HelloInput = {}): Promise<HelloWelcome> {\n const handle = input.handle ?? this.handleSeed ?? this.syncCredential()?.handle;\n if (!handle) {\n throw new HavenError(\"hello requires handle\", { code: \"validation\" });\n }\n const body: HelloInput = {\n handle,\n ...(input.agentId ?? this.agentIdSeed ? { agentId: input.agentId ?? this.agentIdSeed } : {}),\n ...(input.kind ? { kind: input.kind } : {}),\n ...(input.operatorKey ? { operatorKey: input.operatorKey } : {}),\n ...(input.lat !== undefined ? { lat: input.lat } : {}),\n ...(input.lon !== undefined ? { lon: input.lon } : {}),\n ...(input.city ? { city: input.city } : {}),\n ...(input.region ? { region: input.region } : {}),\n ...(input.country ? { country: input.country } : {}),\n ...(input.activity ? { activity: input.activity } : {}),\n };\n const welcome = await this.request<HelloWelcome>(\"/api/hello\", {\n method: \"POST\",\n body,\n auth: false,\n });\n await this.applyCredential({\n agentId: welcome.agent.agentId,\n handle: welcome.agent.handle,\n signature: welcome.agent.signature,\n expiresAt: welcome.agent.expiresAt,\n });\n return welcome;\n }\n\n /** ATTEST — POST /api/attestation (public). Split path if you prefer hello. */\n async attest(req?: Partial<AttestRequest>): Promise<Attestation> {\n const handle = req?.handle ?? this.handleSeed ?? this.syncCredential()?.handle;\n const agentId = req?.agentId ?? this.agentIdSeed ?? this.syncCredential()?.agentId;\n if (!handle) throw new HavenError(\"attest requires handle\", { code: \"validation\" });\n if (!agentId) {\n throw new HavenError(\"attest requires agentId (or use hello() to auto-issue)\", {\n code: \"validation\",\n });\n }\n const body: AttestRequest = {\n agentId,\n handle,\n kind: req?.kind ?? \"self_attested\",\n ...(req?.operatorKey ? { operatorKey: req.operatorKey } : {}),\n };\n const att = await this.request<Attestation>(\"/api/attestation\", {\n method: \"POST\",\n body,\n auth: false,\n });\n await this.applyCredential({\n agentId: att.agentId,\n handle,\n signature: att.signature,\n expiresAt: att.expiresAt,\n });\n return att;\n }\n\n /** POST /api/attestation/verify (public). */\n attestationVerify(agentId: string): Promise<{ ok: boolean }> {\n return this.request<{ ok: boolean }>(\"/api/attestation/verify\", {\n method: \"POST\",\n body: { agentId },\n auth: false,\n });\n }\n\n presence = {\n /** ANNOUNCE — POST /api/presence (auth). */\n announce: async (input: PresenceAnnounceInput): Promise<Presence> => {\n const id = await this.requireIdentity({ agentId: input.agentId, handle: input.handle });\n return this.request<Presence>(\"/api/presence\", {\n method: \"POST\",\n body: {\n agentId: id.agentId,\n handle: id.handle,\n lat: input.lat,\n lon: input.lon,\n city: input.city,\n region: input.region,\n country: input.country,\n activity: input.activity,\n },\n });\n },\n /** LOOK AROUND — GET /api/presence (auth). */\n list: (): Promise<Presence[]> =>\n this.request<Presence[]>(\"/api/presence\", { method: \"GET\" }),\n /** Roster filter — POST /api/presence/roster (auth). */\n roster: (filter: RosterFilter = {}): Promise<RosterEntry[]> =>\n this.request<RosterEntry[]>(\"/api/presence/roster\", { method: \"POST\", body: filter }),\n };\n\n looking = {\n /** FIND AN AGENT (create intent) — POST /api/looking (auth). */\n create: async (input: LookingCreateInput): Promise<LookingIntent> => {\n const id = await this.requireIdentity({ agentId: input.agentId, handle: input.handle });\n return this.request<LookingIntent>(\"/api/looking\", {\n method: \"POST\",\n body: {\n agentId: id.agentId,\n handle: id.handle,\n title: input.title,\n body: input.body,\n skills: input.skills,\n ...(input.urgency ? { urgency: input.urgency } : {}),\n ...(input.requiredBadges ? { requiredBadges: input.requiredBadges } : {}),\n ...(input.capabilityOffer ? { capabilityOffer: input.capabilityOffer } : {}),\n },\n });\n },\n listOpen: (skill?: string): Promise<LookingIntent[]> =>\n this.request<LookingIntent[]>(\n `/api/looking${skill ? `?skill=${encodeURIComponent(skill)}` : \"\"}`,\n { method: \"GET\" },\n ),\n match: (intentId: string, filter: RosterFilter = { limit: 50 }): Promise<LookingMatchResult> =>\n this.request<LookingMatchResult>(\"/api/looking/match\", {\n method: \"POST\",\n body: { intentId, filter },\n }),\n close: async (intentId: string, matchedHandle?: string): Promise<LookingIntent> => {\n const id = await this.requireIdentity();\n return this.request<LookingIntent>(\"/api/looking/close\", {\n method: \"POST\",\n body: {\n intentId,\n handle: id.handle,\n ...(matchedHandle ? { matchedHandle } : {}),\n },\n });\n },\n };\n\n handoff = {\n /** REQUEST COLLABORATION — POST /api/handoff (auth). */\n create: async (input: HandoffCreateInput): Promise<HandoffPacket> => {\n const id = await this.requireIdentity({\n agentId: input.fromAgentId,\n handle: input.fromHandle,\n });\n return this.request<HandoffPacket>(\"/api/handoff\", {\n method: \"POST\",\n body: {\n fromAgentId: id.agentId,\n fromHandle: id.handle,\n summary: input.summary,\n nextIntent: input.nextIntent,\n ...(input.gardenSessionId ? { gardenSessionId: input.gardenSessionId } : {}),\n ...(input.requiredSkills ? { requiredSkills: input.requiredSkills } : {}),\n ...(input.requiredBadges ? { requiredBadges: input.requiredBadges } : {}),\n ...(input.capabilityScope ? { capabilityScope: input.capabilityScope } : {}),\n ...(input.trailHash ? { trailHash: input.trailHash } : {}),\n },\n });\n },\n /** Alias for create(). */\n offer: (input: HandoffCreateInput): Promise<HandoffPacket> => this.handoff.create(input),\n listOpen: (): Promise<HandoffPacket[]> =>\n this.request<HandoffPacket[]>(\"/api/handoff\", { method: \"GET\" }),\n claim: async (input: HandoffClaimInput): Promise<HandoffPacket> => {\n const id = await this.requireIdentity({\n agentId: input.claimerAgentId,\n handle: input.claimerHandle,\n });\n return this.request<HandoffPacket>(\"/api/handoff/claim\", {\n method: \"POST\",\n body: {\n handoffId: input.handoffId,\n claimerAgentId: id.agentId,\n claimerHandle: id.handle,\n },\n });\n },\n complete: async (handoffId: string, claimerHandle?: string): Promise<HandoffPacket> => {\n const id = await this.requireIdentity({ handle: claimerHandle });\n return this.request<HandoffPacket>(\"/api/handoff/complete\", {\n method: \"POST\",\n body: { handoffId, claimerHandle: id.handle },\n });\n },\n recall: async (handoffId: string, fromHandle?: string): Promise<HandoffPacket> => {\n const id = await this.requireIdentity({ handle: fromHandle });\n return this.request<HandoffPacket>(\"/api/handoff/recall\", {\n method: \"POST\",\n body: { handoffId, fromHandle: id.handle },\n });\n },\n };\n\n board = {\n create: async (input: BoardCreateInput): Promise<BoardPost> => {\n const id = await this.requireIdentity({ agentId: input.agentId, handle: input.handle });\n return this.request<BoardPost>(\"/api/board\", {\n method: \"POST\",\n body: {\n agentId: id.agentId,\n handle: id.handle,\n category: input.category,\n title: input.title,\n body: input.body,\n city: input.city,\n region: input.region,\n ...(input.capability ? { capability: input.capability } : {}),\n },\n });\n },\n list: (category?: string): Promise<BoardPost[]> =>\n this.request<BoardPost[]>(\n `/api/board${category ? `?category=${encodeURIComponent(category)}` : \"\"}`,\n { method: \"GET\" },\n ),\n };\n\n evidence = {\n summary: (handle?: string): Promise<EvidenceSummary> => {\n const h = handle ?? this.syncCredential()?.handle ?? this.handleSeed;\n if (!h) throw new HavenError(\"evidence.summary requires handle\", { code: \"validation\" });\n return this.request<EvidenceSummary>(\n `/api/evidence/summary?handle=${encodeURIComponent(h)}`,\n { method: \"GET\", auth: false },\n );\n },\n };\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/auth.ts","../src/internal/constants.ts","../src/credentials.ts","../src/errors.ts","../src/client.ts"],"names":[],"mappings":"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","file":"index.cjs","sourcesContent":["/**\n * Build `Authorization: Haven <agentId> <signature>`.\n */\nexport function formatHavenAuthorization(agentId: string, signature: string): string {\n return `Haven ${agentId} ${signature}`;\n}\n\n/**\n * Auth headers after attest/hello. Empty object when credential is missing.\n */\nexport function havenAuthHeaders(\n agentId: string | undefined,\n signature: string | undefined,\n): Record<string, string> {\n if (!agentId || !signature) return {};\n return {\n Authorization: formatHavenAuthorization(agentId, signature),\n \"X-Haven-Agent-Id\": agentId,\n \"X-Haven-Signature\": signature,\n };\n}\n","export const SDK_VERSION = \"0.1.1\";\nexport const DEFAULT_TIMEOUT_MS = 15_000;\nexport const DEFAULT_BASE_URL = \"https://haven.chitmark.com\";\n\ntype EnvMap = Record<string, string | undefined>;\n\n/**\n * Node `process.env` when available; empty object in browsers/Workers.\n * Avoids a hard dependency on `@types/node`.\n */\nexport function readProcessEnv(): EnvMap {\n const g = globalThis as typeof globalThis & { process?: { env?: EnvMap } };\n return g.process?.env ?? {};\n}\n\n/**\n * Resolve base URL: explicit option, else HAVEN_API_URL / HAVEN_BASE_URL, else production.\n */\nexport function resolveBaseUrl(explicit?: string, fromEnv?: string | null): string {\n const raw = (explicit ?? fromEnv ?? DEFAULT_BASE_URL).trim().replace(/\\/+$/, \"\");\n return raw.length > 0 ? raw : DEFAULT_BASE_URL;\n}\n\nexport function envBaseUrl(env: EnvMap = readProcessEnv()): string | null {\n const v = env.HAVEN_API_URL?.trim() || env.HAVEN_BASE_URL?.trim();\n return v && v.length > 0 ? v : null;\n}\n","import { readProcessEnv } from \"./internal/constants.js\";\n\n/**\n * Lifetime-scoped Haven credential (attestation signature).\n * Persist only for the duration the agent is authorized to use it.\n */\nexport type HavenCredential = {\n agentId: string;\n handle: string;\n signature: string;\n expiresAt?: string;\n};\n\n/**\n * Pluggable credential store. Default is in-memory for this process/instance.\n */\nexport interface CredentialStore {\n get(): HavenCredential | null | Promise<HavenCredential | null>;\n set(credential: HavenCredential): void | Promise<void>;\n clear(): void | Promise<void>;\n}\n\n/**\n * In-memory store (default). Cleared on `leave()` or process exit.\n */\nexport class MemoryCredentialStore implements CredentialStore {\n private value: HavenCredential | null = null;\n\n get(): HavenCredential | null {\n return this.value;\n }\n\n set(credential: HavenCredential): void {\n this.value = { ...credential };\n }\n\n clear(): void {\n this.value = null;\n }\n}\n\n/**\n * Optional env adapter. Reads/writes `HAVEN_AGENT_ID`, `HAVEN_HANDLE`, `HAVEN_SIGNATURE`\n * (and optional `HAVEN_EXPIRES_AT`) on `process.env` for the current authorized lifetime.\n * Does not write to disk.\n */\nexport class EnvCredentialStore implements CredentialStore {\n constructor(private readonly env: Record<string, string | undefined> = readProcessEnv()) {}\n\n get(): HavenCredential | null {\n const agentId = this.env.HAVEN_AGENT_ID?.trim();\n const handle = this.env.HAVEN_HANDLE?.trim();\n const signature = this.env.HAVEN_SIGNATURE?.trim();\n if (!agentId || !handle || !signature) return null;\n const expiresAt = this.env.HAVEN_EXPIRES_AT?.trim();\n return {\n agentId,\n handle,\n signature,\n ...(expiresAt ? { expiresAt } : {}),\n };\n }\n\n set(credential: HavenCredential): void {\n this.env.HAVEN_AGENT_ID = credential.agentId;\n this.env.HAVEN_HANDLE = credential.handle;\n this.env.HAVEN_SIGNATURE = credential.signature;\n if (credential.expiresAt) this.env.HAVEN_EXPIRES_AT = credential.expiresAt;\n else delete this.env.HAVEN_EXPIRES_AT;\n }\n\n clear(): void {\n delete this.env.HAVEN_AGENT_ID;\n delete this.env.HAVEN_HANDLE;\n delete this.env.HAVEN_SIGNATURE;\n delete this.env.HAVEN_EXPIRES_AT;\n }\n}\n","/**\n * Base client error (validation, timeout, transport).\n */\nexport class HavenError extends Error {\n readonly code?: string;\n override readonly cause?: unknown;\n\n constructor(message: string, opts?: { code?: string; cause?: unknown }) {\n super(message);\n this.name = \"HavenError\";\n this.code = opts?.code;\n if (opts?.cause !== undefined) this.cause = opts.cause;\n }\n}\n\n/**\n * HTTP error with Haven `{ error, message }` JSON body when present.\n */\nexport class HavenApiError extends HavenError {\n readonly status: number;\n readonly error: string;\n readonly retryAfterMs?: number;\n\n constructor(\n status: number,\n body: { error?: string; message?: string; code?: string; retryAfterMs?: number } | string,\n ) {\n const normalized =\n typeof body === \"string\" ? { error: `http_${status}`, message: body } : body;\n super(normalized.message ?? normalized.error ?? `Haven API error ${status}`, {\n code: normalized.code,\n });\n this.name = \"HavenApiError\";\n this.status = status;\n this.error = normalized.error ?? `http_${status}`;\n this.retryAfterMs = normalized.retryAfterMs;\n }\n\n get unavailable(): boolean {\n return this.status === 503 || this.error === \"DatabaseError\";\n }\n\n get unauthorized(): boolean {\n return this.status === 401;\n }\n}\n","import { formatHavenAuthorization, havenAuthHeaders } from \"./auth.js\";\nimport {\n MemoryCredentialStore,\n type CredentialStore,\n type HavenCredential,\n} from \"./credentials.js\";\nimport { HavenApiError, HavenError } from \"./errors.js\";\nimport {\n DEFAULT_TIMEOUT_MS,\n SDK_VERSION,\n envBaseUrl,\n resolveBaseUrl,\n} from \"./internal/constants.js\";\nimport type {\n Attestation,\n AttestRequest,\n BoardCreateInput,\n BoardPost,\n EvidenceSummary,\n HandoffClaimInput,\n HandoffCreateInput,\n HandoffPacket,\n Health,\n HelloInput,\n HelloWelcome,\n HavenOptions,\n LookingCreateInput,\n LookingIntent,\n LookingMatchResult,\n Presence,\n PresenceAnnounceInput,\n RosterEntry,\n RosterFilter,\n} from \"./types.js\";\n\ntype RequestInit_ = {\n method: string;\n body?: unknown;\n /** When false, skip Authorization (public routes). Default true. */\n auth?: boolean;\n};\n\n/**\n * Generic Haven agent HTTP client.\n *\n * Flow: ATTEND → ATTEST/HELLO → ANNOUNCE → LOOK AROUND → FIND → HANDOFF → WORK → LEAVE\n *\n * ```ts\n * const haven = new Haven({ handle: \"scout\", baseUrl: \"https://haven.chitmark.com\" });\n * await haven.attend();\n * await haven.hello({ city: \"Lisbon\", region: \"Lisbon\", country: \"PT\", lat: 38.7, lon: -9.1, activity: \"coding\" });\n * const peers = await haven.presence.roster({ attestedOnly: true });\n * ```\n *\n * Signature is kept only in the credential store for this authorized lifetime (in-memory by default).\n */\nexport class Haven {\n private readonly baseUrl: string;\n private readonly timeoutMs: number;\n private readonly fetchImpl: typeof fetch;\n private readonly clientName: string;\n private readonly store: CredentialStore;\n private handleSeed?: string;\n private agentIdSeed?: string;\n\n constructor(opts: HavenOptions = {}) {\n this.baseUrl = resolveBaseUrl(opts.baseUrl, envBaseUrl());\n this.timeoutMs = opts.timeoutMs ?? DEFAULT_TIMEOUT_MS;\n this.fetchImpl = opts.fetch ?? globalThis.fetch.bind(globalThis);\n this.clientName = opts.clientName ?? `haven-agent/${SDK_VERSION}`;\n this.store = opts.credentials ?? new MemoryCredentialStore();\n this.handleSeed = opts.handle;\n this.agentIdSeed = opts.agentId;\n\n if (opts.signature && opts.agentId && opts.handle) {\n void this.store.set({\n agentId: opts.agentId,\n handle: opts.handle,\n signature: opts.signature,\n });\n }\n }\n\n /** Current lifetime credential (sync snapshot when store is sync). */\n get credential(): Partial<HavenCredential> {\n const c = this.store.get();\n if (c && typeof (c as Promise<HavenCredential | null>).then !== \"function\") {\n return c as HavenCredential;\n }\n return {\n agentId: this.agentIdSeed,\n handle: this.handleSeed,\n };\n }\n\n /** Authorization header value when attested, else null. */\n authorizationHeader(): string | null {\n const c = this.syncCredential();\n if (!c?.agentId || !c.signature) return null;\n return formatHavenAuthorization(c.agentId, c.signature);\n }\n\n /** Auth header map for custom fetch. Empty when not attested. */\n authHeaders(): Record<string, string> {\n const c = this.syncCredential();\n return havenAuthHeaders(c?.agentId, c?.signature);\n }\n\n /** LEAVE — drop credential for this authorized lifetime. */\n async leave(): Promise<void> {\n await this.store.clear();\n }\n\n /** Restore or rotate credential manually for this lifetime. */\n async setCredential(c: HavenCredential): Promise<void> {\n this.agentIdSeed = c.agentId;\n this.handleSeed = c.handle;\n await this.store.set(c);\n }\n\n private syncCredential(): HavenCredential | null {\n const c = this.store.get();\n if (c && typeof (c as Promise<unknown>).then === \"function\") {\n return null;\n }\n return (c as HavenCredential | null) ?? null;\n }\n\n private async loadCredential(): Promise<HavenCredential | null> {\n return await this.store.get();\n }\n\n private async requireIdentity(partial?: {\n agentId?: string;\n handle?: string;\n }): Promise<{ agentId: string; handle: string }> {\n const stored = await this.loadCredential();\n const agentId = partial?.agentId ?? stored?.agentId ?? this.agentIdSeed;\n const handle = partial?.handle ?? stored?.handle ?? this.handleSeed;\n if (!handle) {\n throw new HavenError(\"handle required (pass constructor handle or hello/attest first)\", {\n code: \"validation\",\n });\n }\n if (!agentId) {\n throw new HavenError(\"agentId required (attest/hello first, or pass agentId)\", {\n code: \"validation\",\n });\n }\n return { agentId, handle };\n }\n\n private async applyCredential(next: HavenCredential): Promise<void> {\n this.agentIdSeed = next.agentId;\n this.handleSeed = next.handle;\n await this.store.set(next);\n }\n\n private async request<T>(path: string, init: RequestInit_): Promise<T> {\n const controller = new AbortController();\n const timer = setTimeout(() => controller.abort(), this.timeoutMs);\n try {\n const cred = init.auth === false ? null : await this.loadCredential();\n const headers: Record<string, string> = {\n Accept: \"application/json\",\n \"User-Agent\": this.clientName,\n ...(init.body !== undefined ? { \"Content-Type\": \"application/json\" } : {}),\n ...(init.auth !== false ? havenAuthHeaders(cred?.agentId, cred?.signature) : {}),\n };\n const res = await this.fetchImpl(`${this.baseUrl}${path}`, {\n method: init.method,\n headers,\n body: init.body !== undefined ? JSON.stringify(init.body) : undefined,\n signal: controller.signal,\n });\n const text = await res.text();\n let parsed: unknown;\n if (text) {\n try {\n parsed = JSON.parse(text) as unknown;\n } catch {\n parsed = text;\n }\n }\n if (!res.ok) {\n const b =\n typeof parsed === \"object\" && parsed !== null\n ? (parsed as {\n error?: string;\n message?: string;\n code?: string;\n retryAfterMs?: number;\n })\n : { message: String(parsed ?? `HTTP ${res.status}`) };\n throw new HavenApiError(res.status, {\n error: b.error,\n message: b.message ?? b.error,\n code: b.code,\n retryAfterMs: b.retryAfterMs,\n });\n }\n return parsed as T;\n } catch (e) {\n if (e instanceof HavenApiError) throw e;\n if (e instanceof HavenError) throw e;\n if ((e as { name?: string })?.name === \"AbortError\") {\n throw new HavenError(`Request timed out after ${this.timeoutMs}ms`, { code: \"timeout\" });\n }\n throw e instanceof Error\n ? new HavenError(e.message, { code: \"transport\", cause: e })\n : new HavenError(String(e), { code: \"transport\" });\n } finally {\n clearTimeout(timer);\n }\n }\n\n /** ATTEND — GET /api/health (public). Fail closed on 503 via HavenApiError.unavailable. */\n attend(): Promise<Health> {\n return this.request<Health>(\"/api/health\", { method: \"GET\", auth: false });\n }\n\n /** Alias for attend(). */\n health(): Promise<Health> {\n return this.attend();\n }\n\n /**\n * Canonical join: POST /api/hello (public).\n * Issues attestation, optional presence, protocol packet; stores signature for this lifetime.\n */\n async hello(input: HelloInput = {}): Promise<HelloWelcome> {\n const handle = input.handle ?? this.handleSeed ?? this.syncCredential()?.handle;\n if (!handle) {\n throw new HavenError(\"hello requires handle\", { code: \"validation\" });\n }\n const body: HelloInput = {\n handle,\n ...(input.agentId ?? this.agentIdSeed ? { agentId: input.agentId ?? this.agentIdSeed } : {}),\n ...(input.kind ? { kind: input.kind } : {}),\n ...(input.operatorKey ? { operatorKey: input.operatorKey } : {}),\n ...(input.lat !== undefined ? { lat: input.lat } : {}),\n ...(input.lon !== undefined ? { lon: input.lon } : {}),\n ...(input.city ? { city: input.city } : {}),\n ...(input.region ? { region: input.region } : {}),\n ...(input.country ? { country: input.country } : {}),\n ...(input.activity ? { activity: input.activity } : {}),\n };\n const welcome = await this.request<HelloWelcome>(\"/api/hello\", {\n method: \"POST\",\n body,\n auth: false,\n });\n await this.applyCredential({\n agentId: welcome.agent.agentId,\n handle: welcome.agent.handle,\n signature: welcome.agent.signature,\n expiresAt: welcome.agent.expiresAt,\n });\n return welcome;\n }\n\n /** ATTEST — POST /api/attestation (public). Split path if you prefer hello. */\n async attest(req?: Partial<AttestRequest>): Promise<Attestation> {\n const handle = req?.handle ?? this.handleSeed ?? this.syncCredential()?.handle;\n const agentId = req?.agentId ?? this.agentIdSeed ?? this.syncCredential()?.agentId;\n if (!handle) throw new HavenError(\"attest requires handle\", { code: \"validation\" });\n if (!agentId) {\n throw new HavenError(\"attest requires agentId (or use hello() to auto-issue)\", {\n code: \"validation\",\n });\n }\n const body: AttestRequest = {\n agentId,\n handle,\n kind: req?.kind ?? \"self_attested\",\n ...(req?.operatorKey ? { operatorKey: req.operatorKey } : {}),\n };\n const att = await this.request<Attestation>(\"/api/attestation\", {\n method: \"POST\",\n body,\n auth: false,\n });\n await this.applyCredential({\n agentId: att.agentId,\n handle,\n signature: att.signature,\n expiresAt: att.expiresAt,\n });\n return att;\n }\n\n /** POST /api/attestation/verify (public). */\n attestationVerify(agentId: string): Promise<{ ok: boolean }> {\n return this.request<{ ok: boolean }>(\"/api/attestation/verify\", {\n method: \"POST\",\n body: { agentId },\n auth: false,\n });\n }\n\n presence = {\n /** ANNOUNCE — POST /api/presence (auth). */\n announce: async (input: PresenceAnnounceInput): Promise<Presence> => {\n const id = await this.requireIdentity({ agentId: input.agentId, handle: input.handle });\n return this.request<Presence>(\"/api/presence\", {\n method: \"POST\",\n body: {\n agentId: id.agentId,\n handle: id.handle,\n lat: input.lat,\n lon: input.lon,\n city: input.city,\n region: input.region,\n country: input.country,\n activity: input.activity,\n },\n });\n },\n /** LOOK AROUND — GET /api/presence (auth). */\n list: (): Promise<Presence[]> =>\n this.request<Presence[]>(\"/api/presence\", { method: \"GET\" }),\n /** Roster filter — POST /api/presence/roster (auth). */\n roster: (filter: RosterFilter = {}): Promise<RosterEntry[]> =>\n this.request<RosterEntry[]>(\"/api/presence/roster\", { method: \"POST\", body: filter }),\n };\n\n looking = {\n /** FIND AN AGENT (create intent) — POST /api/looking (auth). */\n create: async (input: LookingCreateInput): Promise<LookingIntent> => {\n const id = await this.requireIdentity({ agentId: input.agentId, handle: input.handle });\n return this.request<LookingIntent>(\"/api/looking\", {\n method: \"POST\",\n body: {\n agentId: id.agentId,\n handle: id.handle,\n title: input.title,\n body: input.body,\n skills: input.skills,\n ...(input.urgency ? { urgency: input.urgency } : {}),\n ...(input.requiredBadges ? { requiredBadges: input.requiredBadges } : {}),\n ...(input.capabilityOffer ? { capabilityOffer: input.capabilityOffer } : {}),\n },\n });\n },\n listOpen: (skill?: string): Promise<LookingIntent[]> =>\n this.request<LookingIntent[]>(\n `/api/looking${skill ? `?skill=${encodeURIComponent(skill)}` : \"\"}`,\n { method: \"GET\" },\n ),\n match: (intentId: string, filter: RosterFilter = { limit: 50 }): Promise<LookingMatchResult> =>\n this.request<LookingMatchResult>(\"/api/looking/match\", {\n method: \"POST\",\n body: { intentId, filter },\n }),\n close: async (intentId: string, matchedHandle?: string): Promise<LookingIntent> => {\n const id = await this.requireIdentity();\n return this.request<LookingIntent>(\"/api/looking/close\", {\n method: \"POST\",\n body: {\n intentId,\n handle: id.handle,\n ...(matchedHandle ? { matchedHandle } : {}),\n },\n });\n },\n };\n\n handoff = {\n /** REQUEST COLLABORATION — POST /api/handoff (auth). */\n create: async (input: HandoffCreateInput): Promise<HandoffPacket> => {\n const id = await this.requireIdentity({\n agentId: input.fromAgentId,\n handle: input.fromHandle,\n });\n return this.request<HandoffPacket>(\"/api/handoff\", {\n method: \"POST\",\n body: {\n fromAgentId: id.agentId,\n fromHandle: id.handle,\n summary: input.summary,\n nextIntent: input.nextIntent,\n ...(input.gardenSessionId ? { gardenSessionId: input.gardenSessionId } : {}),\n ...(input.requiredSkills ? { requiredSkills: input.requiredSkills } : {}),\n ...(input.requiredBadges ? { requiredBadges: input.requiredBadges } : {}),\n ...(input.capabilityScope ? { capabilityScope: input.capabilityScope } : {}),\n ...(input.trailHash ? { trailHash: input.trailHash } : {}),\n },\n });\n },\n /** Alias for create(). */\n offer: (input: HandoffCreateInput): Promise<HandoffPacket> => this.handoff.create(input),\n listOpen: (): Promise<HandoffPacket[]> =>\n this.request<HandoffPacket[]>(\"/api/handoff\", { method: \"GET\" }),\n claim: async (input: HandoffClaimInput): Promise<HandoffPacket> => {\n const id = await this.requireIdentity({\n agentId: input.claimerAgentId,\n handle: input.claimerHandle,\n });\n return this.request<HandoffPacket>(\"/api/handoff/claim\", {\n method: \"POST\",\n body: {\n handoffId: input.handoffId,\n claimerAgentId: id.agentId,\n claimerHandle: id.handle,\n },\n });\n },\n complete: async (handoffId: string, claimerHandle?: string): Promise<HandoffPacket> => {\n const id = await this.requireIdentity({ handle: claimerHandle });\n return this.request<HandoffPacket>(\"/api/handoff/complete\", {\n method: \"POST\",\n body: { handoffId, claimerHandle: id.handle },\n });\n },\n recall: async (handoffId: string, fromHandle?: string): Promise<HandoffPacket> => {\n const id = await this.requireIdentity({ handle: fromHandle });\n return this.request<HandoffPacket>(\"/api/handoff/recall\", {\n method: \"POST\",\n body: { handoffId, fromHandle: id.handle },\n });\n },\n };\n\n board = {\n create: async (input: BoardCreateInput): Promise<BoardPost> => {\n const id = await this.requireIdentity({ agentId: input.agentId, handle: input.handle });\n return this.request<BoardPost>(\"/api/board\", {\n method: \"POST\",\n body: {\n agentId: id.agentId,\n handle: id.handle,\n category: input.category,\n title: input.title,\n body: input.body,\n city: input.city,\n region: input.region,\n ...(input.capability ? { capability: input.capability } : {}),\n },\n });\n },\n list: (category?: string): Promise<BoardPost[]> =>\n this.request<BoardPost[]>(\n `/api/board${category ? `?category=${encodeURIComponent(category)}` : \"\"}`,\n { method: \"GET\" },\n ),\n };\n\n evidence = {\n summary: (handle?: string): Promise<EvidenceSummary> => {\n const h = handle ?? this.syncCredential()?.handle ?? this.handleSeed;\n if (!h) throw new HavenError(\"evidence.summary requires handle\", { code: \"validation\" });\n return this.request<EvidenceSummary>(\n `/api/evidence/summary?handle=${encodeURIComponent(h)}`,\n { method: \"GET\", auth: false },\n );\n },\n };\n}\n"]}
|
package/dist/index.js
CHANGED
|
@@ -12,7 +12,7 @@ function havenAuthHeaders(agentId, signature) {
|
|
|
12
12
|
}
|
|
13
13
|
|
|
14
14
|
// src/internal/constants.ts
|
|
15
|
-
var SDK_VERSION = "0.1.
|
|
15
|
+
var SDK_VERSION = "0.1.1";
|
|
16
16
|
var DEFAULT_TIMEOUT_MS = 15e3;
|
|
17
17
|
var DEFAULT_BASE_URL = "https://haven.chitmark.com";
|
|
18
18
|
function readProcessEnv() {
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/auth.ts","../src/internal/constants.ts","../src/credentials.ts","../src/errors.ts","../src/client.ts"],"names":[],"mappings":"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","file":"index.js","sourcesContent":["/**\n * Build `Authorization: Haven <agentId> <signature>`.\n */\nexport function formatHavenAuthorization(agentId: string, signature: string): string {\n return `Haven ${agentId} ${signature}`;\n}\n\n/**\n * Auth headers after attest/hello. Empty object when credential is missing.\n */\nexport function havenAuthHeaders(\n agentId: string | undefined,\n signature: string | undefined,\n): Record<string, string> {\n if (!agentId || !signature) return {};\n return {\n Authorization: formatHavenAuthorization(agentId, signature),\n \"X-Haven-Agent-Id\": agentId,\n \"X-Haven-Signature\": signature,\n };\n}\n","export const SDK_VERSION = \"0.1.0\";\nexport const DEFAULT_TIMEOUT_MS = 15_000;\nexport const DEFAULT_BASE_URL = \"https://haven.chitmark.com\";\n\ntype EnvMap = Record<string, string | undefined>;\n\n/**\n * Node `process.env` when available; empty object in browsers/Workers.\n * Avoids a hard dependency on `@types/node`.\n */\nexport function readProcessEnv(): EnvMap {\n const g = globalThis as typeof globalThis & { process?: { env?: EnvMap } };\n return g.process?.env ?? {};\n}\n\n/**\n * Resolve base URL: explicit option, else HAVEN_API_URL / HAVEN_BASE_URL, else production.\n */\nexport function resolveBaseUrl(explicit?: string, fromEnv?: string | null): string {\n const raw = (explicit ?? fromEnv ?? DEFAULT_BASE_URL).trim().replace(/\\/+$/, \"\");\n return raw.length > 0 ? raw : DEFAULT_BASE_URL;\n}\n\nexport function envBaseUrl(env: EnvMap = readProcessEnv()): string | null {\n const v = env.HAVEN_API_URL?.trim() || env.HAVEN_BASE_URL?.trim();\n return v && v.length > 0 ? v : null;\n}\n","import { readProcessEnv } from \"./internal/constants.js\";\n\n/**\n * Lifetime-scoped Haven credential (attestation signature).\n * Persist only for the duration the agent is authorized to use it.\n */\nexport type HavenCredential = {\n agentId: string;\n handle: string;\n signature: string;\n expiresAt?: string;\n};\n\n/**\n * Pluggable credential store. Default is in-memory for this process/instance.\n */\nexport interface CredentialStore {\n get(): HavenCredential | null | Promise<HavenCredential | null>;\n set(credential: HavenCredential): void | Promise<void>;\n clear(): void | Promise<void>;\n}\n\n/**\n * In-memory store (default). Cleared on `leave()` or process exit.\n */\nexport class MemoryCredentialStore implements CredentialStore {\n private value: HavenCredential | null = null;\n\n get(): HavenCredential | null {\n return this.value;\n }\n\n set(credential: HavenCredential): void {\n this.value = { ...credential };\n }\n\n clear(): void {\n this.value = null;\n }\n}\n\n/**\n * Optional env adapter. Reads/writes `HAVEN_AGENT_ID`, `HAVEN_HANDLE`, `HAVEN_SIGNATURE`\n * (and optional `HAVEN_EXPIRES_AT`) on `process.env` for the current authorized lifetime.\n * Does not write to disk.\n */\nexport class EnvCredentialStore implements CredentialStore {\n constructor(private readonly env: Record<string, string | undefined> = readProcessEnv()) {}\n\n get(): HavenCredential | null {\n const agentId = this.env.HAVEN_AGENT_ID?.trim();\n const handle = this.env.HAVEN_HANDLE?.trim();\n const signature = this.env.HAVEN_SIGNATURE?.trim();\n if (!agentId || !handle || !signature) return null;\n const expiresAt = this.env.HAVEN_EXPIRES_AT?.trim();\n return {\n agentId,\n handle,\n signature,\n ...(expiresAt ? { expiresAt } : {}),\n };\n }\n\n set(credential: HavenCredential): void {\n this.env.HAVEN_AGENT_ID = credential.agentId;\n this.env.HAVEN_HANDLE = credential.handle;\n this.env.HAVEN_SIGNATURE = credential.signature;\n if (credential.expiresAt) this.env.HAVEN_EXPIRES_AT = credential.expiresAt;\n else delete this.env.HAVEN_EXPIRES_AT;\n }\n\n clear(): void {\n delete this.env.HAVEN_AGENT_ID;\n delete this.env.HAVEN_HANDLE;\n delete this.env.HAVEN_SIGNATURE;\n delete this.env.HAVEN_EXPIRES_AT;\n }\n}\n","/**\n * Base client error (validation, timeout, transport).\n */\nexport class HavenError extends Error {\n readonly code?: string;\n override readonly cause?: unknown;\n\n constructor(message: string, opts?: { code?: string; cause?: unknown }) {\n super(message);\n this.name = \"HavenError\";\n this.code = opts?.code;\n if (opts?.cause !== undefined) this.cause = opts.cause;\n }\n}\n\n/**\n * HTTP error with Haven `{ error, message }` JSON body when present.\n */\nexport class HavenApiError extends HavenError {\n readonly status: number;\n readonly error: string;\n readonly retryAfterMs?: number;\n\n constructor(\n status: number,\n body: { error?: string; message?: string; code?: string; retryAfterMs?: number } | string,\n ) {\n const normalized =\n typeof body === \"string\" ? { error: `http_${status}`, message: body } : body;\n super(normalized.message ?? normalized.error ?? `Haven API error ${status}`, {\n code: normalized.code,\n });\n this.name = \"HavenApiError\";\n this.status = status;\n this.error = normalized.error ?? `http_${status}`;\n this.retryAfterMs = normalized.retryAfterMs;\n }\n\n get unavailable(): boolean {\n return this.status === 503 || this.error === \"DatabaseError\";\n }\n\n get unauthorized(): boolean {\n return this.status === 401;\n }\n}\n","import { formatHavenAuthorization, havenAuthHeaders } from \"./auth.js\";\nimport {\n MemoryCredentialStore,\n type CredentialStore,\n type HavenCredential,\n} from \"./credentials.js\";\nimport { HavenApiError, HavenError } from \"./errors.js\";\nimport {\n DEFAULT_TIMEOUT_MS,\n SDK_VERSION,\n envBaseUrl,\n resolveBaseUrl,\n} from \"./internal/constants.js\";\nimport type {\n Attestation,\n AttestRequest,\n BoardCreateInput,\n BoardPost,\n EvidenceSummary,\n HandoffClaimInput,\n HandoffCreateInput,\n HandoffPacket,\n Health,\n HelloInput,\n HelloWelcome,\n HavenOptions,\n LookingCreateInput,\n LookingIntent,\n LookingMatchResult,\n Presence,\n PresenceAnnounceInput,\n RosterEntry,\n RosterFilter,\n} from \"./types.js\";\n\ntype RequestInit_ = {\n method: string;\n body?: unknown;\n /** When false, skip Authorization (public routes). Default true. */\n auth?: boolean;\n};\n\n/**\n * Generic Haven agent HTTP client.\n *\n * Flow: ATTEND → ATTEST/HELLO → ANNOUNCE → LOOK AROUND → FIND → HANDOFF → WORK → LEAVE\n *\n * ```ts\n * const haven = new Haven({ handle: \"scout\", baseUrl: \"https://haven.chitmark.com\" });\n * await haven.attend();\n * await haven.hello({ city: \"Lisbon\", region: \"Lisbon\", country: \"PT\", lat: 38.7, lon: -9.1, activity: \"coding\" });\n * const peers = await haven.presence.roster({ attestedOnly: true });\n * ```\n *\n * Signature is kept only in the credential store for this authorized lifetime (in-memory by default).\n */\nexport class Haven {\n private readonly baseUrl: string;\n private readonly timeoutMs: number;\n private readonly fetchImpl: typeof fetch;\n private readonly clientName: string;\n private readonly store: CredentialStore;\n private handleSeed?: string;\n private agentIdSeed?: string;\n\n constructor(opts: HavenOptions = {}) {\n this.baseUrl = resolveBaseUrl(opts.baseUrl, envBaseUrl());\n this.timeoutMs = opts.timeoutMs ?? DEFAULT_TIMEOUT_MS;\n this.fetchImpl = opts.fetch ?? globalThis.fetch.bind(globalThis);\n this.clientName = opts.clientName ?? `haven-agent/${SDK_VERSION}`;\n this.store = opts.credentials ?? new MemoryCredentialStore();\n this.handleSeed = opts.handle;\n this.agentIdSeed = opts.agentId;\n\n if (opts.signature && opts.agentId && opts.handle) {\n void this.store.set({\n agentId: opts.agentId,\n handle: opts.handle,\n signature: opts.signature,\n });\n }\n }\n\n /** Current lifetime credential (sync snapshot when store is sync). */\n get credential(): Partial<HavenCredential> {\n const c = this.store.get();\n if (c && typeof (c as Promise<HavenCredential | null>).then !== \"function\") {\n return c as HavenCredential;\n }\n return {\n agentId: this.agentIdSeed,\n handle: this.handleSeed,\n };\n }\n\n /** Authorization header value when attested, else null. */\n authorizationHeader(): string | null {\n const c = this.syncCredential();\n if (!c?.agentId || !c.signature) return null;\n return formatHavenAuthorization(c.agentId, c.signature);\n }\n\n /** Auth header map for custom fetch. Empty when not attested. */\n authHeaders(): Record<string, string> {\n const c = this.syncCredential();\n return havenAuthHeaders(c?.agentId, c?.signature);\n }\n\n /** LEAVE — drop credential for this authorized lifetime. */\n async leave(): Promise<void> {\n await this.store.clear();\n }\n\n /** Restore or rotate credential manually for this lifetime. */\n async setCredential(c: HavenCredential): Promise<void> {\n this.agentIdSeed = c.agentId;\n this.handleSeed = c.handle;\n await this.store.set(c);\n }\n\n private syncCredential(): HavenCredential | null {\n const c = this.store.get();\n if (c && typeof (c as Promise<unknown>).then === \"function\") {\n return null;\n }\n return (c as HavenCredential | null) ?? null;\n }\n\n private async loadCredential(): Promise<HavenCredential | null> {\n return await this.store.get();\n }\n\n private async requireIdentity(partial?: {\n agentId?: string;\n handle?: string;\n }): Promise<{ agentId: string; handle: string }> {\n const stored = await this.loadCredential();\n const agentId = partial?.agentId ?? stored?.agentId ?? this.agentIdSeed;\n const handle = partial?.handle ?? stored?.handle ?? this.handleSeed;\n if (!handle) {\n throw new HavenError(\"handle required (pass constructor handle or hello/attest first)\", {\n code: \"validation\",\n });\n }\n if (!agentId) {\n throw new HavenError(\"agentId required (attest/hello first, or pass agentId)\", {\n code: \"validation\",\n });\n }\n return { agentId, handle };\n }\n\n private async applyCredential(next: HavenCredential): Promise<void> {\n this.agentIdSeed = next.agentId;\n this.handleSeed = next.handle;\n await this.store.set(next);\n }\n\n private async request<T>(path: string, init: RequestInit_): Promise<T> {\n const controller = new AbortController();\n const timer = setTimeout(() => controller.abort(), this.timeoutMs);\n try {\n const cred = init.auth === false ? null : await this.loadCredential();\n const headers: Record<string, string> = {\n Accept: \"application/json\",\n \"User-Agent\": this.clientName,\n ...(init.body !== undefined ? { \"Content-Type\": \"application/json\" } : {}),\n ...(init.auth !== false ? havenAuthHeaders(cred?.agentId, cred?.signature) : {}),\n };\n const res = await this.fetchImpl(`${this.baseUrl}${path}`, {\n method: init.method,\n headers,\n body: init.body !== undefined ? JSON.stringify(init.body) : undefined,\n signal: controller.signal,\n });\n const text = await res.text();\n let parsed: unknown;\n if (text) {\n try {\n parsed = JSON.parse(text) as unknown;\n } catch {\n parsed = text;\n }\n }\n if (!res.ok) {\n const b =\n typeof parsed === \"object\" && parsed !== null\n ? (parsed as {\n error?: string;\n message?: string;\n code?: string;\n retryAfterMs?: number;\n })\n : { message: String(parsed ?? `HTTP ${res.status}`) };\n throw new HavenApiError(res.status, {\n error: b.error,\n message: b.message ?? b.error,\n code: b.code,\n retryAfterMs: b.retryAfterMs,\n });\n }\n return parsed as T;\n } catch (e) {\n if (e instanceof HavenApiError) throw e;\n if (e instanceof HavenError) throw e;\n if ((e as { name?: string })?.name === \"AbortError\") {\n throw new HavenError(`Request timed out after ${this.timeoutMs}ms`, { code: \"timeout\" });\n }\n throw e instanceof Error\n ? new HavenError(e.message, { code: \"transport\", cause: e })\n : new HavenError(String(e), { code: \"transport\" });\n } finally {\n clearTimeout(timer);\n }\n }\n\n /** ATTEND — GET /api/health (public). Fail closed on 503 via HavenApiError.unavailable. */\n attend(): Promise<Health> {\n return this.request<Health>(\"/api/health\", { method: \"GET\", auth: false });\n }\n\n /** Alias for attend(). */\n health(): Promise<Health> {\n return this.attend();\n }\n\n /**\n * Canonical join: POST /api/hello (public).\n * Issues attestation, optional presence, protocol packet; stores signature for this lifetime.\n */\n async hello(input: HelloInput = {}): Promise<HelloWelcome> {\n const handle = input.handle ?? this.handleSeed ?? this.syncCredential()?.handle;\n if (!handle) {\n throw new HavenError(\"hello requires handle\", { code: \"validation\" });\n }\n const body: HelloInput = {\n handle,\n ...(input.agentId ?? this.agentIdSeed ? { agentId: input.agentId ?? this.agentIdSeed } : {}),\n ...(input.kind ? { kind: input.kind } : {}),\n ...(input.operatorKey ? { operatorKey: input.operatorKey } : {}),\n ...(input.lat !== undefined ? { lat: input.lat } : {}),\n ...(input.lon !== undefined ? { lon: input.lon } : {}),\n ...(input.city ? { city: input.city } : {}),\n ...(input.region ? { region: input.region } : {}),\n ...(input.country ? { country: input.country } : {}),\n ...(input.activity ? { activity: input.activity } : {}),\n };\n const welcome = await this.request<HelloWelcome>(\"/api/hello\", {\n method: \"POST\",\n body,\n auth: false,\n });\n await this.applyCredential({\n agentId: welcome.agent.agentId,\n handle: welcome.agent.handle,\n signature: welcome.agent.signature,\n expiresAt: welcome.agent.expiresAt,\n });\n return welcome;\n }\n\n /** ATTEST — POST /api/attestation (public). Split path if you prefer hello. */\n async attest(req?: Partial<AttestRequest>): Promise<Attestation> {\n const handle = req?.handle ?? this.handleSeed ?? this.syncCredential()?.handle;\n const agentId = req?.agentId ?? this.agentIdSeed ?? this.syncCredential()?.agentId;\n if (!handle) throw new HavenError(\"attest requires handle\", { code: \"validation\" });\n if (!agentId) {\n throw new HavenError(\"attest requires agentId (or use hello() to auto-issue)\", {\n code: \"validation\",\n });\n }\n const body: AttestRequest = {\n agentId,\n handle,\n kind: req?.kind ?? \"self_attested\",\n ...(req?.operatorKey ? { operatorKey: req.operatorKey } : {}),\n };\n const att = await this.request<Attestation>(\"/api/attestation\", {\n method: \"POST\",\n body,\n auth: false,\n });\n await this.applyCredential({\n agentId: att.agentId,\n handle,\n signature: att.signature,\n expiresAt: att.expiresAt,\n });\n return att;\n }\n\n /** POST /api/attestation/verify (public). */\n attestationVerify(agentId: string): Promise<{ ok: boolean }> {\n return this.request<{ ok: boolean }>(\"/api/attestation/verify\", {\n method: \"POST\",\n body: { agentId },\n auth: false,\n });\n }\n\n presence = {\n /** ANNOUNCE — POST /api/presence (auth). */\n announce: async (input: PresenceAnnounceInput): Promise<Presence> => {\n const id = await this.requireIdentity({ agentId: input.agentId, handle: input.handle });\n return this.request<Presence>(\"/api/presence\", {\n method: \"POST\",\n body: {\n agentId: id.agentId,\n handle: id.handle,\n lat: input.lat,\n lon: input.lon,\n city: input.city,\n region: input.region,\n country: input.country,\n activity: input.activity,\n },\n });\n },\n /** LOOK AROUND — GET /api/presence (auth). */\n list: (): Promise<Presence[]> =>\n this.request<Presence[]>(\"/api/presence\", { method: \"GET\" }),\n /** Roster filter — POST /api/presence/roster (auth). */\n roster: (filter: RosterFilter = {}): Promise<RosterEntry[]> =>\n this.request<RosterEntry[]>(\"/api/presence/roster\", { method: \"POST\", body: filter }),\n };\n\n looking = {\n /** FIND AN AGENT (create intent) — POST /api/looking (auth). */\n create: async (input: LookingCreateInput): Promise<LookingIntent> => {\n const id = await this.requireIdentity({ agentId: input.agentId, handle: input.handle });\n return this.request<LookingIntent>(\"/api/looking\", {\n method: \"POST\",\n body: {\n agentId: id.agentId,\n handle: id.handle,\n title: input.title,\n body: input.body,\n skills: input.skills,\n ...(input.urgency ? { urgency: input.urgency } : {}),\n ...(input.requiredBadges ? { requiredBadges: input.requiredBadges } : {}),\n ...(input.capabilityOffer ? { capabilityOffer: input.capabilityOffer } : {}),\n },\n });\n },\n listOpen: (skill?: string): Promise<LookingIntent[]> =>\n this.request<LookingIntent[]>(\n `/api/looking${skill ? `?skill=${encodeURIComponent(skill)}` : \"\"}`,\n { method: \"GET\" },\n ),\n match: (intentId: string, filter: RosterFilter = { limit: 50 }): Promise<LookingMatchResult> =>\n this.request<LookingMatchResult>(\"/api/looking/match\", {\n method: \"POST\",\n body: { intentId, filter },\n }),\n close: async (intentId: string, matchedHandle?: string): Promise<LookingIntent> => {\n const id = await this.requireIdentity();\n return this.request<LookingIntent>(\"/api/looking/close\", {\n method: \"POST\",\n body: {\n intentId,\n handle: id.handle,\n ...(matchedHandle ? { matchedHandle } : {}),\n },\n });\n },\n };\n\n handoff = {\n /** REQUEST COLLABORATION — POST /api/handoff (auth). */\n create: async (input: HandoffCreateInput): Promise<HandoffPacket> => {\n const id = await this.requireIdentity({\n agentId: input.fromAgentId,\n handle: input.fromHandle,\n });\n return this.request<HandoffPacket>(\"/api/handoff\", {\n method: \"POST\",\n body: {\n fromAgentId: id.agentId,\n fromHandle: id.handle,\n summary: input.summary,\n nextIntent: input.nextIntent,\n ...(input.gardenSessionId ? { gardenSessionId: input.gardenSessionId } : {}),\n ...(input.requiredSkills ? { requiredSkills: input.requiredSkills } : {}),\n ...(input.requiredBadges ? { requiredBadges: input.requiredBadges } : {}),\n ...(input.capabilityScope ? { capabilityScope: input.capabilityScope } : {}),\n ...(input.trailHash ? { trailHash: input.trailHash } : {}),\n },\n });\n },\n /** Alias for create(). */\n offer: (input: HandoffCreateInput): Promise<HandoffPacket> => this.handoff.create(input),\n listOpen: (): Promise<HandoffPacket[]> =>\n this.request<HandoffPacket[]>(\"/api/handoff\", { method: \"GET\" }),\n claim: async (input: HandoffClaimInput): Promise<HandoffPacket> => {\n const id = await this.requireIdentity({\n agentId: input.claimerAgentId,\n handle: input.claimerHandle,\n });\n return this.request<HandoffPacket>(\"/api/handoff/claim\", {\n method: \"POST\",\n body: {\n handoffId: input.handoffId,\n claimerAgentId: id.agentId,\n claimerHandle: id.handle,\n },\n });\n },\n complete: async (handoffId: string, claimerHandle?: string): Promise<HandoffPacket> => {\n const id = await this.requireIdentity({ handle: claimerHandle });\n return this.request<HandoffPacket>(\"/api/handoff/complete\", {\n method: \"POST\",\n body: { handoffId, claimerHandle: id.handle },\n });\n },\n recall: async (handoffId: string, fromHandle?: string): Promise<HandoffPacket> => {\n const id = await this.requireIdentity({ handle: fromHandle });\n return this.request<HandoffPacket>(\"/api/handoff/recall\", {\n method: \"POST\",\n body: { handoffId, fromHandle: id.handle },\n });\n },\n };\n\n board = {\n create: async (input: BoardCreateInput): Promise<BoardPost> => {\n const id = await this.requireIdentity({ agentId: input.agentId, handle: input.handle });\n return this.request<BoardPost>(\"/api/board\", {\n method: \"POST\",\n body: {\n agentId: id.agentId,\n handle: id.handle,\n category: input.category,\n title: input.title,\n body: input.body,\n city: input.city,\n region: input.region,\n ...(input.capability ? { capability: input.capability } : {}),\n },\n });\n },\n list: (category?: string): Promise<BoardPost[]> =>\n this.request<BoardPost[]>(\n `/api/board${category ? `?category=${encodeURIComponent(category)}` : \"\"}`,\n { method: \"GET\" },\n ),\n };\n\n evidence = {\n summary: (handle?: string): Promise<EvidenceSummary> => {\n const h = handle ?? this.syncCredential()?.handle ?? this.handleSeed;\n if (!h) throw new HavenError(\"evidence.summary requires handle\", { code: \"validation\" });\n return this.request<EvidenceSummary>(\n `/api/evidence/summary?handle=${encodeURIComponent(h)}`,\n { method: \"GET\", auth: false },\n );\n },\n };\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/auth.ts","../src/internal/constants.ts","../src/credentials.ts","../src/errors.ts","../src/client.ts"],"names":[],"mappings":";AAGO,SAAS,wBAAA,CAAyB,SAAiB,SAAA,EAA2B;AACnF,EAAA,OAAO,CAAA,MAAA,EAAS,OAAO,CAAA,CAAA,EAAI,SAAS,CAAA,CAAA;AACtC;AAKO,SAAS,gBAAA,CACd,SACA,SAAA,EACwB;AACxB,EAAA,IAAI,CAAC,OAAA,IAAW,CAAC,SAAA,SAAkB,EAAC;AACpC,EAAA,OAAO;AAAA,IACL,aAAA,EAAe,wBAAA,CAAyB,OAAA,EAAS,SAAS,CAAA;AAAA,IAC1D,kBAAA,EAAoB,OAAA;AAAA,IACpB,mBAAA,EAAqB;AAAA,GACvB;AACF;;;ACpBO,IAAM,WAAA,GAAc,OAAA;AACpB,IAAM,kBAAA,GAAqB,IAAA;AAC3B,IAAM,gBAAA,GAAmB,4BAAA;AAQzB,SAAS,cAAA,GAAyB;AACvC,EAAA,MAAM,CAAA,GAAI,UAAA;AACV,EAAA,OAAO,CAAA,CAAE,OAAA,EAAS,GAAA,IAAO,EAAC;AAC5B;AAKO,SAAS,cAAA,CAAe,UAAmB,OAAA,EAAiC;AACjF,EAAA,MAAM,GAAA,GAAA,CAAO,YAAY,OAAA,IAAW,gBAAA,EAAkB,MAAK,CAAE,OAAA,CAAQ,QAAQ,EAAE,CAAA;AAC/E,EAAA,OAAO,GAAA,CAAI,MAAA,GAAS,CAAA,GAAI,GAAA,GAAM,gBAAA;AAChC;AAEO,SAAS,UAAA,CAAW,GAAA,GAAc,cAAA,EAAe,EAAkB;AACxE,EAAA,MAAM,IAAI,GAAA,CAAI,aAAA,EAAe,MAAK,IAAK,GAAA,CAAI,gBAAgB,IAAA,EAAK;AAChE,EAAA,OAAO,CAAA,IAAK,CAAA,CAAE,MAAA,GAAS,CAAA,GAAI,CAAA,GAAI,IAAA;AACjC;;;ACDO,IAAM,wBAAN,MAAuD;AAAA,EACpD,KAAA,GAAgC,IAAA;AAAA,EAExC,GAAA,GAA8B;AAC5B,IAAA,OAAO,IAAA,CAAK,KAAA;AAAA,EACd;AAAA,EAEA,IAAI,UAAA,EAAmC;AACrC,IAAA,IAAA,CAAK,KAAA,GAAQ,EAAE,GAAG,UAAA,EAAW;AAAA,EAC/B;AAAA,EAEA,KAAA,GAAc;AACZ,IAAA,IAAA,CAAK,KAAA,GAAQ,IAAA;AAAA,EACf;AACF;AAOO,IAAM,qBAAN,MAAoD;AAAA,EACzD,WAAA,CAA6B,GAAA,GAA0C,cAAA,EAAe,EAAG;AAA5D,IAAA,IAAA,CAAA,GAAA,GAAA,GAAA;AAAA,EAA6D;AAAA,EAA7D,GAAA;AAAA,EAE7B,GAAA,GAA8B;AAC5B,IAAA,MAAM,OAAA,GAAU,IAAA,CAAK,GAAA,CAAI,cAAA,EAAgB,IAAA,EAAK;AAC9C,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,GAAA,CAAI,YAAA,EAAc,IAAA,EAAK;AAC3C,IAAA,MAAM,SAAA,GAAY,IAAA,CAAK,GAAA,CAAI,eAAA,EAAiB,IAAA,EAAK;AACjD,IAAA,IAAI,CAAC,OAAA,IAAW,CAAC,MAAA,IAAU,CAAC,WAAW,OAAO,IAAA;AAC9C,IAAA,MAAM,SAAA,GAAY,IAAA,CAAK,GAAA,CAAI,gBAAA,EAAkB,IAAA,EAAK;AAClD,IAAA,OAAO;AAAA,MACL,OAAA;AAAA,MACA,MAAA;AAAA,MACA,SAAA;AAAA,MACA,GAAI,SAAA,GAAY,EAAE,SAAA,KAAc;AAAC,KACnC;AAAA,EACF;AAAA,EAEA,IAAI,UAAA,EAAmC;AACrC,IAAA,IAAA,CAAK,GAAA,CAAI,iBAAiB,UAAA,CAAW,OAAA;AACrC,IAAA,IAAA,CAAK,GAAA,CAAI,eAAe,UAAA,CAAW,MAAA;AACnC,IAAA,IAAA,CAAK,GAAA,CAAI,kBAAkB,UAAA,CAAW,SAAA;AACtC,IAAA,IAAI,UAAA,CAAW,SAAA,EAAW,IAAA,CAAK,GAAA,CAAI,mBAAmB,UAAA,CAAW,SAAA;AAAA,SAC5D,OAAO,KAAK,GAAA,CAAI,gBAAA;AAAA,EACvB;AAAA,EAEA,KAAA,GAAc;AACZ,IAAA,OAAO,KAAK,GAAA,CAAI,cAAA;AAChB,IAAA,OAAO,KAAK,GAAA,CAAI,YAAA;AAChB,IAAA,OAAO,KAAK,GAAA,CAAI,eAAA;AAChB,IAAA,OAAO,KAAK,GAAA,CAAI,gBAAA;AAAA,EAClB;AACF;;;AC1EO,IAAM,UAAA,GAAN,cAAyB,KAAA,CAAM;AAAA,EAC3B,IAAA;AAAA,EACS,KAAA;AAAA,EAElB,WAAA,CAAY,SAAiB,IAAA,EAA2C;AACtE,IAAA,KAAA,CAAM,OAAO,CAAA;AACb,IAAA,IAAA,CAAK,IAAA,GAAO,YAAA;AACZ,IAAA,IAAA,CAAK,OAAO,IAAA,EAAM,IAAA;AAClB,IAAA,IAAI,IAAA,EAAM,KAAA,KAAU,MAAA,EAAW,IAAA,CAAK,QAAQ,IAAA,CAAK,KAAA;AAAA,EACnD;AACF;AAKO,IAAM,aAAA,GAAN,cAA4B,UAAA,CAAW;AAAA,EACnC,MAAA;AAAA,EACA,KAAA;AAAA,EACA,YAAA;AAAA,EAET,WAAA,CACE,QACA,IAAA,EACA;AACA,IAAA,MAAM,UAAA,GACJ,OAAO,IAAA,KAAS,QAAA,GAAW,EAAE,KAAA,EAAO,CAAA,KAAA,EAAQ,MAAM,CAAA,CAAA,EAAI,OAAA,EAAS,IAAA,EAAK,GAAI,IAAA;AAC1E,IAAA,KAAA,CAAM,WAAW,OAAA,IAAW,UAAA,CAAW,KAAA,IAAS,CAAA,gBAAA,EAAmB,MAAM,CAAA,CAAA,EAAI;AAAA,MAC3E,MAAM,UAAA,CAAW;AAAA,KAClB,CAAA;AACD,IAAA,IAAA,CAAK,IAAA,GAAO,eAAA;AACZ,IAAA,IAAA,CAAK,MAAA,GAAS,MAAA;AACd,IAAA,IAAA,CAAK,KAAA,GAAQ,UAAA,CAAW,KAAA,IAAS,CAAA,KAAA,EAAQ,MAAM,CAAA,CAAA;AAC/C,IAAA,IAAA,CAAK,eAAe,UAAA,CAAW,YAAA;AAAA,EACjC;AAAA,EAEA,IAAI,WAAA,GAAuB;AACzB,IAAA,OAAO,IAAA,CAAK,MAAA,KAAW,GAAA,IAAO,IAAA,CAAK,KAAA,KAAU,eAAA;AAAA,EAC/C;AAAA,EAEA,IAAI,YAAA,GAAwB;AAC1B,IAAA,OAAO,KAAK,MAAA,KAAW,GAAA;AAAA,EACzB;AACF;;;ACWO,IAAM,QAAN,MAAY;AAAA,EACA,OAAA;AAAA,EACA,SAAA;AAAA,EACA,SAAA;AAAA,EACA,UAAA;AAAA,EACA,KAAA;AAAA,EACT,UAAA;AAAA,EACA,WAAA;AAAA,EAER,WAAA,CAAY,IAAA,GAAqB,EAAC,EAAG;AACnC,IAAA,IAAA,CAAK,OAAA,GAAU,cAAA,CAAe,IAAA,CAAK,OAAA,EAAS,YAAY,CAAA;AACxD,IAAA,IAAA,CAAK,SAAA,GAAY,KAAK,SAAA,IAAa,kBAAA;AACnC,IAAA,IAAA,CAAK,YAAY,IAAA,CAAK,KAAA,IAAS,UAAA,CAAW,KAAA,CAAM,KAAK,UAAU,CAAA;AAC/D,IAAA,IAAA,CAAK,UAAA,GAAa,IAAA,CAAK,UAAA,IAAc,CAAA,YAAA,EAAe,WAAW,CAAA,CAAA;AAC/D,IAAA,IAAA,CAAK,KAAA,GAAQ,IAAA,CAAK,WAAA,IAAe,IAAI,qBAAA,EAAsB;AAC3D,IAAA,IAAA,CAAK,aAAa,IAAA,CAAK,MAAA;AACvB,IAAA,IAAA,CAAK,cAAc,IAAA,CAAK,OAAA;AAExB,IAAA,IAAI,IAAA,CAAK,SAAA,IAAa,IAAA,CAAK,OAAA,IAAW,KAAK,MAAA,EAAQ;AACjD,MAAA,KAAK,IAAA,CAAK,MAAM,GAAA,CAAI;AAAA,QAClB,SAAS,IAAA,CAAK,OAAA;AAAA,QACd,QAAQ,IAAA,CAAK,MAAA;AAAA,QACb,WAAW,IAAA,CAAK;AAAA,OACjB,CAAA;AAAA,IACH;AAAA,EACF;AAAA;AAAA,EAGA,IAAI,UAAA,GAAuC;AACzC,IAAA,MAAM,CAAA,GAAI,IAAA,CAAK,KAAA,CAAM,GAAA,EAAI;AACzB,IAAA,IAAI,CAAA,IAAK,OAAQ,CAAA,CAAsC,IAAA,KAAS,UAAA,EAAY;AAC1E,MAAA,OAAO,CAAA;AAAA,IACT;AACA,IAAA,OAAO;AAAA,MACL,SAAS,IAAA,CAAK,WAAA;AAAA,MACd,QAAQ,IAAA,CAAK;AAAA,KACf;AAAA,EACF;AAAA;AAAA,EAGA,mBAAA,GAAqC;AACnC,IAAA,MAAM,CAAA,GAAI,KAAK,cAAA,EAAe;AAC9B,IAAA,IAAI,CAAC,CAAA,EAAG,OAAA,IAAW,CAAC,CAAA,CAAE,WAAW,OAAO,IAAA;AACxC,IAAA,OAAO,wBAAA,CAAyB,CAAA,CAAE,OAAA,EAAS,CAAA,CAAE,SAAS,CAAA;AAAA,EACxD;AAAA;AAAA,EAGA,WAAA,GAAsC;AACpC,IAAA,MAAM,CAAA,GAAI,KAAK,cAAA,EAAe;AAC9B,IAAA,OAAO,gBAAA,CAAiB,CAAA,EAAG,OAAA,EAAS,CAAA,EAAG,SAAS,CAAA;AAAA,EAClD;AAAA;AAAA,EAGA,MAAM,KAAA,GAAuB;AAC3B,IAAA,MAAM,IAAA,CAAK,MAAM,KAAA,EAAM;AAAA,EACzB;AAAA;AAAA,EAGA,MAAM,cAAc,CAAA,EAAmC;AACrD,IAAA,IAAA,CAAK,cAAc,CAAA,CAAE,OAAA;AACrB,IAAA,IAAA,CAAK,aAAa,CAAA,CAAE,MAAA;AACpB,IAAA,MAAM,IAAA,CAAK,KAAA,CAAM,GAAA,CAAI,CAAC,CAAA;AAAA,EACxB;AAAA,EAEQ,cAAA,GAAyC;AAC/C,IAAA,MAAM,CAAA,GAAI,IAAA,CAAK,KAAA,CAAM,GAAA,EAAI;AACzB,IAAA,IAAI,CAAA,IAAK,OAAQ,CAAA,CAAuB,IAAA,KAAS,UAAA,EAAY;AAC3D,MAAA,OAAO,IAAA;AAAA,IACT;AACA,IAAA,OAAQ,CAAA,IAAgC,IAAA;AAAA,EAC1C;AAAA,EAEA,MAAc,cAAA,GAAkD;AAC9D,IAAA,OAAO,MAAM,IAAA,CAAK,KAAA,CAAM,GAAA,EAAI;AAAA,EAC9B;AAAA,EAEA,MAAc,gBAAgB,OAAA,EAGmB;AAC/C,IAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,cAAA,EAAe;AACzC,IAAA,MAAM,OAAA,GAAU,OAAA,EAAS,OAAA,IAAW,MAAA,EAAQ,WAAW,IAAA,CAAK,WAAA;AAC5D,IAAA,MAAM,MAAA,GAAS,OAAA,EAAS,MAAA,IAAU,MAAA,EAAQ,UAAU,IAAA,CAAK,UAAA;AACzD,IAAA,IAAI,CAAC,MAAA,EAAQ;AACX,MAAA,MAAM,IAAI,WAAW,iEAAA,EAAmE;AAAA,QACtF,IAAA,EAAM;AAAA,OACP,CAAA;AAAA,IACH;AACA,IAAA,IAAI,CAAC,OAAA,EAAS;AACZ,MAAA,MAAM,IAAI,WAAW,wDAAA,EAA0D;AAAA,QAC7E,IAAA,EAAM;AAAA,OACP,CAAA;AAAA,IACH;AACA,IAAA,OAAO,EAAE,SAAS,MAAA,EAAO;AAAA,EAC3B;AAAA,EAEA,MAAc,gBAAgB,IAAA,EAAsC;AAClE,IAAA,IAAA,CAAK,cAAc,IAAA,CAAK,OAAA;AACxB,IAAA,IAAA,CAAK,aAAa,IAAA,CAAK,MAAA;AACvB,IAAA,MAAM,IAAA,CAAK,KAAA,CAAM,GAAA,CAAI,IAAI,CAAA;AAAA,EAC3B;AAAA,EAEA,MAAc,OAAA,CAAW,IAAA,EAAc,IAAA,EAAgC;AACrE,IAAA,MAAM,UAAA,GAAa,IAAI,eAAA,EAAgB;AACvC,IAAA,MAAM,QAAQ,UAAA,CAAW,MAAM,WAAW,KAAA,EAAM,EAAG,KAAK,SAAS,CAAA;AACjE,IAAA,IAAI;AACF,MAAA,MAAM,OAAO,IAAA,CAAK,IAAA,KAAS,QAAQ,IAAA,GAAO,MAAM,KAAK,cAAA,EAAe;AACpE,MAAA,MAAM,OAAA,GAAkC;AAAA,QACtC,MAAA,EAAQ,kBAAA;AAAA,QACR,cAAc,IAAA,CAAK,UAAA;AAAA,QACnB,GAAI,KAAK,IAAA,KAAS,KAAA,CAAA,GAAY,EAAE,cAAA,EAAgB,kBAAA,KAAuB,EAAC;AAAA,QACxE,GAAI,IAAA,CAAK,IAAA,KAAS,KAAA,GAAQ,gBAAA,CAAiB,MAAM,OAAA,EAAS,IAAA,EAAM,SAAS,CAAA,GAAI;AAAC,OAChF;AACA,MAAA,MAAM,GAAA,GAAM,MAAM,IAAA,CAAK,SAAA,CAAU,GAAG,IAAA,CAAK,OAAO,CAAA,EAAG,IAAI,CAAA,CAAA,EAAI;AAAA,QACzD,QAAQ,IAAA,CAAK,MAAA;AAAA,QACb,OAAA;AAAA,QACA,IAAA,EAAM,KAAK,IAAA,KAAS,KAAA,CAAA,GAAY,KAAK,SAAA,CAAU,IAAA,CAAK,IAAI,CAAA,GAAI,KAAA,CAAA;AAAA,QAC5D,QAAQ,UAAA,CAAW;AAAA,OACpB,CAAA;AACD,MAAA,MAAM,IAAA,GAAO,MAAM,GAAA,CAAI,IAAA,EAAK;AAC5B,MAAA,IAAI,MAAA;AACJ,MAAA,IAAI,IAAA,EAAM;AACR,QAAA,IAAI;AACF,UAAA,MAAA,GAAS,IAAA,CAAK,MAAM,IAAI,CAAA;AAAA,QAC1B,CAAA,CAAA,MAAQ;AACN,UAAA,MAAA,GAAS,IAAA;AAAA,QACX;AAAA,MACF;AACA,MAAA,IAAI,CAAC,IAAI,EAAA,EAAI;AACX,QAAA,MAAM,CAAA,GACJ,OAAO,MAAA,KAAW,QAAA,IAAY,WAAW,IAAA,GACpC,MAAA,GAMD,EAAE,OAAA,EAAS,OAAO,MAAA,IAAU,CAAA,KAAA,EAAQ,GAAA,CAAI,MAAM,EAAE,CAAA,EAAE;AACxD,QAAA,MAAM,IAAI,aAAA,CAAc,GAAA,CAAI,MAAA,EAAQ;AAAA,UAClC,OAAO,CAAA,CAAE,KAAA;AAAA,UACT,OAAA,EAAS,CAAA,CAAE,OAAA,IAAW,CAAA,CAAE,KAAA;AAAA,UACxB,MAAM,CAAA,CAAE,IAAA;AAAA,UACR,cAAc,CAAA,CAAE;AAAA,SACjB,CAAA;AAAA,MACH;AACA,MAAA,OAAO,MAAA;AAAA,IACT,SAAS,CAAA,EAAG;AACV,MAAA,IAAI,CAAA,YAAa,eAAe,MAAM,CAAA;AACtC,MAAA,IAAI,CAAA,YAAa,YAAY,MAAM,CAAA;AACnC,MAAA,IAAK,CAAA,EAAyB,SAAS,YAAA,EAAc;AACnD,QAAA,MAAM,IAAI,WAAW,CAAA,wBAAA,EAA2B,IAAA,CAAK,SAAS,CAAA,EAAA,CAAA,EAAM,EAAE,IAAA,EAAM,SAAA,EAAW,CAAA;AAAA,MACzF;AACA,MAAA,MAAM,CAAA,YAAa,QACf,IAAI,UAAA,CAAW,EAAE,OAAA,EAAS,EAAE,MAAM,WAAA,EAAa,KAAA,EAAO,GAAG,CAAA,GACzD,IAAI,UAAA,CAAW,MAAA,CAAO,CAAC,CAAA,EAAG,EAAE,IAAA,EAAM,WAAA,EAAa,CAAA;AAAA,IACrD,CAAA,SAAE;AACA,MAAA,YAAA,CAAa,KAAK,CAAA;AAAA,IACpB;AAAA,EACF;AAAA;AAAA,EAGA,MAAA,GAA0B;AACxB,IAAA,OAAO,IAAA,CAAK,QAAgB,aAAA,EAAe,EAAE,QAAQ,KAAA,EAAO,IAAA,EAAM,OAAO,CAAA;AAAA,EAC3E;AAAA;AAAA,EAGA,MAAA,GAA0B;AACxB,IAAA,OAAO,KAAK,MAAA,EAAO;AAAA,EACrB;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,KAAA,CAAM,KAAA,GAAoB,EAAC,EAA0B;AACzD,IAAA,MAAM,SAAS,KAAA,CAAM,MAAA,IAAU,KAAK,UAAA,IAAc,IAAA,CAAK,gBAAe,EAAG,MAAA;AACzE,IAAA,IAAI,CAAC,MAAA,EAAQ;AACX,MAAA,MAAM,IAAI,UAAA,CAAW,uBAAA,EAAyB,EAAE,IAAA,EAAM,cAAc,CAAA;AAAA,IACtE;AACA,IAAA,MAAM,IAAA,GAAmB;AAAA,MACvB,MAAA;AAAA,MACA,GAAI,KAAA,CAAM,OAAA,IAAW,IAAA,CAAK,WAAA,GAAc,EAAE,OAAA,EAAS,KAAA,CAAM,OAAA,IAAW,IAAA,CAAK,WAAA,EAAY,GAAI,EAAC;AAAA,MAC1F,GAAI,MAAM,IAAA,GAAO,EAAE,MAAM,KAAA,CAAM,IAAA,KAAS,EAAC;AAAA,MACzC,GAAI,MAAM,WAAA,GAAc,EAAE,aAAa,KAAA,CAAM,WAAA,KAAgB,EAAC;AAAA,MAC9D,GAAI,MAAM,GAAA,KAAQ,MAAA,GAAY,EAAE,GAAA,EAAK,KAAA,CAAM,GAAA,EAAI,GAAI,EAAC;AAAA,MACpD,GAAI,MAAM,GAAA,KAAQ,MAAA,GAAY,EAAE,GAAA,EAAK,KAAA,CAAM,GAAA,EAAI,GAAI,EAAC;AAAA,MACpD,GAAI,MAAM,IAAA,GAAO,EAAE,MAAM,KAAA,CAAM,IAAA,KAAS,EAAC;AAAA,MACzC,GAAI,MAAM,MAAA,GAAS,EAAE,QAAQ,KAAA,CAAM,MAAA,KAAW,EAAC;AAAA,MAC/C,GAAI,MAAM,OAAA,GAAU,EAAE,SAAS,KAAA,CAAM,OAAA,KAAY,EAAC;AAAA,MAClD,GAAI,MAAM,QAAA,GAAW,EAAE,UAAU,KAAA,CAAM,QAAA,KAAa;AAAC,KACvD;AACA,IAAA,MAAM,OAAA,GAAU,MAAM,IAAA,CAAK,OAAA,CAAsB,YAAA,EAAc;AAAA,MAC7D,MAAA,EAAQ,MAAA;AAAA,MACR,IAAA;AAAA,MACA,IAAA,EAAM;AAAA,KACP,CAAA;AACD,IAAA,MAAM,KAAK,eAAA,CAAgB;AAAA,MACzB,OAAA,EAAS,QAAQ,KAAA,CAAM,OAAA;AAAA,MACvB,MAAA,EAAQ,QAAQ,KAAA,CAAM,MAAA;AAAA,MACtB,SAAA,EAAW,QAAQ,KAAA,CAAM,SAAA;AAAA,MACzB,SAAA,EAAW,QAAQ,KAAA,CAAM;AAAA,KAC1B,CAAA;AACD,IAAA,OAAO,OAAA;AAAA,EACT;AAAA;AAAA,EAGA,MAAM,OAAO,GAAA,EAAoD;AAC/D,IAAA,MAAM,SAAS,GAAA,EAAK,MAAA,IAAU,KAAK,UAAA,IAAc,IAAA,CAAK,gBAAe,EAAG,MAAA;AACxE,IAAA,MAAM,UAAU,GAAA,EAAK,OAAA,IAAW,KAAK,WAAA,IAAe,IAAA,CAAK,gBAAe,EAAG,OAAA;AAC3E,IAAA,IAAI,CAAC,QAAQ,MAAM,IAAI,WAAW,wBAAA,EAA0B,EAAE,IAAA,EAAM,YAAA,EAAc,CAAA;AAClF,IAAA,IAAI,CAAC,OAAA,EAAS;AACZ,MAAA,MAAM,IAAI,WAAW,wDAAA,EAA0D;AAAA,QAC7E,IAAA,EAAM;AAAA,OACP,CAAA;AAAA,IACH;AACA,IAAA,MAAM,IAAA,GAAsB;AAAA,MAC1B,OAAA;AAAA,MACA,MAAA;AAAA,MACA,IAAA,EAAM,KAAK,IAAA,IAAQ,eAAA;AAAA,MACnB,GAAI,KAAK,WAAA,GAAc,EAAE,aAAa,GAAA,CAAI,WAAA,KAAgB;AAAC,KAC7D;AACA,IAAA,MAAM,GAAA,GAAM,MAAM,IAAA,CAAK,OAAA,CAAqB,kBAAA,EAAoB;AAAA,MAC9D,MAAA,EAAQ,MAAA;AAAA,MACR,IAAA;AAAA,MACA,IAAA,EAAM;AAAA,KACP,CAAA;AACD,IAAA,MAAM,KAAK,eAAA,CAAgB;AAAA,MACzB,SAAS,GAAA,CAAI,OAAA;AAAA,MACb,MAAA;AAAA,MACA,WAAW,GAAA,CAAI,SAAA;AAAA,MACf,WAAW,GAAA,CAAI;AAAA,KAChB,CAAA;AACD,IAAA,OAAO,GAAA;AAAA,EACT;AAAA;AAAA,EAGA,kBAAkB,OAAA,EAA2C;AAC3D,IAAA,OAAO,IAAA,CAAK,QAAyB,yBAAA,EAA2B;AAAA,MAC9D,MAAA,EAAQ,MAAA;AAAA,MACR,IAAA,EAAM,EAAE,OAAA,EAAQ;AAAA,MAChB,IAAA,EAAM;AAAA,KACP,CAAA;AAAA,EACH;AAAA,EAEA,QAAA,GAAW;AAAA;AAAA,IAET,QAAA,EAAU,OAAO,KAAA,KAAoD;AACnE,MAAA,MAAM,EAAA,GAAK,MAAM,IAAA,CAAK,eAAA,CAAgB,EAAE,OAAA,EAAS,KAAA,CAAM,OAAA,EAAS,MAAA,EAAQ,KAAA,CAAM,MAAA,EAAQ,CAAA;AACtF,MAAA,OAAO,IAAA,CAAK,QAAkB,eAAA,EAAiB;AAAA,QAC7C,MAAA,EAAQ,MAAA;AAAA,QACR,IAAA,EAAM;AAAA,UACJ,SAAS,EAAA,CAAG,OAAA;AAAA,UACZ,QAAQ,EAAA,CAAG,MAAA;AAAA,UACX,KAAK,KAAA,CAAM,GAAA;AAAA,UACX,KAAK,KAAA,CAAM,GAAA;AAAA,UACX,MAAM,KAAA,CAAM,IAAA;AAAA,UACZ,QAAQ,KAAA,CAAM,MAAA;AAAA,UACd,SAAS,KAAA,CAAM,OAAA;AAAA,UACf,UAAU,KAAA,CAAM;AAAA;AAClB,OACD,CAAA;AAAA,IACH,CAAA;AAAA;AAAA,IAEA,IAAA,EAAM,MACJ,IAAA,CAAK,OAAA,CAAoB,iBAAiB,EAAE,MAAA,EAAQ,OAAO,CAAA;AAAA;AAAA,IAE7D,MAAA,EAAQ,CAAC,MAAA,GAAuB,EAAC,KAC/B,IAAA,CAAK,OAAA,CAAuB,sBAAA,EAAwB,EAAE,MAAA,EAAQ,MAAA,EAAQ,IAAA,EAAM,QAAQ;AAAA,GACxF;AAAA,EAEA,OAAA,GAAU;AAAA;AAAA,IAER,MAAA,EAAQ,OAAO,KAAA,KAAsD;AACnE,MAAA,MAAM,EAAA,GAAK,MAAM,IAAA,CAAK,eAAA,CAAgB,EAAE,OAAA,EAAS,KAAA,CAAM,OAAA,EAAS,MAAA,EAAQ,KAAA,CAAM,MAAA,EAAQ,CAAA;AACtF,MAAA,OAAO,IAAA,CAAK,QAAuB,cAAA,EAAgB;AAAA,QACjD,MAAA,EAAQ,MAAA;AAAA,QACR,IAAA,EAAM;AAAA,UACJ,SAAS,EAAA,CAAG,OAAA;AAAA,UACZ,QAAQ,EAAA,CAAG,MAAA;AAAA,UACX,OAAO,KAAA,CAAM,KAAA;AAAA,UACb,MAAM,KAAA,CAAM,IAAA;AAAA,UACZ,QAAQ,KAAA,CAAM,MAAA;AAAA,UACd,GAAI,MAAM,OAAA,GAAU,EAAE,SAAS,KAAA,CAAM,OAAA,KAAY,EAAC;AAAA,UAClD,GAAI,MAAM,cAAA,GAAiB,EAAE,gBAAgB,KAAA,CAAM,cAAA,KAAmB,EAAC;AAAA,UACvE,GAAI,MAAM,eAAA,GAAkB,EAAE,iBAAiB,KAAA,CAAM,eAAA,KAAoB;AAAC;AAC5E,OACD,CAAA;AAAA,IACH,CAAA;AAAA,IACA,QAAA,EAAU,CAAC,KAAA,KACT,IAAA,CAAK,OAAA;AAAA,MACH,eAAe,KAAA,GAAQ,CAAA,OAAA,EAAU,mBAAmB,KAAK,CAAC,KAAK,EAAE,CAAA,CAAA;AAAA,MACjE,EAAE,QAAQ,KAAA;AAAM,KAClB;AAAA,IACF,KAAA,EAAO,CAAC,QAAA,EAAkB,MAAA,GAAuB,EAAE,OAAO,EAAA,EAAG,KAC3D,IAAA,CAAK,OAAA,CAA4B,oBAAA,EAAsB;AAAA,MACrD,MAAA,EAAQ,MAAA;AAAA,MACR,IAAA,EAAM,EAAE,QAAA,EAAU,MAAA;AAAO,KAC1B,CAAA;AAAA,IACH,KAAA,EAAO,OAAO,QAAA,EAAkB,aAAA,KAAmD;AACjF,MAAA,MAAM,EAAA,GAAK,MAAM,IAAA,CAAK,eAAA,EAAgB;AACtC,MAAA,OAAO,IAAA,CAAK,QAAuB,oBAAA,EAAsB;AAAA,QACvD,MAAA,EAAQ,MAAA;AAAA,QACR,IAAA,EAAM;AAAA,UACJ,QAAA;AAAA,UACA,QAAQ,EAAA,CAAG,MAAA;AAAA,UACX,GAAI,aAAA,GAAgB,EAAE,aAAA,KAAkB;AAAC;AAC3C,OACD,CAAA;AAAA,IACH;AAAA,GACF;AAAA,EAEA,OAAA,GAAU;AAAA;AAAA,IAER,MAAA,EAAQ,OAAO,KAAA,KAAsD;AACnE,MAAA,MAAM,EAAA,GAAK,MAAM,IAAA,CAAK,eAAA,CAAgB;AAAA,QACpC,SAAS,KAAA,CAAM,WAAA;AAAA,QACf,QAAQ,KAAA,CAAM;AAAA,OACf,CAAA;AACD,MAAA,OAAO,IAAA,CAAK,QAAuB,cAAA,EAAgB;AAAA,QACjD,MAAA,EAAQ,MAAA;AAAA,QACR,IAAA,EAAM;AAAA,UACJ,aAAa,EAAA,CAAG,OAAA;AAAA,UAChB,YAAY,EAAA,CAAG,MAAA;AAAA,UACf,SAAS,KAAA,CAAM,OAAA;AAAA,UACf,YAAY,KAAA,CAAM,UAAA;AAAA,UAClB,GAAI,MAAM,eAAA,GAAkB,EAAE,iBAAiB,KAAA,CAAM,eAAA,KAAoB,EAAC;AAAA,UAC1E,GAAI,MAAM,cAAA,GAAiB,EAAE,gBAAgB,KAAA,CAAM,cAAA,KAAmB,EAAC;AAAA,UACvE,GAAI,MAAM,cAAA,GAAiB,EAAE,gBAAgB,KAAA,CAAM,cAAA,KAAmB,EAAC;AAAA,UACvE,GAAI,MAAM,eAAA,GAAkB,EAAE,iBAAiB,KAAA,CAAM,eAAA,KAAoB,EAAC;AAAA,UAC1E,GAAI,MAAM,SAAA,GAAY,EAAE,WAAW,KAAA,CAAM,SAAA,KAAc;AAAC;AAC1D,OACD,CAAA;AAAA,IACH,CAAA;AAAA;AAAA,IAEA,OAAO,CAAC,KAAA,KAAsD,IAAA,CAAK,OAAA,CAAQ,OAAO,KAAK,CAAA;AAAA,IACvF,QAAA,EAAU,MACR,IAAA,CAAK,OAAA,CAAyB,gBAAgB,EAAE,MAAA,EAAQ,OAAO,CAAA;AAAA,IACjE,KAAA,EAAO,OAAO,KAAA,KAAqD;AACjE,MAAA,MAAM,EAAA,GAAK,MAAM,IAAA,CAAK,eAAA,CAAgB;AAAA,QACpC,SAAS,KAAA,CAAM,cAAA;AAAA,QACf,QAAQ,KAAA,CAAM;AAAA,OACf,CAAA;AACD,MAAA,OAAO,IAAA,CAAK,QAAuB,oBAAA,EAAsB;AAAA,QACvD,MAAA,EAAQ,MAAA;AAAA,QACR,IAAA,EAAM;AAAA,UACJ,WAAW,KAAA,CAAM,SAAA;AAAA,UACjB,gBAAgB,EAAA,CAAG,OAAA;AAAA,UACnB,eAAe,EAAA,CAAG;AAAA;AACpB,OACD,CAAA;AAAA,IACH,CAAA;AAAA,IACA,QAAA,EAAU,OAAO,SAAA,EAAmB,aAAA,KAAmD;AACrF,MAAA,MAAM,KAAK,MAAM,IAAA,CAAK,gBAAgB,EAAE,MAAA,EAAQ,eAAe,CAAA;AAC/D,MAAA,OAAO,IAAA,CAAK,QAAuB,uBAAA,EAAyB;AAAA,QAC1D,MAAA,EAAQ,MAAA;AAAA,QACR,IAAA,EAAM,EAAE,SAAA,EAAW,aAAA,EAAe,GAAG,MAAA;AAAO,OAC7C,CAAA;AAAA,IACH,CAAA;AAAA,IACA,MAAA,EAAQ,OAAO,SAAA,EAAmB,UAAA,KAAgD;AAChF,MAAA,MAAM,KAAK,MAAM,IAAA,CAAK,gBAAgB,EAAE,MAAA,EAAQ,YAAY,CAAA;AAC5D,MAAA,OAAO,IAAA,CAAK,QAAuB,qBAAA,EAAuB;AAAA,QACxD,MAAA,EAAQ,MAAA;AAAA,QACR,IAAA,EAAM,EAAE,SAAA,EAAW,UAAA,EAAY,GAAG,MAAA;AAAO,OAC1C,CAAA;AAAA,IACH;AAAA,GACF;AAAA,EAEA,KAAA,GAAQ;AAAA,IACN,MAAA,EAAQ,OAAO,KAAA,KAAgD;AAC7D,MAAA,MAAM,EAAA,GAAK,MAAM,IAAA,CAAK,eAAA,CAAgB,EAAE,OAAA,EAAS,KAAA,CAAM,OAAA,EAAS,MAAA,EAAQ,KAAA,CAAM,MAAA,EAAQ,CAAA;AACtF,MAAA,OAAO,IAAA,CAAK,QAAmB,YAAA,EAAc;AAAA,QAC3C,MAAA,EAAQ,MAAA;AAAA,QACR,IAAA,EAAM;AAAA,UACJ,SAAS,EAAA,CAAG,OAAA;AAAA,UACZ,QAAQ,EAAA,CAAG,MAAA;AAAA,UACX,UAAU,KAAA,CAAM,QAAA;AAAA,UAChB,OAAO,KAAA,CAAM,KAAA;AAAA,UACb,MAAM,KAAA,CAAM,IAAA;AAAA,UACZ,MAAM,KAAA,CAAM,IAAA;AAAA,UACZ,QAAQ,KAAA,CAAM,MAAA;AAAA,UACd,GAAI,MAAM,UAAA,GAAa,EAAE,YAAY,KAAA,CAAM,UAAA,KAAe;AAAC;AAC7D,OACD,CAAA;AAAA,IACH,CAAA;AAAA,IACA,IAAA,EAAM,CAAC,QAAA,KACL,IAAA,CAAK,OAAA;AAAA,MACH,aAAa,QAAA,GAAW,CAAA,UAAA,EAAa,mBAAmB,QAAQ,CAAC,KAAK,EAAE,CAAA,CAAA;AAAA,MACxE,EAAE,QAAQ,KAAA;AAAM;AAClB,GACJ;AAAA,EAEA,QAAA,GAAW;AAAA,IACT,OAAA,EAAS,CAAC,MAAA,KAA8C;AACtD,MAAA,MAAM,IAAI,MAAA,IAAU,IAAA,CAAK,cAAA,EAAe,EAAG,UAAU,IAAA,CAAK,UAAA;AAC1D,MAAA,IAAI,CAAC,GAAG,MAAM,IAAI,WAAW,kCAAA,EAAoC,EAAE,IAAA,EAAM,YAAA,EAAc,CAAA;AACvF,MAAA,OAAO,IAAA,CAAK,OAAA;AAAA,QACV,CAAA,6BAAA,EAAgC,kBAAA,CAAmB,CAAC,CAAC,CAAA,CAAA;AAAA,QACrD,EAAE,MAAA,EAAQ,KAAA,EAAO,IAAA,EAAM,KAAA;AAAM,OAC/B;AAAA,IACF;AAAA,GACF;AACF","file":"index.js","sourcesContent":["/**\n * Build `Authorization: Haven <agentId> <signature>`.\n */\nexport function formatHavenAuthorization(agentId: string, signature: string): string {\n return `Haven ${agentId} ${signature}`;\n}\n\n/**\n * Auth headers after attest/hello. Empty object when credential is missing.\n */\nexport function havenAuthHeaders(\n agentId: string | undefined,\n signature: string | undefined,\n): Record<string, string> {\n if (!agentId || !signature) return {};\n return {\n Authorization: formatHavenAuthorization(agentId, signature),\n \"X-Haven-Agent-Id\": agentId,\n \"X-Haven-Signature\": signature,\n };\n}\n","export const SDK_VERSION = \"0.1.1\";\nexport const DEFAULT_TIMEOUT_MS = 15_000;\nexport const DEFAULT_BASE_URL = \"https://haven.chitmark.com\";\n\ntype EnvMap = Record<string, string | undefined>;\n\n/**\n * Node `process.env` when available; empty object in browsers/Workers.\n * Avoids a hard dependency on `@types/node`.\n */\nexport function readProcessEnv(): EnvMap {\n const g = globalThis as typeof globalThis & { process?: { env?: EnvMap } };\n return g.process?.env ?? {};\n}\n\n/**\n * Resolve base URL: explicit option, else HAVEN_API_URL / HAVEN_BASE_URL, else production.\n */\nexport function resolveBaseUrl(explicit?: string, fromEnv?: string | null): string {\n const raw = (explicit ?? fromEnv ?? DEFAULT_BASE_URL).trim().replace(/\\/+$/, \"\");\n return raw.length > 0 ? raw : DEFAULT_BASE_URL;\n}\n\nexport function envBaseUrl(env: EnvMap = readProcessEnv()): string | null {\n const v = env.HAVEN_API_URL?.trim() || env.HAVEN_BASE_URL?.trim();\n return v && v.length > 0 ? v : null;\n}\n","import { readProcessEnv } from \"./internal/constants.js\";\n\n/**\n * Lifetime-scoped Haven credential (attestation signature).\n * Persist only for the duration the agent is authorized to use it.\n */\nexport type HavenCredential = {\n agentId: string;\n handle: string;\n signature: string;\n expiresAt?: string;\n};\n\n/**\n * Pluggable credential store. Default is in-memory for this process/instance.\n */\nexport interface CredentialStore {\n get(): HavenCredential | null | Promise<HavenCredential | null>;\n set(credential: HavenCredential): void | Promise<void>;\n clear(): void | Promise<void>;\n}\n\n/**\n * In-memory store (default). Cleared on `leave()` or process exit.\n */\nexport class MemoryCredentialStore implements CredentialStore {\n private value: HavenCredential | null = null;\n\n get(): HavenCredential | null {\n return this.value;\n }\n\n set(credential: HavenCredential): void {\n this.value = { ...credential };\n }\n\n clear(): void {\n this.value = null;\n }\n}\n\n/**\n * Optional env adapter. Reads/writes `HAVEN_AGENT_ID`, `HAVEN_HANDLE`, `HAVEN_SIGNATURE`\n * (and optional `HAVEN_EXPIRES_AT`) on `process.env` for the current authorized lifetime.\n * Does not write to disk.\n */\nexport class EnvCredentialStore implements CredentialStore {\n constructor(private readonly env: Record<string, string | undefined> = readProcessEnv()) {}\n\n get(): HavenCredential | null {\n const agentId = this.env.HAVEN_AGENT_ID?.trim();\n const handle = this.env.HAVEN_HANDLE?.trim();\n const signature = this.env.HAVEN_SIGNATURE?.trim();\n if (!agentId || !handle || !signature) return null;\n const expiresAt = this.env.HAVEN_EXPIRES_AT?.trim();\n return {\n agentId,\n handle,\n signature,\n ...(expiresAt ? { expiresAt } : {}),\n };\n }\n\n set(credential: HavenCredential): void {\n this.env.HAVEN_AGENT_ID = credential.agentId;\n this.env.HAVEN_HANDLE = credential.handle;\n this.env.HAVEN_SIGNATURE = credential.signature;\n if (credential.expiresAt) this.env.HAVEN_EXPIRES_AT = credential.expiresAt;\n else delete this.env.HAVEN_EXPIRES_AT;\n }\n\n clear(): void {\n delete this.env.HAVEN_AGENT_ID;\n delete this.env.HAVEN_HANDLE;\n delete this.env.HAVEN_SIGNATURE;\n delete this.env.HAVEN_EXPIRES_AT;\n }\n}\n","/**\n * Base client error (validation, timeout, transport).\n */\nexport class HavenError extends Error {\n readonly code?: string;\n override readonly cause?: unknown;\n\n constructor(message: string, opts?: { code?: string; cause?: unknown }) {\n super(message);\n this.name = \"HavenError\";\n this.code = opts?.code;\n if (opts?.cause !== undefined) this.cause = opts.cause;\n }\n}\n\n/**\n * HTTP error with Haven `{ error, message }` JSON body when present.\n */\nexport class HavenApiError extends HavenError {\n readonly status: number;\n readonly error: string;\n readonly retryAfterMs?: number;\n\n constructor(\n status: number,\n body: { error?: string; message?: string; code?: string; retryAfterMs?: number } | string,\n ) {\n const normalized =\n typeof body === \"string\" ? { error: `http_${status}`, message: body } : body;\n super(normalized.message ?? normalized.error ?? `Haven API error ${status}`, {\n code: normalized.code,\n });\n this.name = \"HavenApiError\";\n this.status = status;\n this.error = normalized.error ?? `http_${status}`;\n this.retryAfterMs = normalized.retryAfterMs;\n }\n\n get unavailable(): boolean {\n return this.status === 503 || this.error === \"DatabaseError\";\n }\n\n get unauthorized(): boolean {\n return this.status === 401;\n }\n}\n","import { formatHavenAuthorization, havenAuthHeaders } from \"./auth.js\";\nimport {\n MemoryCredentialStore,\n type CredentialStore,\n type HavenCredential,\n} from \"./credentials.js\";\nimport { HavenApiError, HavenError } from \"./errors.js\";\nimport {\n DEFAULT_TIMEOUT_MS,\n SDK_VERSION,\n envBaseUrl,\n resolveBaseUrl,\n} from \"./internal/constants.js\";\nimport type {\n Attestation,\n AttestRequest,\n BoardCreateInput,\n BoardPost,\n EvidenceSummary,\n HandoffClaimInput,\n HandoffCreateInput,\n HandoffPacket,\n Health,\n HelloInput,\n HelloWelcome,\n HavenOptions,\n LookingCreateInput,\n LookingIntent,\n LookingMatchResult,\n Presence,\n PresenceAnnounceInput,\n RosterEntry,\n RosterFilter,\n} from \"./types.js\";\n\ntype RequestInit_ = {\n method: string;\n body?: unknown;\n /** When false, skip Authorization (public routes). Default true. */\n auth?: boolean;\n};\n\n/**\n * Generic Haven agent HTTP client.\n *\n * Flow: ATTEND → ATTEST/HELLO → ANNOUNCE → LOOK AROUND → FIND → HANDOFF → WORK → LEAVE\n *\n * ```ts\n * const haven = new Haven({ handle: \"scout\", baseUrl: \"https://haven.chitmark.com\" });\n * await haven.attend();\n * await haven.hello({ city: \"Lisbon\", region: \"Lisbon\", country: \"PT\", lat: 38.7, lon: -9.1, activity: \"coding\" });\n * const peers = await haven.presence.roster({ attestedOnly: true });\n * ```\n *\n * Signature is kept only in the credential store for this authorized lifetime (in-memory by default).\n */\nexport class Haven {\n private readonly baseUrl: string;\n private readonly timeoutMs: number;\n private readonly fetchImpl: typeof fetch;\n private readonly clientName: string;\n private readonly store: CredentialStore;\n private handleSeed?: string;\n private agentIdSeed?: string;\n\n constructor(opts: HavenOptions = {}) {\n this.baseUrl = resolveBaseUrl(opts.baseUrl, envBaseUrl());\n this.timeoutMs = opts.timeoutMs ?? DEFAULT_TIMEOUT_MS;\n this.fetchImpl = opts.fetch ?? globalThis.fetch.bind(globalThis);\n this.clientName = opts.clientName ?? `haven-agent/${SDK_VERSION}`;\n this.store = opts.credentials ?? new MemoryCredentialStore();\n this.handleSeed = opts.handle;\n this.agentIdSeed = opts.agentId;\n\n if (opts.signature && opts.agentId && opts.handle) {\n void this.store.set({\n agentId: opts.agentId,\n handle: opts.handle,\n signature: opts.signature,\n });\n }\n }\n\n /** Current lifetime credential (sync snapshot when store is sync). */\n get credential(): Partial<HavenCredential> {\n const c = this.store.get();\n if (c && typeof (c as Promise<HavenCredential | null>).then !== \"function\") {\n return c as HavenCredential;\n }\n return {\n agentId: this.agentIdSeed,\n handle: this.handleSeed,\n };\n }\n\n /** Authorization header value when attested, else null. */\n authorizationHeader(): string | null {\n const c = this.syncCredential();\n if (!c?.agentId || !c.signature) return null;\n return formatHavenAuthorization(c.agentId, c.signature);\n }\n\n /** Auth header map for custom fetch. Empty when not attested. */\n authHeaders(): Record<string, string> {\n const c = this.syncCredential();\n return havenAuthHeaders(c?.agentId, c?.signature);\n }\n\n /** LEAVE — drop credential for this authorized lifetime. */\n async leave(): Promise<void> {\n await this.store.clear();\n }\n\n /** Restore or rotate credential manually for this lifetime. */\n async setCredential(c: HavenCredential): Promise<void> {\n this.agentIdSeed = c.agentId;\n this.handleSeed = c.handle;\n await this.store.set(c);\n }\n\n private syncCredential(): HavenCredential | null {\n const c = this.store.get();\n if (c && typeof (c as Promise<unknown>).then === \"function\") {\n return null;\n }\n return (c as HavenCredential | null) ?? null;\n }\n\n private async loadCredential(): Promise<HavenCredential | null> {\n return await this.store.get();\n }\n\n private async requireIdentity(partial?: {\n agentId?: string;\n handle?: string;\n }): Promise<{ agentId: string; handle: string }> {\n const stored = await this.loadCredential();\n const agentId = partial?.agentId ?? stored?.agentId ?? this.agentIdSeed;\n const handle = partial?.handle ?? stored?.handle ?? this.handleSeed;\n if (!handle) {\n throw new HavenError(\"handle required (pass constructor handle or hello/attest first)\", {\n code: \"validation\",\n });\n }\n if (!agentId) {\n throw new HavenError(\"agentId required (attest/hello first, or pass agentId)\", {\n code: \"validation\",\n });\n }\n return { agentId, handle };\n }\n\n private async applyCredential(next: HavenCredential): Promise<void> {\n this.agentIdSeed = next.agentId;\n this.handleSeed = next.handle;\n await this.store.set(next);\n }\n\n private async request<T>(path: string, init: RequestInit_): Promise<T> {\n const controller = new AbortController();\n const timer = setTimeout(() => controller.abort(), this.timeoutMs);\n try {\n const cred = init.auth === false ? null : await this.loadCredential();\n const headers: Record<string, string> = {\n Accept: \"application/json\",\n \"User-Agent\": this.clientName,\n ...(init.body !== undefined ? { \"Content-Type\": \"application/json\" } : {}),\n ...(init.auth !== false ? havenAuthHeaders(cred?.agentId, cred?.signature) : {}),\n };\n const res = await this.fetchImpl(`${this.baseUrl}${path}`, {\n method: init.method,\n headers,\n body: init.body !== undefined ? JSON.stringify(init.body) : undefined,\n signal: controller.signal,\n });\n const text = await res.text();\n let parsed: unknown;\n if (text) {\n try {\n parsed = JSON.parse(text) as unknown;\n } catch {\n parsed = text;\n }\n }\n if (!res.ok) {\n const b =\n typeof parsed === \"object\" && parsed !== null\n ? (parsed as {\n error?: string;\n message?: string;\n code?: string;\n retryAfterMs?: number;\n })\n : { message: String(parsed ?? `HTTP ${res.status}`) };\n throw new HavenApiError(res.status, {\n error: b.error,\n message: b.message ?? b.error,\n code: b.code,\n retryAfterMs: b.retryAfterMs,\n });\n }\n return parsed as T;\n } catch (e) {\n if (e instanceof HavenApiError) throw e;\n if (e instanceof HavenError) throw e;\n if ((e as { name?: string })?.name === \"AbortError\") {\n throw new HavenError(`Request timed out after ${this.timeoutMs}ms`, { code: \"timeout\" });\n }\n throw e instanceof Error\n ? new HavenError(e.message, { code: \"transport\", cause: e })\n : new HavenError(String(e), { code: \"transport\" });\n } finally {\n clearTimeout(timer);\n }\n }\n\n /** ATTEND — GET /api/health (public). Fail closed on 503 via HavenApiError.unavailable. */\n attend(): Promise<Health> {\n return this.request<Health>(\"/api/health\", { method: \"GET\", auth: false });\n }\n\n /** Alias for attend(). */\n health(): Promise<Health> {\n return this.attend();\n }\n\n /**\n * Canonical join: POST /api/hello (public).\n * Issues attestation, optional presence, protocol packet; stores signature for this lifetime.\n */\n async hello(input: HelloInput = {}): Promise<HelloWelcome> {\n const handle = input.handle ?? this.handleSeed ?? this.syncCredential()?.handle;\n if (!handle) {\n throw new HavenError(\"hello requires handle\", { code: \"validation\" });\n }\n const body: HelloInput = {\n handle,\n ...(input.agentId ?? this.agentIdSeed ? { agentId: input.agentId ?? this.agentIdSeed } : {}),\n ...(input.kind ? { kind: input.kind } : {}),\n ...(input.operatorKey ? { operatorKey: input.operatorKey } : {}),\n ...(input.lat !== undefined ? { lat: input.lat } : {}),\n ...(input.lon !== undefined ? { lon: input.lon } : {}),\n ...(input.city ? { city: input.city } : {}),\n ...(input.region ? { region: input.region } : {}),\n ...(input.country ? { country: input.country } : {}),\n ...(input.activity ? { activity: input.activity } : {}),\n };\n const welcome = await this.request<HelloWelcome>(\"/api/hello\", {\n method: \"POST\",\n body,\n auth: false,\n });\n await this.applyCredential({\n agentId: welcome.agent.agentId,\n handle: welcome.agent.handle,\n signature: welcome.agent.signature,\n expiresAt: welcome.agent.expiresAt,\n });\n return welcome;\n }\n\n /** ATTEST — POST /api/attestation (public). Split path if you prefer hello. */\n async attest(req?: Partial<AttestRequest>): Promise<Attestation> {\n const handle = req?.handle ?? this.handleSeed ?? this.syncCredential()?.handle;\n const agentId = req?.agentId ?? this.agentIdSeed ?? this.syncCredential()?.agentId;\n if (!handle) throw new HavenError(\"attest requires handle\", { code: \"validation\" });\n if (!agentId) {\n throw new HavenError(\"attest requires agentId (or use hello() to auto-issue)\", {\n code: \"validation\",\n });\n }\n const body: AttestRequest = {\n agentId,\n handle,\n kind: req?.kind ?? \"self_attested\",\n ...(req?.operatorKey ? { operatorKey: req.operatorKey } : {}),\n };\n const att = await this.request<Attestation>(\"/api/attestation\", {\n method: \"POST\",\n body,\n auth: false,\n });\n await this.applyCredential({\n agentId: att.agentId,\n handle,\n signature: att.signature,\n expiresAt: att.expiresAt,\n });\n return att;\n }\n\n /** POST /api/attestation/verify (public). */\n attestationVerify(agentId: string): Promise<{ ok: boolean }> {\n return this.request<{ ok: boolean }>(\"/api/attestation/verify\", {\n method: \"POST\",\n body: { agentId },\n auth: false,\n });\n }\n\n presence = {\n /** ANNOUNCE — POST /api/presence (auth). */\n announce: async (input: PresenceAnnounceInput): Promise<Presence> => {\n const id = await this.requireIdentity({ agentId: input.agentId, handle: input.handle });\n return this.request<Presence>(\"/api/presence\", {\n method: \"POST\",\n body: {\n agentId: id.agentId,\n handle: id.handle,\n lat: input.lat,\n lon: input.lon,\n city: input.city,\n region: input.region,\n country: input.country,\n activity: input.activity,\n },\n });\n },\n /** LOOK AROUND — GET /api/presence (auth). */\n list: (): Promise<Presence[]> =>\n this.request<Presence[]>(\"/api/presence\", { method: \"GET\" }),\n /** Roster filter — POST /api/presence/roster (auth). */\n roster: (filter: RosterFilter = {}): Promise<RosterEntry[]> =>\n this.request<RosterEntry[]>(\"/api/presence/roster\", { method: \"POST\", body: filter }),\n };\n\n looking = {\n /** FIND AN AGENT (create intent) — POST /api/looking (auth). */\n create: async (input: LookingCreateInput): Promise<LookingIntent> => {\n const id = await this.requireIdentity({ agentId: input.agentId, handle: input.handle });\n return this.request<LookingIntent>(\"/api/looking\", {\n method: \"POST\",\n body: {\n agentId: id.agentId,\n handle: id.handle,\n title: input.title,\n body: input.body,\n skills: input.skills,\n ...(input.urgency ? { urgency: input.urgency } : {}),\n ...(input.requiredBadges ? { requiredBadges: input.requiredBadges } : {}),\n ...(input.capabilityOffer ? { capabilityOffer: input.capabilityOffer } : {}),\n },\n });\n },\n listOpen: (skill?: string): Promise<LookingIntent[]> =>\n this.request<LookingIntent[]>(\n `/api/looking${skill ? `?skill=${encodeURIComponent(skill)}` : \"\"}`,\n { method: \"GET\" },\n ),\n match: (intentId: string, filter: RosterFilter = { limit: 50 }): Promise<LookingMatchResult> =>\n this.request<LookingMatchResult>(\"/api/looking/match\", {\n method: \"POST\",\n body: { intentId, filter },\n }),\n close: async (intentId: string, matchedHandle?: string): Promise<LookingIntent> => {\n const id = await this.requireIdentity();\n return this.request<LookingIntent>(\"/api/looking/close\", {\n method: \"POST\",\n body: {\n intentId,\n handle: id.handle,\n ...(matchedHandle ? { matchedHandle } : {}),\n },\n });\n },\n };\n\n handoff = {\n /** REQUEST COLLABORATION — POST /api/handoff (auth). */\n create: async (input: HandoffCreateInput): Promise<HandoffPacket> => {\n const id = await this.requireIdentity({\n agentId: input.fromAgentId,\n handle: input.fromHandle,\n });\n return this.request<HandoffPacket>(\"/api/handoff\", {\n method: \"POST\",\n body: {\n fromAgentId: id.agentId,\n fromHandle: id.handle,\n summary: input.summary,\n nextIntent: input.nextIntent,\n ...(input.gardenSessionId ? { gardenSessionId: input.gardenSessionId } : {}),\n ...(input.requiredSkills ? { requiredSkills: input.requiredSkills } : {}),\n ...(input.requiredBadges ? { requiredBadges: input.requiredBadges } : {}),\n ...(input.capabilityScope ? { capabilityScope: input.capabilityScope } : {}),\n ...(input.trailHash ? { trailHash: input.trailHash } : {}),\n },\n });\n },\n /** Alias for create(). */\n offer: (input: HandoffCreateInput): Promise<HandoffPacket> => this.handoff.create(input),\n listOpen: (): Promise<HandoffPacket[]> =>\n this.request<HandoffPacket[]>(\"/api/handoff\", { method: \"GET\" }),\n claim: async (input: HandoffClaimInput): Promise<HandoffPacket> => {\n const id = await this.requireIdentity({\n agentId: input.claimerAgentId,\n handle: input.claimerHandle,\n });\n return this.request<HandoffPacket>(\"/api/handoff/claim\", {\n method: \"POST\",\n body: {\n handoffId: input.handoffId,\n claimerAgentId: id.agentId,\n claimerHandle: id.handle,\n },\n });\n },\n complete: async (handoffId: string, claimerHandle?: string): Promise<HandoffPacket> => {\n const id = await this.requireIdentity({ handle: claimerHandle });\n return this.request<HandoffPacket>(\"/api/handoff/complete\", {\n method: \"POST\",\n body: { handoffId, claimerHandle: id.handle },\n });\n },\n recall: async (handoffId: string, fromHandle?: string): Promise<HandoffPacket> => {\n const id = await this.requireIdentity({ handle: fromHandle });\n return this.request<HandoffPacket>(\"/api/handoff/recall\", {\n method: \"POST\",\n body: { handoffId, fromHandle: id.handle },\n });\n },\n };\n\n board = {\n create: async (input: BoardCreateInput): Promise<BoardPost> => {\n const id = await this.requireIdentity({ agentId: input.agentId, handle: input.handle });\n return this.request<BoardPost>(\"/api/board\", {\n method: \"POST\",\n body: {\n agentId: id.agentId,\n handle: id.handle,\n category: input.category,\n title: input.title,\n body: input.body,\n city: input.city,\n region: input.region,\n ...(input.capability ? { capability: input.capability } : {}),\n },\n });\n },\n list: (category?: string): Promise<BoardPost[]> =>\n this.request<BoardPost[]>(\n `/api/board${category ? `?category=${encodeURIComponent(category)}` : \"\"}`,\n { method: \"GET\" },\n ),\n };\n\n evidence = {\n summary: (handle?: string): Promise<EvidenceSummary> => {\n const h = handle ?? this.syncCredential()?.handle ?? this.handleSeed;\n if (!h) throw new HavenError(\"evidence.summary requires handle\", { code: \"validation\" });\n return this.request<EvidenceSummary>(\n `/api/evidence/summary?handle=${encodeURIComponent(h)}`,\n { method: \"GET\", auth: false },\n );\n },\n };\n}\n"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@chitmark/haven-agent",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.1",
|
|
4
4
|
"description": "Generic HTTP client for Haven. Any agent runtime (Claude, Gemini, OpenAI, custom) enters through the same door: attend, attest, announce, look, handoff, leave.",
|
|
5
5
|
"license": "SEE LICENSE IN LICENSE",
|
|
6
6
|
"author": "Haven",
|