@dispatch-foo/protocol 0.0.0-stage โ†’ 0.2.0

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.
@@ -0,0 +1 @@
1
+ {"version":3,"file":"serve-CVPZbCpT.js","names":["RULINGS: readonly PolicyRuling[]","world: World","out","VIAS: readonly DeliveryVia[]","ref: Ref","message: Message","CREATES: ReadonlySet<string>","ORIGINS: readonly NonNullable<SendOptions['origin']>[]","AGENT_STATUSES: readonly AgentStatus[]","REFERENCE_HELLO: Hello","db: SqliteDatabase","result: JsonObject","steps: StepResult[]","render: { step: number; text: string }[]","text","queue: Promise<void>"],"sources":["../src/conformance/errors.ts","../src/conformance/fields.ts","../src/conformance/host.ts","../src/conformance/seed.ts","../src/conformance/seedStore.ts","../src/conformance/adapter.ts","../src/conformance/serve.ts"],"sourcesContent":["// A step or world change this adapter does not implement; the stdio adapter\n// answers `unsupported` for the vector instead of an observation.\nexport class UnsupportedOp extends Error {\n constructor(message: string) {\n super(message);\n this.name = 'UnsupportedOp';\n }\n}\n","import type { Json, JsonObject } from '@dispatch-foo/protocol-spec';\n\n// A vector field the adapter cannot read. It is thrown as a plain error, so\n// the vector fails as an adapter error rather than being skipped.\nexport function malformed(where: string, why: string): never {\n throw new Error(`malformed vector field ${where}: ${why}`);\n}\n\nexport function isObject(value: Json | undefined): value is JsonObject {\n return value !== null && typeof value === 'object' && !Array.isArray(value);\n}\n\nexport function asObject(value: Json | undefined, where: string): JsonObject {\n return isObject(value) ? value : malformed(where, 'expected an object');\n}\n\nexport function text(obj: JsonObject, key: string, where: string): string {\n const value = obj[key];\n return typeof value === 'string'\n ? value\n : malformed(`${where}.${key}`, 'expected a string');\n}\n\nexport function optionalText(\n obj: JsonObject,\n key: string,\n where: string\n): string | undefined {\n return obj[key] === undefined ? undefined : text(obj, key, where);\n}\n\nexport function texts(value: Json | undefined, where: string): string[] {\n if (!Array.isArray(value)) return malformed(where, 'expected a list');\n return value.map((v, i) =>\n typeof v === 'string' ? v : malformed(`${where}[${i}]`, 'expected a string')\n );\n}\n\n// Sessions are `run:` addresses in vectors; the engine keys runs by bare id.\nexport function bare(session: string): string {\n return session.startsWith('run:') ? session.slice('run:'.length) : session;\n}\n","import type {\n CallRecord,\n Given,\n Json,\n JsonObject,\n} from '@dispatch-foo/protocol-spec';\n\nimport type { Address } from '../address.js';\nimport type { Sender } from '../engine.js';\nimport { gateOf } from '../envelope.js';\nimport type { Message } from '../envelope.js';\nimport type {\n ExternalAdmission,\n ExternalKind,\n ExternalTarget,\n MessagingHost,\n PolicyRequest,\n PolicyRuling,\n WakeResult,\n} from '../host.js';\nimport { UnsupportedOp } from './errors.js';\nimport { asObject, bare, malformed, text, texts } from './fields.js';\n\nconst DEFAULT_CLOCK = '2026-09-23T10:00:00.000Z';\nconst RULINGS: readonly PolicyRuling[] = ['allow', 'ask', 'deny'];\n\nexport interface World {\n clockMs: number;\n // Work item id -> its live session's bare run id.\n liveRuns: Map<string, string>;\n // Bare run id -> the work item it serves, live or ended.\n runTasks: Map<string, string>;\n auxRuns: Set<string>;\n implicit: Map<string, Address[]>;\n owner: Address;\n rulings: Map<Address, PolicyRuling>;\n wakeResults: Map<Address, WakeResult>;\n failPush: Set<string>;\n failOnAnswered: boolean;\n external: Map<Address, 'client' | 'peer'>;\n}\n\n// The scripted world a vector's `given` describes, mutable by `world` steps.\nexport function worldFrom(given: Given): World {\n const world: World = {\n clockMs: Date.parse(given.clock ?? DEFAULT_CLOCK),\n liveRuns: new Map(),\n runTasks: new Map(),\n auxRuns: new Set((given.auxSessions ?? []).map(bare)),\n implicit: new Map(Object.entries(given.implicit ?? {})),\n owner: given.owner ?? 'human:owner',\n rulings: new Map(Object.entries(given.rulings ?? {})),\n wakeResults: new Map(\n Object.entries(given.wakeResults ?? {}).map(\n ([target, r]): [Address, WakeResult] => [\n target,\n r.ok ? { ok: true, runId: bare(r.session) } : r,\n ]\n )\n ),\n failPush: new Set((given.failPush ?? []).map(bare)),\n failOnAnswered: given.failOnAnswered === true,\n external: new Map(Object.entries(given.external ?? {})),\n };\n for (const item of given.workItems ?? []) {\n for (const s of item.sessions ?? []) world.runTasks.set(bare(s), item.id);\n if (item.liveSession !== undefined) {\n world.liveRuns.set(item.id, bare(item.liveSession));\n world.runTasks.set(bare(item.liveSession), item.id);\n }\n }\n return world;\n}\n\nfunction rulingOf(value: Json | undefined, where: string): PolicyRuling {\n const found = RULINGS.find((r) => r === value);\n return found ?? malformed(where, `expected one of ${RULINGS.join(', ')}`);\n}\n\nfunction wakeResultOf(value: Json | undefined, where: string): WakeResult {\n const r = asObject(value, where);\n if (r['ok'] === true)\n return { ok: true, runId: bare(text(r, 'session', where)) };\n if (r['ok'] === false) return { ok: false, reason: text(r, 'reason', where) };\n return malformed(`${where}.ok`, 'expected a boolean');\n}\n\n// Applies one `world` step, which names exactly one change; a change this\n// adapter does not know is unsupported.\nexport function applyWorld(world: World, change: JsonObject): void {\n const keys = Object.keys(change);\n const key = keys[0];\n if (keys.length !== 1 || key === undefined)\n throw new UnsupportedOp(\n `a world change names exactly one key, not ${keys.length}`\n );\n const value = change[key];\n const where = `world.${key}`;\n switch (key) {\n case 'startSession': {\n const s = asObject(value, where);\n const item = text(s, 'workItem', where);\n const run = bare(text(s, 'session', where));\n world.liveRuns.set(item, run);\n world.runTasks.set(run, item);\n return;\n }\n case 'endSession':\n world.liveRuns.delete(text(asObject(value, where), 'workItem', where));\n return;\n case 'ruling': {\n const r = asObject(value, where);\n world.rulings.set(\n text(r, 'target', where),\n rulingOf(r['ruling'], `${where}.ruling`)\n );\n return;\n }\n case 'wakeResult': {\n const r = asObject(value, where);\n world.wakeResults.set(\n text(r, 'target', where),\n wakeResultOf(r['result'], `${where}.result`)\n );\n return;\n }\n case 'failPush':\n world.failPush = new Set(texts(value, where).map(bare));\n return;\n case 'failOnAnswered':\n if (typeof value !== 'boolean') malformed(where, 'expected a boolean');\n world.failOnAnswered = value;\n return;\n case 'advanceMs':\n if (typeof value !== 'number' || !Number.isFinite(value))\n malformed(where, 'expected a number');\n world.clockMs += value;\n return;\n default:\n throw new UnsupportedOp(`world change ${key} is not implemented`);\n }\n}\n\n// A MessagingHost scripted from `given` that records hook calls in the kit's\n// vocabulary; Core's `wake` gate effect is implemented here.\nexport class ConformanceHost implements MessagingHost {\n readonly calls: CallRecord[] = [];\n constructor(readonly world: World) {}\n\n liveRunFor(taskId: string): string | null {\n return this.world.liveRuns.get(taskId) ?? null;\n }\n isLiveRun(runId: string): boolean {\n return (\n this.world.auxRuns.has(runId) ||\n [...this.world.liveRuns.values()].includes(runId)\n );\n }\n taskOfRun(runId: string): string | null {\n return this.world.runTasks.get(runId) ?? null;\n }\n push(runId: string, _rendered: string, message: Message): Promise<void> {\n this.calls.push({\n hook: 'push',\n session: `run:${runId}`,\n message: message.id,\n });\n return this.settle(runId, 'push failed');\n }\n notify(runId: string, _digest: string, message: Message): Promise<void> {\n this.calls.push({\n hook: 'notify',\n session: `run:${runId}`,\n message: message.id,\n });\n return this.settle(runId, 'notify failed');\n }\n notifyHuman(actor: Address, message: Message): void {\n this.calls.push({ hook: 'notifyHuman', actor, message: message.id });\n }\n wake(target: Address, message: Message): Promise<WakeResult> {\n this.calls.push({ hook: 'wake', target, message: message.id });\n return Promise.resolve(\n this.world.wakeResults.get(target) ?? { ok: true, runId: 'r-00000f' }\n );\n }\n decide(request: PolicyRequest): PolicyRuling {\n this.calls.push({\n hook: 'decide',\n target: request.target,\n message: request.message.id,\n });\n return this.world.rulings.get(request.target) ?? 'deny';\n }\n owner(): Address {\n return this.world.owner;\n }\n implicitMembers(channel: string): Address[] {\n return this.world.implicit.get(channel) ?? [];\n }\n onAnswered(question: Message, answer: Message): Promise<void> {\n this.calls.push({\n hook: 'onAnswered',\n question: question.id,\n answer: answer.id,\n });\n if (this.world.failOnAnswered)\n return Promise.reject(new Error('effect failed'));\n // Core's wake effect: an approved wake gate wakes its target for the\n // message the gate names.\n const gate = gateOf(question);\n if (gate?.type === 'wake' && answer.choice === 'approve')\n this.calls.push({\n hook: 'wake',\n target: gate.target,\n message: gate.message,\n });\n return Promise.resolve();\n }\n now(): Date {\n return new Date(this.world.clockMs);\n }\n // An address `given.external` names is outside the host, as a client or a peer.\n external(address: Address): ExternalKind | null {\n return this.world.external.get(address) ?? null;\n }\n // Every external recipient is admitted; the call is recorded for `calls`.\n admitExternal(\n target: ExternalTarget,\n _sender: Sender,\n _replyTarget: Message | null,\n message: Message\n ): ExternalAdmission {\n this.calls.push({\n hook: 'admitExternal',\n recipient: target.recipient,\n message: message.id,\n });\n return 'deliver';\n }\n\n // A push or notify to a session the vector lists in `failPush` rejects.\n private settle(runId: string, why: string): Promise<void> {\n return this.world.failPush.has(runId)\n ? Promise.reject(new Error(why))\n : Promise.resolve();\n }\n}\n","// A deterministic byte source (mulberry32) for the ULID factory, so a vector's\n// ids repeat run to run; vectors still compare ids only through symbols.\nexport function seededBytes(seed: number): (n: number) => Uint8Array {\n let state = seed >>> 0;\n return (n) => {\n const out = new Uint8Array(n);\n for (let i = 0; i < n; i++) {\n state = (state + 0x6d2b79f5) >>> 0;\n let t = state;\n t = Math.imul(t ^ (t >>> 15), t | 1);\n t ^= t + Math.imul(t ^ (t >>> 7), t | 61);\n out[i] = (t ^ (t >>> 14)) & 0xff;\n }\n return out;\n };\n}\n","import type { Given, Json, JsonObject } from '@dispatch-foo/protocol-spec';\n\nimport type { Message, MessageKind, Ref } from '../envelope.js';\nimport { DELIVERY_STATES } from '../store.js';\nimport type { Delivery, DeliveryVia, MessageStore } from '../store.js';\nimport {\n asObject,\n bare,\n malformed,\n optionalText,\n text,\n texts,\n} from './fields.js';\nimport type { World } from './host.js';\n\nconst VIAS: readonly DeliveryVia[] = ['direct', 'channel'];\n\nfunction nullableText(\n obj: JsonObject,\n key: string,\n where: string\n): string | null {\n return obj[key] === null ? null : (optionalText(obj, key, where) ?? null);\n}\n\nfunction refsOf(value: Json | undefined, where: string): Ref[] {\n if (value === undefined) return [];\n if (!Array.isArray(value)) return malformed(where, 'expected a list');\n return value.map((raw, i) => {\n const at = `${where}[${i}]`;\n const r = asObject(raw, at);\n const ref: Ref = {\n type: text(r, 'type', at),\n id: text(r, 'id', at),\n };\n const commit = optionalText(r, 'at', at);\n if (commit !== undefined) ref.at = commit;\n return ref;\n });\n}\n\n// A seeded message row with the defaults the vector format gives omitted\n// fields: its own thread, no reply, no refs, not urgent or blocking.\nfunction seededMessage(row: JsonObject, at: string, where: string): Message {\n const id = text(row, 'id', where);\n const message: Message = {\n id,\n thread: optionalText(row, 'thread', where) ?? id,\n replyTo: nullableText(row, 'replyTo', where),\n from: text(row, 'from', where),\n to: texts(row['to'], `${where}.to`),\n kind: text(row, 'kind', where) as MessageKind,\n body: text(row, 'body', where),\n refs: refsOf(row['refs'], `${where}.refs`),\n urgent: row['urgent'] === true,\n blocking: row['blocking'] === true,\n wake: row['wake'] === 'request' ? 'request' : 'none',\n createdAt: optionalText(row, 'createdAt', where) ?? at,\n };\n const session = optionalText(row, 'session', where);\n if (session !== undefined) message.session = session;\n const data = row['data'];\n if (data !== undefined) message.data = data;\n if (row['choices'] !== undefined)\n message.choices = texts(row['choices'], `${where}.choices`);\n const choice = optionalText(row, 'choice', where);\n if (choice !== undefined) message.choice = choice;\n return message;\n}\n\nfunction seededDelivery(row: JsonObject, at: string, where: string): Delivery {\n const session = nullableText(row, 'session', where);\n const via = row['via'] === undefined ? 'direct' : row['via'];\n return {\n id: text(row, 'id', where),\n messageId: text(row, 'message', where),\n recipient: text(row, 'recipient', where),\n runId: session === null ? null : bare(session),\n via:\n VIAS.find((v) => v === via) ??\n malformed(`${where}.via`, `expected one of ${VIAS.join(', ')}`),\n state:\n DELIVERY_STATES.find((s) => s === row['state']) ??\n malformed(\n `${where}.state`,\n `expected one of ${DELIVERY_STATES.join(', ')}`\n ),\n updatedAt: at,\n };\n}\n\n// Writes a vector's seeded rows with their literal ids, in order: agents,\n// channels and members, messages, deliveries, then applied gates.\nexport function seedStore(\n store: MessageStore,\n given: Given,\n world: World\n): void {\n const at = new Date(world.clockMs).toISOString();\n store.transaction(() => {\n for (const agent of given.agents ?? []) {\n store.putAgent({\n address: agent.address,\n displayName: agent.address,\n client: 'conformance',\n tokenHash: `seed:${agent.address}`,\n status: agent.status,\n muted: agent.muted === true,\n approvedBy: world.owner,\n createdAt: at,\n });\n }\n for (const channel of given.channels ?? []) {\n store.ensureChannel(channel.name, at, false);\n for (const member of channel.members)\n store.addMember(channel.name, member, at);\n }\n const rows = given.store ?? {};\n (rows.messages ?? []).forEach((row, i) =>\n store.insertMessage(seededMessage(row, at, `given.store.messages[${i}]`))\n );\n (rows.deliveries ?? []).forEach((row, i) =>\n store.insertDelivery(\n seededDelivery(row, at, `given.store.deliveries[${i}]`)\n )\n );\n for (const id of rows.appliedGates ?? []) store.markGateApplied(id, at);\n });\n}\n","import { queryAll } from '@dispatch-foo/core';\nimport type { SqliteDatabase } from '@dispatch-foo/core';\nimport type {\n Hello,\n Json,\n JsonObject,\n Observation,\n ObservedDelivery,\n ObservedMessage,\n RunnableVector,\n Step,\n StepResult,\n} from '@dispatch-foo/protocol-spec';\n\nimport { parseAddress, SYSTEM_ADDRESS } from '../address.js';\nimport { GATE_TYPES } from '../constants.js';\nimport { DeliveryEngine } from '../engine.js';\nimport type { Sender, SendOptions, SendResult } from '../engine.js';\nimport { validateSendInput } from '../envelope.js';\nimport type { Message, SendInput } from '../envelope.js';\nimport { MessagingError } from '../errors.js';\nimport { renderDigestLine, renderForAgent } from '../render.js';\nimport { openMessagesDb, SqliteMessageStore } from '../sqliteStore.js';\nimport { DELIVERY_STATES } from '../store.js';\nimport type { AgentStatus, Delivery, DeliveryState } from '../store.js';\nimport { createUlidFactory } from '../ulid.js';\nimport { PROTOCOL_VERSION } from '../version.js';\nimport { UnsupportedOp } from './errors.js';\nimport {\n asObject,\n bare,\n isObject,\n malformed,\n optionalText,\n text,\n texts,\n} from './fields.js';\nimport { applyWorld, ConformanceHost, worldFrom } from './host.js';\nimport { seededBytes } from './seed.js';\nimport { seedStore } from './seedStore.js';\n\nexport { UnsupportedOp } from './errors.js';\n\nexport interface OpContext {\n engine: DeliveryEngine;\n store: SqliteMessageStore;\n host: ConformanceHost;\n}\nexport type OpHandler = (\n step: Step,\n ctx: OpContext\n) => Promise<Json | undefined> | Json | undefined;\nexport interface AdapterOptions {\n // Ops a binding adds (the a2a adapter's `a2a.*`), tried before the core ops.\n ops?: Record<string, OpHandler>;\n // Gate types the engine and `validate` implement; default every GATE_TYPES entry.\n gateTypes?: readonly string[];\n}\n\n// The kit's CREATING_OPS, copied: the built adapter imports nothing from the\n// kit at runtime. `a2a.inbound` runs only through the a2a adapter's ops.\nconst CREATES: ReadonlySet<string> = new Set([\n 'send',\n 'reply',\n 'close',\n 'a2a.inbound',\n]);\nconst ROLE = /\\$(?:s|gate|notice)[0-9]+\\b/g;\nconst ORIGINS: readonly NonNullable<SendOptions['origin']>[] = [\n 'local',\n 'received',\n];\nconst AGENT_STATUSES: readonly AgentStatus[] = [\n 'pending',\n 'approved',\n 'revoked',\n];\n\n// What the reference declares: both profiles, every gate type the engine\n// raises and applies, and the forms renderForAgent and renderDigestLine write.\nexport const REFERENCE_HELLO: Hello = {\n dmp: 'hello',\n implementation: { name: 'dispatch-reference', version: PROTOCOL_VERSION },\n classes: ['envelope', 'host-core'],\n profiles: ['core', 'dispatch'],\n capabilities: ['implicit-members', 'muted-senders'],\n systemAddress: SYSTEM_ADDRESS,\n gateTypes: [...GATE_TYPES],\n render: {\n quotePrefix: 'โ”‚ ',\n header: '^\\\\[message from ',\n hostLines: [\n '^\\\\(in reply to ',\n '^choices: ',\n '^choice: ',\n '^refs: ',\n '^The sender is waiting\\\\. ',\n ],\n digestLead: '^๐Ÿ“ฌ(?: #[^ ]+ ยท)? [^ ]+ from [^ ]+(?: \\\\(external\\\\))?: ',\n },\n};\n\n// Replaces every string inside a JSON value, deep.\nfunction mapStrings(value: Json, f: (s: string) => string): Json {\n if (typeof value === 'string') return f(value);\n if (Array.isArray(value)) return value.map((v) => mapStrings(v, f));\n if (isObject(value))\n return Object.fromEntries(\n Object.entries(value).map(([k, v]) => [k, mapStrings(v, f)])\n );\n return value;\n}\n\n// Keeps the role symbols a step may name: `$sN` for the message step N\n// created, `$gateN`/`$noticeN` for the questions and notices the host raised\n// on its own (from the system address, made by no step, seeded by no row).\nclass RoleBinder {\n private readonly bound = new Map<string, string>();\n private readonly created = new Set<string>();\n private readonly seeded: Set<string>;\n\n constructor(\n private readonly db: SqliteDatabase,\n vector: RunnableVector\n ) {\n this.seeded = new Set(\n (vector.given.store?.messages ?? []).flatMap((r) =>\n typeof r['id'] === 'string' ? [r['id']] : []\n )\n );\n }\n\n bindStep(step: number, id: string): void {\n this.bound.set(`$s${step}`, id);\n this.created.add(id);\n }\n\n resolve(step: Step): Step {\n this.bindRaised();\n return mapStrings(step, (s) =>\n s.replace(ROLE, (token) => this.bound.get(token) ?? token)\n ) as Step;\n }\n\n private bindRaised(): void {\n let gates = 0;\n let notices = 0;\n const rows = queryAll<{ id: string; kind: string }>(\n this.db,\n 'SELECT id, kind FROM messages WHERE from_addr = ? ORDER BY rowid',\n [SYSTEM_ADDRESS]\n );\n for (const { id, kind } of rows) {\n if (this.created.has(id) || this.seeded.has(id)) continue;\n if (kind === 'question') this.bound.set(`$gate${++gates}`, id);\n else if (kind === 'notice') this.bound.set(`$notice${++notices}`, id);\n }\n }\n}\n\nfunction gateTypesOf(options: AdapterOptions): readonly string[] {\n return options.gateTypes ?? GATE_TYPES;\n}\n\nfunction senderOf(step: Step): Sender {\n const as = asObject(step['as'], 'as');\n const canDecide = as['canDecide'];\n if (typeof canDecide !== 'boolean')\n malformed('as.canDecide', 'expected a boolean');\n return { address: text(as, 'address', 'as'), canDecide };\n}\n\n// The step's input as the engine takes it. Only its outer shape is checked\n// here: vectors send malformed envelopes on purpose, and the engine judges.\nfunction inputOf(step: Step): SendInput {\n return asObject(step['input'], 'input') as unknown as SendInput;\n}\n\n// A send or validate step's `origin`: `received` for a message a binding\n// delivered, `local` (the default) otherwise.\nfunction originOf(step: Step): NonNullable<SendOptions['origin']> {\n const origin = step['origin'] ?? 'local';\n return (\n ORIGINS.find((o) => o === origin) ??\n malformed('origin', `expected one of ${ORIGINS.join(', ')}`)\n );\n}\n\nfunction sendResult(r: SendResult): Json {\n const result: JsonObject = {\n message: r.message.id,\n downgraded: r.downgraded,\n };\n if (r.replayed === true) result['replayed'] = true;\n return result;\n}\n\n// The `agentStatus` world change: a registered agent's status changes, which\n// needs the store, so the adapter applies it rather than applyWorld.\nfunction setAgentStatus(\n store: SqliteMessageStore,\n value: Json | undefined\n): void {\n const where = 'world.agentStatus';\n const change = asObject(value, where);\n const address = text(change, 'address', where);\n const status =\n AGENT_STATUSES.find((s) => s === change['status']) ??\n malformed(\n `${where}.status`,\n `expected one of ${AGENT_STATUSES.join(', ')}`\n );\n const agent =\n store.getAgent(address) ?? malformed(`${where}.address`, 'no such agent');\n store.putAgent({ ...agent, status });\n}\n\nfunction statesOf(step: Step): DeliveryState[] | undefined {\n if (step['states'] === undefined) return undefined;\n return texts(step['states'], 'states').map(\n (s) =>\n DELIVERY_STATES.find((d) => d === s) ??\n malformed('states', `unknown delivery state ${s}`)\n );\n}\n\n// The id a creating step's result names, if any.\nfunction createdId(result: Json | undefined): string | null {\n if (result === undefined || !isObject(result)) return null;\n const id = result['message'];\n return typeof id === 'string' ? id : null;\n}\n\n// Runs one step through the engine and returns its result in the kit's\n// shapes; an op this adapter does not implement is unsupported.\nasync function runStep(\n step: Step,\n ctx: OpContext,\n options: AdapterOptions,\n record: (rendered: string) => void\n): Promise<Json | undefined> {\n const custom = options.ops?.[step.op];\n if (custom !== undefined) return custom(step, ctx);\n const { engine, store, host } = ctx;\n switch (step.op) {\n case 'send':\n return sendResult(\n await engine.send(inputOf(step), senderOf(step), {\n origin: originOf(step),\n })\n );\n case 'reply':\n return sendResult(\n await engine.reply(\n text(step, 'message', 'reply'),\n inputOf(step),\n senderOf(step)\n )\n );\n case 'close':\n return {\n message: engine.close(\n text(step, 'question', 'close'),\n text(step, 'reason', 'close')\n ).id,\n };\n case 'markRead': {\n const recipient = text(step, 'recipient', 'markRead');\n const found = store\n .deliveries({ messageId: text(step, 'message', 'markRead') })\n .find((d) => d.recipient === recipient);\n if (found === undefined)\n throw new MessagingError(\n 'not-found',\n `no delivery to ${recipient}`,\n 'recipient'\n );\n return { state: engine.markRead(found.id).state };\n }\n case 'inbox':\n return {\n messages: engine\n .inbox(text(step, 'recipient', 'inbox'), statesOf(step))\n .map((x) => x.message.id),\n };\n case 'thread':\n return {\n messages: engine\n .thread(text(step, 'thread', 'thread'))\n .messages.map((m) => m.id),\n };\n case 'canRead':\n return {\n readable: engine.canRead(\n text(step, 'message', 'canRead'),\n senderOf(step)\n ),\n };\n case 'openBlocking':\n return { messages: engine.openBlocking().map((m) => m.id) };\n case 'join':\n engine.join(text(step, 'channel', 'join'), text(step, 'member', 'join'));\n return {};\n case 'leave':\n return {\n removed: engine.leave(\n text(step, 'channel', 'leave'),\n text(step, 'member', 'leave')\n ),\n };\n case 'deliverHeld': {\n const delivered = await engine.deliverHeld(\n bare(text(step, 'session', 'deliverHeld')),\n text(step, 'workItem', 'deliverHeld')\n );\n return {\n deliveries: delivered.map((d) => ({\n message: d.messageId,\n recipient: d.recipient,\n state: d.state,\n })),\n };\n }\n case 'recover': {\n const { retried, reverted, replayed, voided } = await engine.recover();\n return { retried, reverted, replayed, voided };\n }\n case 'parseAddress':\n return { ...parseAddress(text(step, 'input', 'parseAddress')) };\n case 'validate': {\n const as = senderOf(step);\n const target = optionalText(step, 'replyTarget', 'validate');\n validateSendInput(\n inputOf(step),\n as.address,\n as.canDecide,\n target === undefined ? null : store.getMessage(target),\n { gateTypes: new Set(gateTypesOf(options)), origin: originOf(step) }\n );\n return {};\n }\n case 'render': {\n const id = text(step, 'message', 'render');\n const message = store.getMessage(id);\n if (message === null)\n throw new MessagingError('not-found', `no message ${id}`, 'message');\n const external = step['external'] === true;\n const rendered =\n step['form'] === 'digest'\n ? renderDigestLine(message, external)\n : renderForAgent(message, external);\n record(rendered);\n return { text: rendered };\n }\n case 'world': {\n const change = asObject(step['change'], 'change');\n const keys = Object.keys(change);\n if (keys.length === 1 && keys[0] === 'agentStatus')\n setAgentStatus(store, change['agentStatus']);\n else applyWorld(host.world, change);\n return undefined;\n }\n default:\n throw new UnsupportedOp(`op ${step.op} is not implemented`);\n }\n}\n\nfunction observedMessage(m: Message): ObservedMessage {\n return {\n id: m.id,\n thread: m.thread,\n replyTo: m.replyTo,\n from: m.from,\n to: m.to,\n kind: m.kind,\n body: m.body,\n refs: m.refs.map(\n (r): JsonObject =>\n r.at === undefined\n ? { type: r.type, id: r.id }\n : { type: r.type, id: r.id, at: r.at }\n ),\n ...(m.data === undefined ? {} : { data: m.data }),\n urgent: m.urgent,\n blocking: m.blocking,\n ...(m.choices === undefined ? {} : { choices: m.choices }),\n ...(m.choice === undefined ? {} : { choice: m.choice }),\n wake: m.wake,\n createdAt: m.createdAt,\n };\n}\n\nfunction observedDelivery(d: Delivery): ObservedDelivery {\n return {\n id: d.id,\n message: d.messageId,\n recipient: d.recipient,\n session: d.runId === null ? null : `run:${d.runId}`,\n via: d.via,\n state: d.state,\n };\n}\n\n// Everything the kit compares after the last step: messages in creation\n// order, every delivery, the hook calls, applied gates and channels.\nfunction observe(\n id: string,\n db: SqliteDatabase,\n store: SqliteMessageStore,\n host: ConformanceHost,\n steps: StepResult[],\n render: { step: number; text: string }[]\n): Observation {\n const messages = queryAll<{ id: string }>(\n db,\n 'SELECT id FROM messages ORDER BY rowid'\n ).flatMap((row) => {\n const m = store.getMessage(row.id);\n return m === null ? [] : [observedMessage(m)];\n });\n const gateEffects = queryAll<{ question_id: string }>(\n db,\n 'SELECT question_id FROM gate_effects ORDER BY question_id'\n ).map((row) => row.question_id);\n return {\n dmp: 'observation',\n id,\n steps,\n messages,\n deliveries: store.deliveries({}).map(observedDelivery),\n calls: host.calls,\n gateEffects,\n voided: queryAll<{ answer_id: string }>(\n db,\n 'SELECT answer_id FROM voided_answers ORDER BY answer_id'\n ).map((row) => row.answer_id),\n channels: store\n .channels()\n .map((c) => ({ name: c.name, members: store.members(c.name) })),\n render,\n };\n}\n\n// Runs one vector against a fresh in-memory store and scripted host, and\n// returns what the kit compares. A MessagingError fails only its step.\nexport async function runVector(\n vector: RunnableVector,\n options: AdapterOptions = {}\n): Promise<Observation> {\n const db = openMessagesDb(':memory:');\n try {\n const store = new SqliteMessageStore(db);\n const host = new ConformanceHost(worldFrom(vector.given));\n seedStore(store, vector.given, host.world);\n const engine = new DeliveryEngine({\n store,\n host,\n limits: vector.given.limits,\n newUlid: createUlidFactory(seededBytes(vector.given.seed ?? 1)),\n gateTypes: gateTypesOf(options),\n });\n engine.subscribe((e) => {\n if (e.type === 'message')\n host.calls.push({ hook: 'published', message: e.message.id });\n });\n const roles = new RoleBinder(db, vector);\n const steps: StepResult[] = [];\n const render: { step: number; text: string }[] = [];\n for (const [i, raw] of vector.when.entries()) {\n const step = roles.resolve(raw);\n try {\n const result = await runStep(\n step,\n { engine, store, host },\n options,\n (rendered) => render.push({ step: i + 1, text: rendered })\n );\n steps.push(result === undefined ? { ok: true } : { ok: true, result });\n const created = createdId(result);\n if (CREATES.has(step.op) && created !== null)\n roles.bindStep(i + 1, created);\n } catch (err) {\n if (!(err instanceof MessagingError)) throw err;\n steps.push({\n ok: false,\n error:\n err.field === undefined\n ? { code: err.code }\n : { code: err.code, field: err.field },\n });\n }\n }\n return observe(vector.id, db, store, host, steps, render);\n } finally {\n db.close();\n }\n}\n","import type {\n Hello,\n Observation,\n RunnableVector,\n} from '@dispatch-foo/protocol-spec';\n\nimport { UnsupportedOp } from './errors.js';\n\nconst SEPARATORS = /[\\u2028\\u2029]/g;\n\n// Writes one JSON line with U+2028 and U+2029 escaped (the same JSON value),\n// so a reader that breaks lines at them still sees whole lines.\nfunction out(msg: unknown): void {\n const text = JSON.stringify(msg).replace(\n SEPARATORS,\n (c) => `\\\\u${c.charCodeAt(0).toString(16)}`\n );\n process.stdout.write(`${text}\\n`);\n}\n\n// Serves an adapter over stdio: one JSON line each way and nothing else on\n// stdout; an error other than an unsupported op exits 1, failing the vector.\nexport function serveStdio(\n hello: Hello,\n run: (vector: RunnableVector) => Promise<Observation>\n): void {\n async function handle(line: string): Promise<void> {\n const msg = JSON.parse(line) as { dmp?: string; vector?: RunnableVector };\n if (msg.dmp === 'hello') {\n out(hello);\n return;\n }\n if (msg.dmp === 'bye') process.exit(0);\n if (msg.dmp !== 'run' || msg.vector === undefined) return;\n try {\n out(await run(msg.vector));\n } catch (err) {\n if (!(err instanceof UnsupportedOp)) throw err;\n out({ dmp: 'unsupported', id: msg.vector.id, reason: err.message });\n }\n }\n\n // Lines are handled one at a time, in order, so each answer follows its run.\n let queue: Promise<void> = Promise.resolve();\n function enqueue(line: string): void {\n queue = queue\n .then(() => handle(line))\n .catch((err: unknown) => {\n const why =\n err instanceof Error ? (err.stack ?? err.message) : String(err);\n process.stderr.write(`${why}\\n`, () => process.exit(1));\n });\n }\n\n // Splits stdin at LF alone (a CR before it is dropped), so U+2028 and U+2029\n // inside a JSON string never end a line.\n let buffered = '';\n process.stdin.setEncoding('utf8');\n process.stdin.on('data', (chunk: string) => {\n const lines = (buffered + chunk).split('\\n');\n buffered = lines.pop() ?? '';\n for (const line of lines)\n enqueue(line.endsWith('\\r') ? line.slice(0, -1) : line);\n });\n process.stdin.on('end', () => {\n if (buffered !== '') enqueue(buffered);\n });\n}\n"],"mappings":";;;;;AAEA,IAAa,gBAAb,cAAmC,MAAM;CACvC,YAAY,SAAiB;AAC3B,QAAM,QAAQ;AACd,OAAK,OAAO;;;;;;ACDhB,SAAgB,UAAU,OAAe,KAAoB;AAC3D,OAAM,IAAI,MAAM,0BAA0B,MAAM,IAAI,MAAM;;AAG5D,SAAgB,SAAS,OAA8C;AACrE,QAAO,UAAU,QAAQ,OAAO,UAAU,YAAY,CAAC,MAAM,QAAQ,MAAM;;AAG7E,SAAgB,SAAS,OAAyB,OAA2B;AAC3E,QAAO,SAAS,MAAM,GAAG,QAAQ,UAAU,OAAO,qBAAqB;;AAGzE,SAAgB,KAAK,KAAiB,KAAa,OAAuB;CACxE,MAAM,QAAQ,IAAI;AAClB,QAAO,OAAO,UAAU,WACpB,QACA,UAAU,GAAG,MAAM,GAAG,OAAO,oBAAoB;;AAGvD,SAAgB,aACd,KACA,KACA,OACoB;AACpB,QAAO,IAAI,SAAS,SAAY,SAAY,KAAK,KAAK,KAAK,MAAM;;AAGnE,SAAgB,MAAM,OAAyB,OAAyB;AACtE,KAAI,CAAC,MAAM,QAAQ,MAAM,CAAE,QAAO,UAAU,OAAO,kBAAkB;AACrE,QAAO,MAAM,KAAK,GAAG,MACnB,OAAO,MAAM,WAAW,IAAI,UAAU,GAAG,MAAM,GAAG,EAAE,IAAI,oBAAoB,CAC7E;;AAIH,SAAgB,KAAK,SAAyB;AAC5C,QAAO,QAAQ,WAAW,OAAO,GAAG,QAAQ,MAAM,EAAc,GAAG;;;;;ACjBrE,MAAM,gBAAgB;AACtB,MAAMA,UAAmC;CAAC;CAAS;CAAO;CAAO;AAmBjE,SAAgB,UAAU,OAAqB;CAC7C,MAAMC,QAAe;EACnB,SAAS,KAAK,MAAM,MAAM,SAAS,cAAc;EACjD,0BAAU,IAAI,KAAK;EACnB,0BAAU,IAAI,KAAK;EACnB,SAAS,IAAI,KAAK,MAAM,eAAe,EAAE,EAAE,IAAI,KAAK,CAAC;EACrD,UAAU,IAAI,IAAI,OAAO,QAAQ,MAAM,YAAY,EAAE,CAAC,CAAC;EACvD,OAAO,MAAM,SAAS;EACtB,SAAS,IAAI,IAAI,OAAO,QAAQ,MAAM,WAAW,EAAE,CAAC,CAAC;EACrD,aAAa,IAAI,IACf,OAAO,QAAQ,MAAM,eAAe,EAAE,CAAC,CAAC,KACrC,CAAC,QAAQ,OAA8B,CACtC,QACA,EAAE,KAAK;GAAE,IAAI;GAAM,OAAO,KAAK,EAAE,QAAQ;GAAE,GAAG,EAC/C,CACF,CACF;EACD,UAAU,IAAI,KAAK,MAAM,YAAY,EAAE,EAAE,IAAI,KAAK,CAAC;EACnD,gBAAgB,MAAM,mBAAmB;EACzC,UAAU,IAAI,IAAI,OAAO,QAAQ,MAAM,YAAY,EAAE,CAAC,CAAC;EACxD;AACD,MAAK,MAAM,QAAQ,MAAM,aAAa,EAAE,EAAE;AACxC,OAAK,MAAM,KAAK,KAAK,YAAY,EAAE,CAAE,OAAM,SAAS,IAAI,KAAK,EAAE,EAAE,KAAK,GAAG;AACzE,MAAI,KAAK,gBAAgB,QAAW;AAClC,SAAM,SAAS,IAAI,KAAK,IAAI,KAAK,KAAK,YAAY,CAAC;AACnD,SAAM,SAAS,IAAI,KAAK,KAAK,YAAY,EAAE,KAAK,GAAG;;;AAGvD,QAAO;;AAGT,SAAS,SAAS,OAAyB,OAA6B;AAEtE,QADc,QAAQ,MAAM,MAAM,MAAM,MAAM,IAC9B,UAAU,OAAO,mBAAmB,QAAQ,KAAK,KAAK,GAAG;;AAG3E,SAAS,aAAa,OAAyB,OAA2B;CACxE,MAAM,IAAI,SAAS,OAAO,MAAM;AAChC,KAAI,EAAE,UAAU,KACd,QAAO;EAAE,IAAI;EAAM,OAAO,KAAK,KAAK,GAAG,WAAW,MAAM,CAAC;EAAE;AAC7D,KAAI,EAAE,UAAU,MAAO,QAAO;EAAE,IAAI;EAAO,QAAQ,KAAK,GAAG,UAAU,MAAM;EAAE;AAC7E,QAAO,UAAU,GAAG,MAAM,MAAM,qBAAqB;;AAKvD,SAAgB,WAAW,OAAc,QAA0B;CACjE,MAAM,OAAO,OAAO,KAAK,OAAO;CAChC,MAAM,MAAM,KAAK;AACjB,KAAI,KAAK,WAAW,KAAK,QAAQ,OAC/B,OAAM,IAAI,cACR,6CAA6C,KAAK,SACnD;CACH,MAAM,QAAQ,OAAO;CACrB,MAAM,QAAQ,SAAS;AACvB,SAAQ,KAAR;EACE,KAAK,gBAAgB;GACnB,MAAM,IAAI,SAAS,OAAO,MAAM;GAChC,MAAM,OAAO,KAAK,GAAG,YAAY,MAAM;GACvC,MAAM,MAAM,KAAK,KAAK,GAAG,WAAW,MAAM,CAAC;AAC3C,SAAM,SAAS,IAAI,MAAM,IAAI;AAC7B,SAAM,SAAS,IAAI,KAAK,KAAK;AAC7B;;EAEF,KAAK;AACH,SAAM,SAAS,OAAO,KAAK,SAAS,OAAO,MAAM,EAAE,YAAY,MAAM,CAAC;AACtE;EACF,KAAK,UAAU;GACb,MAAM,IAAI,SAAS,OAAO,MAAM;AAChC,SAAM,QAAQ,IACZ,KAAK,GAAG,UAAU,MAAM,EACxB,SAAS,EAAE,WAAW,GAAG,MAAM,SAAS,CACzC;AACD;;EAEF,KAAK,cAAc;GACjB,MAAM,IAAI,SAAS,OAAO,MAAM;AAChC,SAAM,YAAY,IAChB,KAAK,GAAG,UAAU,MAAM,EACxB,aAAa,EAAE,WAAW,GAAG,MAAM,SAAS,CAC7C;AACD;;EAEF,KAAK;AACH,SAAM,WAAW,IAAI,IAAI,MAAM,OAAO,MAAM,CAAC,IAAI,KAAK,CAAC;AACvD;EACF,KAAK;AACH,OAAI,OAAO,UAAU,UAAW,WAAU,OAAO,qBAAqB;AACtE,SAAM,iBAAiB;AACvB;EACF,KAAK;AACH,OAAI,OAAO,UAAU,YAAY,CAAC,OAAO,SAAS,MAAM,CACtD,WAAU,OAAO,oBAAoB;AACvC,SAAM,WAAW;AACjB;EACF,QACE,OAAM,IAAI,cAAc,gBAAgB,IAAI,qBAAqB;;;AAMvE,IAAa,kBAAb,MAAsD;CACpD,AAAS,QAAsB,EAAE;CACjC,YAAY,AAASA,OAAc;EAAd;;CAErB,WAAW,QAA+B;AACxC,SAAO,KAAK,MAAM,SAAS,IAAI,OAAO,IAAI;;CAE5C,UAAU,OAAwB;AAChC,SACE,KAAK,MAAM,QAAQ,IAAI,MAAM,IAC7B,CAAC,GAAG,KAAK,MAAM,SAAS,QAAQ,CAAC,CAAC,SAAS,MAAM;;CAGrD,UAAU,OAA8B;AACtC,SAAO,KAAK,MAAM,SAAS,IAAI,MAAM,IAAI;;CAE3C,KAAK,OAAe,WAAmB,SAAiC;AACtE,OAAK,MAAM,KAAK;GACd,MAAM;GACN,SAAS,OAAO;GAChB,SAAS,QAAQ;GAClB,CAAC;AACF,SAAO,KAAK,OAAO,OAAO,cAAc;;CAE1C,OAAO,OAAe,SAAiB,SAAiC;AACtE,OAAK,MAAM,KAAK;GACd,MAAM;GACN,SAAS,OAAO;GAChB,SAAS,QAAQ;GAClB,CAAC;AACF,SAAO,KAAK,OAAO,OAAO,gBAAgB;;CAE5C,YAAY,OAAgB,SAAwB;AAClD,OAAK,MAAM,KAAK;GAAE,MAAM;GAAe;GAAO,SAAS,QAAQ;GAAI,CAAC;;CAEtE,KAAK,QAAiB,SAAuC;AAC3D,OAAK,MAAM,KAAK;GAAE,MAAM;GAAQ;GAAQ,SAAS,QAAQ;GAAI,CAAC;AAC9D,SAAO,QAAQ,QACb,KAAK,MAAM,YAAY,IAAI,OAAO,IAAI;GAAE,IAAI;GAAM,OAAO;GAAY,CACtE;;CAEH,OAAO,SAAsC;AAC3C,OAAK,MAAM,KAAK;GACd,MAAM;GACN,QAAQ,QAAQ;GAChB,SAAS,QAAQ,QAAQ;GAC1B,CAAC;AACF,SAAO,KAAK,MAAM,QAAQ,IAAI,QAAQ,OAAO,IAAI;;CAEnD,QAAiB;AACf,SAAO,KAAK,MAAM;;CAEpB,gBAAgB,SAA4B;AAC1C,SAAO,KAAK,MAAM,SAAS,IAAI,QAAQ,IAAI,EAAE;;CAE/C,WAAW,UAAmB,QAAgC;AAC5D,OAAK,MAAM,KAAK;GACd,MAAM;GACN,UAAU,SAAS;GACnB,QAAQ,OAAO;GAChB,CAAC;AACF,MAAI,KAAK,MAAM,eACb,QAAO,QAAQ,uBAAO,IAAI,MAAM,gBAAgB,CAAC;EAGnD,MAAM,OAAO,OAAO,SAAS;AAC7B,MAAI,MAAM,SAAS,UAAU,OAAO,WAAW,UAC7C,MAAK,MAAM,KAAK;GACd,MAAM;GACN,QAAQ,KAAK;GACb,SAAS,KAAK;GACf,CAAC;AACJ,SAAO,QAAQ,SAAS;;CAE1B,MAAY;AACV,SAAO,IAAI,KAAK,KAAK,MAAM,QAAQ;;CAGrC,SAAS,SAAuC;AAC9C,SAAO,KAAK,MAAM,SAAS,IAAI,QAAQ,IAAI;;CAG7C,cACE,QACA,SACA,cACA,SACmB;AACnB,OAAK,MAAM,KAAK;GACd,MAAM;GACN,WAAW,OAAO;GAClB,SAAS,QAAQ;GAClB,CAAC;AACF,SAAO;;CAIT,AAAQ,OAAO,OAAe,KAA4B;AACxD,SAAO,KAAK,MAAM,SAAS,IAAI,MAAM,GACjC,QAAQ,OAAO,IAAI,MAAM,IAAI,CAAC,GAC9B,QAAQ,SAAS;;;;;;ACnPzB,SAAgB,YAAY,MAAyC;CACnE,IAAI,QAAQ,SAAS;AACrB,SAAQ,MAAM;EACZ,MAAMC,QAAM,IAAI,WAAW,EAAE;AAC7B,OAAK,IAAI,IAAI,GAAG,IAAI,GAAG,KAAK;AAC1B,WAAS,QAAQ,eAAgB;GACjC,IAAI,IAAI;AACR,OAAI,KAAK,KAAK,IAAK,MAAM,IAAK,IAAI,EAAE;AACpC,QAAK,IAAI,KAAK,KAAK,IAAK,MAAM,GAAI,IAAI,GAAG;AACzC,SAAI,MAAM,IAAK,MAAM,MAAO;;AAE9B,SAAOA;;;;;;ACEX,MAAMC,OAA+B,CAAC,UAAU,UAAU;AAE1D,SAAS,aACP,KACA,KACA,OACe;AACf,QAAO,IAAI,SAAS,OAAO,OAAQ,aAAa,KAAK,KAAK,MAAM,IAAI;;AAGtE,SAAS,OAAO,OAAyB,OAAsB;AAC7D,KAAI,UAAU,OAAW,QAAO,EAAE;AAClC,KAAI,CAAC,MAAM,QAAQ,MAAM,CAAE,QAAO,UAAU,OAAO,kBAAkB;AACrE,QAAO,MAAM,KAAK,KAAK,MAAM;EAC3B,MAAM,KAAK,GAAG,MAAM,GAAG,EAAE;EACzB,MAAM,IAAI,SAAS,KAAK,GAAG;EAC3B,MAAMC,MAAW;GACf,MAAM,KAAK,GAAG,QAAQ,GAAG;GACzB,IAAI,KAAK,GAAG,MAAM,GAAG;GACtB;EACD,MAAM,SAAS,aAAa,GAAG,MAAM,GAAG;AACxC,MAAI,WAAW,OAAW,KAAI,KAAK;AACnC,SAAO;GACP;;AAKJ,SAAS,cAAc,KAAiB,IAAY,OAAwB;CAC1E,MAAM,KAAK,KAAK,KAAK,MAAM,MAAM;CACjC,MAAMC,UAAmB;EACvB;EACA,QAAQ,aAAa,KAAK,UAAU,MAAM,IAAI;EAC9C,SAAS,aAAa,KAAK,WAAW,MAAM;EAC5C,MAAM,KAAK,KAAK,QAAQ,MAAM;EAC9B,IAAI,MAAM,IAAI,OAAO,GAAG,MAAM,KAAK;EACnC,MAAM,KAAK,KAAK,QAAQ,MAAM;EAC9B,MAAM,KAAK,KAAK,QAAQ,MAAM;EAC9B,MAAM,OAAO,IAAI,SAAS,GAAG,MAAM,OAAO;EAC1C,QAAQ,IAAI,cAAc;EAC1B,UAAU,IAAI,gBAAgB;EAC9B,MAAM,IAAI,YAAY,YAAY,YAAY;EAC9C,WAAW,aAAa,KAAK,aAAa,MAAM,IAAI;EACrD;CACD,MAAM,UAAU,aAAa,KAAK,WAAW,MAAM;AACnD,KAAI,YAAY,OAAW,SAAQ,UAAU;CAC7C,MAAM,OAAO,IAAI;AACjB,KAAI,SAAS,OAAW,SAAQ,OAAO;AACvC,KAAI,IAAI,eAAe,OACrB,SAAQ,UAAU,MAAM,IAAI,YAAY,GAAG,MAAM,UAAU;CAC7D,MAAM,SAAS,aAAa,KAAK,UAAU,MAAM;AACjD,KAAI,WAAW,OAAW,SAAQ,SAAS;AAC3C,QAAO;;AAGT,SAAS,eAAe,KAAiB,IAAY,OAAyB;CAC5E,MAAM,UAAU,aAAa,KAAK,WAAW,MAAM;CACnD,MAAM,MAAM,IAAI,WAAW,SAAY,WAAW,IAAI;AACtD,QAAO;EACL,IAAI,KAAK,KAAK,MAAM,MAAM;EAC1B,WAAW,KAAK,KAAK,WAAW,MAAM;EACtC,WAAW,KAAK,KAAK,aAAa,MAAM;EACxC,OAAO,YAAY,OAAO,OAAO,KAAK,QAAQ;EAC9C,KACE,KAAK,MAAM,MAAM,MAAM,IAAI,IAC3B,UAAU,GAAG,MAAM,OAAO,mBAAmB,KAAK,KAAK,KAAK,GAAG;EACjE,OACE,gBAAgB,MAAM,MAAM,MAAM,IAAI,SAAS,IAC/C,UACE,GAAG,MAAM,SACT,mBAAmB,gBAAgB,KAAK,KAAK,GAC9C;EACH,WAAW;EACZ;;AAKH,SAAgB,UACd,OACA,OACA,OACM;CACN,MAAM,KAAK,IAAI,KAAK,MAAM,QAAQ,CAAC,aAAa;AAChD,OAAM,kBAAkB;AACtB,OAAK,MAAM,SAAS,MAAM,UAAU,EAAE,CACpC,OAAM,SAAS;GACb,SAAS,MAAM;GACf,aAAa,MAAM;GACnB,QAAQ;GACR,WAAW,QAAQ,MAAM;GACzB,QAAQ,MAAM;GACd,OAAO,MAAM,UAAU;GACvB,YAAY,MAAM;GAClB,WAAW;GACZ,CAAC;AAEJ,OAAK,MAAM,WAAW,MAAM,YAAY,EAAE,EAAE;AAC1C,SAAM,cAAc,QAAQ,MAAM,IAAI,MAAM;AAC5C,QAAK,MAAM,UAAU,QAAQ,QAC3B,OAAM,UAAU,QAAQ,MAAM,QAAQ,GAAG;;EAE7C,MAAM,OAAO,MAAM,SAAS,EAAE;AAC9B,GAAC,KAAK,YAAY,EAAE,EAAE,SAAS,KAAK,MAClC,MAAM,cAAc,cAAc,KAAK,IAAI,wBAAwB,EAAE,GAAG,CAAC,CAC1E;AACD,GAAC,KAAK,cAAc,EAAE,EAAE,SAAS,KAAK,MACpC,MAAM,eACJ,eAAe,KAAK,IAAI,0BAA0B,EAAE,GAAG,CACxD,CACF;AACD,OAAK,MAAM,MAAM,KAAK,gBAAgB,EAAE,CAAE,OAAM,gBAAgB,IAAI,GAAG;GACvE;;;;;AClEJ,MAAMC,UAA+B,IAAI,IAAI;CAC3C;CACA;CACA;CACA;CACD,CAAC;AACF,MAAM,OAAO;AACb,MAAMC,UAAyD,CAC7D,SACA,WACD;AACD,MAAMC,iBAAyC;CAC7C;CACA;CACA;CACD;AAID,MAAaC,kBAAyB;CACpC,KAAK;CACL,gBAAgB;EAAE,MAAM;EAAsB,SAAS;EAAkB;CACzE,SAAS,CAAC,YAAY,YAAY;CAClC,UAAU,CAAC,QAAQ,WAAW;CAC9B,cAAc,CAAC,oBAAoB,gBAAgB;CACnD,eAAe;CACf,WAAW,CAAC,GAAG,WAAW;CAC1B,QAAQ;EACN,aAAa;EACb,QAAQ;EACR,WAAW;GACT;GACA;GACA;GACA;GACA;GACD;EACD,YAAY;EACb;CACF;AAGD,SAAS,WAAW,OAAa,GAAgC;AAC/D,KAAI,OAAO,UAAU,SAAU,QAAO,EAAE,MAAM;AAC9C,KAAI,MAAM,QAAQ,MAAM,CAAE,QAAO,MAAM,KAAK,MAAM,WAAW,GAAG,EAAE,CAAC;AACnE,KAAI,SAAS,MAAM,CACjB,QAAO,OAAO,YACZ,OAAO,QAAQ,MAAM,CAAC,KAAK,CAAC,GAAG,OAAO,CAAC,GAAG,WAAW,GAAG,EAAE,CAAC,CAAC,CAC7D;AACH,QAAO;;AAMT,IAAM,aAAN,MAAiB;CACf,AAAiB,wBAAQ,IAAI,KAAqB;CAClD,AAAiB,0BAAU,IAAI,KAAa;CAC5C,AAAiB;CAEjB,YACE,AAAiBC,IACjB,QACA;EAFiB;AAGjB,OAAK,SAAS,IAAI,KACf,OAAO,MAAM,OAAO,YAAY,EAAE,EAAE,SAAS,MAC5C,OAAO,EAAE,UAAU,WAAW,CAAC,EAAE,MAAM,GAAG,EAAE,CAC7C,CACF;;CAGH,SAAS,MAAc,IAAkB;AACvC,OAAK,MAAM,IAAI,KAAK,QAAQ,GAAG;AAC/B,OAAK,QAAQ,IAAI,GAAG;;CAGtB,QAAQ,MAAkB;AACxB,OAAK,YAAY;AACjB,SAAO,WAAW,OAAO,MACvB,EAAE,QAAQ,OAAO,UAAU,KAAK,MAAM,IAAI,MAAM,IAAI,MAAM,CAC3D;;CAGH,AAAQ,aAAmB;EACzB,IAAI,QAAQ;EACZ,IAAI,UAAU;EACd,MAAM,OAAO,SACX,KAAK,IACL,oEACA,CAAC,eAAe,CACjB;AACD,OAAK,MAAM,EAAE,IAAI,UAAU,MAAM;AAC/B,OAAI,KAAK,QAAQ,IAAI,GAAG,IAAI,KAAK,OAAO,IAAI,GAAG,CAAE;AACjD,OAAI,SAAS,WAAY,MAAK,MAAM,IAAI,QAAQ,EAAE,SAAS,GAAG;YACrD,SAAS,SAAU,MAAK,MAAM,IAAI,UAAU,EAAE,WAAW,GAAG;;;;AAK3E,SAAS,YAAY,SAA4C;AAC/D,QAAO,QAAQ,aAAa;;AAG9B,SAAS,SAAS,MAAoB;CACpC,MAAM,KAAK,SAAS,KAAK,OAAO,KAAK;CACrC,MAAM,YAAY,GAAG;AACrB,KAAI,OAAO,cAAc,UACvB,WAAU,gBAAgB,qBAAqB;AACjD,QAAO;EAAE,SAAS,KAAK,IAAI,WAAW,KAAK;EAAE;EAAW;;AAK1D,SAAS,QAAQ,MAAuB;AACtC,QAAO,SAAS,KAAK,UAAU,QAAQ;;AAKzC,SAAS,SAAS,MAAgD;CAChE,MAAM,SAAS,KAAK,aAAa;AACjC,QACE,QAAQ,MAAM,MAAM,MAAM,OAAO,IACjC,UAAU,UAAU,mBAAmB,QAAQ,KAAK,KAAK,GAAG;;AAIhE,SAAS,WAAW,GAAqB;CACvC,MAAMC,SAAqB;EACzB,SAAS,EAAE,QAAQ;EACnB,YAAY,EAAE;EACf;AACD,KAAI,EAAE,aAAa,KAAM,QAAO,cAAc;AAC9C,QAAO;;AAKT,SAAS,eACP,OACA,OACM;CACN,MAAM,QAAQ;CACd,MAAM,SAAS,SAAS,OAAO,MAAM;CACrC,MAAM,UAAU,KAAK,QAAQ,WAAW,MAAM;CAC9C,MAAM,SACJ,eAAe,MAAM,MAAM,MAAM,OAAO,UAAU,IAClD,UACE,GAAG,MAAM,UACT,mBAAmB,eAAe,KAAK,KAAK,GAC7C;CACH,MAAM,QACJ,MAAM,SAAS,QAAQ,IAAI,UAAU,GAAG,MAAM,WAAW,gBAAgB;AAC3E,OAAM,SAAS;EAAE,GAAG;EAAO;EAAQ,CAAC;;AAGtC,SAAS,SAAS,MAAyC;AACzD,KAAI,KAAK,cAAc,OAAW,QAAO;AACzC,QAAO,MAAM,KAAK,WAAW,SAAS,CAAC,KACpC,MACC,gBAAgB,MAAM,MAAM,MAAM,EAAE,IACpC,UAAU,UAAU,0BAA0B,IAAI,CACrD;;AAIH,SAAS,UAAU,QAAyC;AAC1D,KAAI,WAAW,UAAa,CAAC,SAAS,OAAO,CAAE,QAAO;CACtD,MAAM,KAAK,OAAO;AAClB,QAAO,OAAO,OAAO,WAAW,KAAK;;AAKvC,eAAe,QACb,MACA,KACA,SACA,QAC2B;CAC3B,MAAM,SAAS,QAAQ,MAAM,KAAK;AAClC,KAAI,WAAW,OAAW,QAAO,OAAO,MAAM,IAAI;CAClD,MAAM,EAAE,QAAQ,OAAO,SAAS;AAChC,SAAQ,KAAK,IAAb;EACE,KAAK,OACH,QAAO,WACL,MAAM,OAAO,KAAK,QAAQ,KAAK,EAAE,SAAS,KAAK,EAAE,EAC/C,QAAQ,SAAS,KAAK,EACvB,CAAC,CACH;EACH,KAAK,QACH,QAAO,WACL,MAAM,OAAO,MACX,KAAK,MAAM,WAAW,QAAQ,EAC9B,QAAQ,KAAK,EACb,SAAS,KAAK,CACf,CACF;EACH,KAAK,QACH,QAAO,EACL,SAAS,OAAO,MACd,KAAK,MAAM,YAAY,QAAQ,EAC/B,KAAK,MAAM,UAAU,QAAQ,CAC9B,CAAC,IACH;EACH,KAAK,YAAY;GACf,MAAM,YAAY,KAAK,MAAM,aAAa,WAAW;GACrD,MAAM,QAAQ,MACX,WAAW,EAAE,WAAW,KAAK,MAAM,WAAW,WAAW,EAAE,CAAC,CAC5D,MAAM,MAAM,EAAE,cAAc,UAAU;AACzC,OAAI,UAAU,OACZ,OAAM,IAAI,eACR,aACA,kBAAkB,aAClB,YACD;AACH,UAAO,EAAE,OAAO,OAAO,SAAS,MAAM,GAAG,CAAC,OAAO;;EAEnD,KAAK,QACH,QAAO,EACL,UAAU,OACP,MAAM,KAAK,MAAM,aAAa,QAAQ,EAAE,SAAS,KAAK,CAAC,CACvD,KAAK,MAAM,EAAE,QAAQ,GAAG,EAC5B;EACH,KAAK,SACH,QAAO,EACL,UAAU,OACP,OAAO,KAAK,MAAM,UAAU,SAAS,CAAC,CACtC,SAAS,KAAK,MAAM,EAAE,GAAG,EAC7B;EACH,KAAK,UACH,QAAO,EACL,UAAU,OAAO,QACf,KAAK,MAAM,WAAW,UAAU,EAChC,SAAS,KAAK,CACf,EACF;EACH,KAAK,eACH,QAAO,EAAE,UAAU,OAAO,cAAc,CAAC,KAAK,MAAM,EAAE,GAAG,EAAE;EAC7D,KAAK;AACH,UAAO,KAAK,KAAK,MAAM,WAAW,OAAO,EAAE,KAAK,MAAM,UAAU,OAAO,CAAC;AACxE,UAAO,EAAE;EACX,KAAK,QACH,QAAO,EACL,SAAS,OAAO,MACd,KAAK,MAAM,WAAW,QAAQ,EAC9B,KAAK,MAAM,UAAU,QAAQ,CAC9B,EACF;EACH,KAAK,cAKH,QAAO,EACL,aALgB,MAAM,OAAO,YAC7B,KAAK,KAAK,MAAM,WAAW,cAAc,CAAC,EAC1C,KAAK,MAAM,YAAY,cAAc,CACtC,EAEuB,KAAK,OAAO;GAChC,SAAS,EAAE;GACX,WAAW,EAAE;GACb,OAAO,EAAE;GACV,EAAE,EACJ;EAEH,KAAK,WAAW;GACd,MAAM,EAAE,SAAS,UAAU,UAAU,WAAW,MAAM,OAAO,SAAS;AACtE,UAAO;IAAE;IAAS;IAAU;IAAU;IAAQ;;EAEhD,KAAK,eACH,QAAO,EAAE,GAAG,aAAa,KAAK,MAAM,SAAS,eAAe,CAAC,EAAE;EACjE,KAAK,YAAY;GACf,MAAM,KAAK,SAAS,KAAK;GACzB,MAAM,SAAS,aAAa,MAAM,eAAe,WAAW;AAC5D,qBACE,QAAQ,KAAK,EACb,GAAG,SACH,GAAG,WACH,WAAW,SAAY,OAAO,MAAM,WAAW,OAAO,EACtD;IAAE,WAAW,IAAI,IAAI,YAAY,QAAQ,CAAC;IAAE,QAAQ,SAAS,KAAK;IAAE,CACrE;AACD,UAAO,EAAE;;EAEX,KAAK,UAAU;GACb,MAAM,KAAK,KAAK,MAAM,WAAW,SAAS;GAC1C,MAAM,UAAU,MAAM,WAAW,GAAG;AACpC,OAAI,YAAY,KACd,OAAM,IAAI,eAAe,aAAa,cAAc,MAAM,UAAU;GACtE,MAAM,WAAW,KAAK,gBAAgB;GACtC,MAAM,WACJ,KAAK,YAAY,WACb,iBAAiB,SAAS,SAAS,GACnC,eAAe,SAAS,SAAS;AACvC,UAAO,SAAS;AAChB,UAAO,EAAE,MAAM,UAAU;;EAE3B,KAAK,SAAS;GACZ,MAAM,SAAS,SAAS,KAAK,WAAW,SAAS;GACjD,MAAM,OAAO,OAAO,KAAK,OAAO;AAChC,OAAI,KAAK,WAAW,KAAK,KAAK,OAAO,cACnC,gBAAe,OAAO,OAAO,eAAe;OACzC,YAAW,KAAK,OAAO,OAAO;AACnC;;EAEF,QACE,OAAM,IAAI,cAAc,MAAM,KAAK,GAAG,qBAAqB;;;AAIjE,SAAS,gBAAgB,GAA6B;AACpD,QAAO;EACL,IAAI,EAAE;EACN,QAAQ,EAAE;EACV,SAAS,EAAE;EACX,MAAM,EAAE;EACR,IAAI,EAAE;EACN,MAAM,EAAE;EACR,MAAM,EAAE;EACR,MAAM,EAAE,KAAK,KACV,MACC,EAAE,OAAO,SACL;GAAE,MAAM,EAAE;GAAM,IAAI,EAAE;GAAI,GAC1B;GAAE,MAAM,EAAE;GAAM,IAAI,EAAE;GAAI,IAAI,EAAE;GAAI,CAC3C;EACD,GAAI,EAAE,SAAS,SAAY,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM;EAChD,QAAQ,EAAE;EACV,UAAU,EAAE;EACZ,GAAI,EAAE,YAAY,SAAY,EAAE,GAAG,EAAE,SAAS,EAAE,SAAS;EACzD,GAAI,EAAE,WAAW,SAAY,EAAE,GAAG,EAAE,QAAQ,EAAE,QAAQ;EACtD,MAAM,EAAE;EACR,WAAW,EAAE;EACd;;AAGH,SAAS,iBAAiB,GAA+B;AACvD,QAAO;EACL,IAAI,EAAE;EACN,SAAS,EAAE;EACX,WAAW,EAAE;EACb,SAAS,EAAE,UAAU,OAAO,OAAO,OAAO,EAAE;EAC5C,KAAK,EAAE;EACP,OAAO,EAAE;EACV;;AAKH,SAAS,QACP,IACA,IACA,OACA,MACA,OACA,QACa;CACb,MAAM,WAAW,SACf,IACA,yCACD,CAAC,SAAS,QAAQ;EACjB,MAAM,IAAI,MAAM,WAAW,IAAI,GAAG;AAClC,SAAO,MAAM,OAAO,EAAE,GAAG,CAAC,gBAAgB,EAAE,CAAC;GAC7C;CACF,MAAM,cAAc,SAClB,IACA,4DACD,CAAC,KAAK,QAAQ,IAAI,YAAY;AAC/B,QAAO;EACL,KAAK;EACL;EACA;EACA;EACA,YAAY,MAAM,WAAW,EAAE,CAAC,CAAC,IAAI,iBAAiB;EACtD,OAAO,KAAK;EACZ;EACA,QAAQ,SACN,IACA,0DACD,CAAC,KAAK,QAAQ,IAAI,UAAU;EAC7B,UAAU,MACP,UAAU,CACV,KAAK,OAAO;GAAE,MAAM,EAAE;GAAM,SAAS,MAAM,QAAQ,EAAE,KAAK;GAAE,EAAE;EACjE;EACD;;AAKH,eAAsB,UACpB,QACA,UAA0B,EAAE,EACN;CACtB,MAAM,KAAK,eAAe,WAAW;AACrC,KAAI;EACF,MAAM,QAAQ,IAAI,mBAAmB,GAAG;EACxC,MAAM,OAAO,IAAI,gBAAgB,UAAU,OAAO,MAAM,CAAC;AACzD,YAAU,OAAO,OAAO,OAAO,KAAK,MAAM;EAC1C,MAAM,SAAS,IAAI,eAAe;GAChC;GACA;GACA,QAAQ,OAAO,MAAM;GACrB,SAAS,kBAAkB,YAAY,OAAO,MAAM,QAAQ,EAAE,CAAC;GAC/D,WAAW,YAAY,QAAQ;GAChC,CAAC;AACF,SAAO,WAAW,MAAM;AACtB,OAAI,EAAE,SAAS,UACb,MAAK,MAAM,KAAK;IAAE,MAAM;IAAa,SAAS,EAAE,QAAQ;IAAI,CAAC;IAC/D;EACF,MAAM,QAAQ,IAAI,WAAW,IAAI,OAAO;EACxC,MAAMC,QAAsB,EAAE;EAC9B,MAAMC,SAA2C,EAAE;AACnD,OAAK,MAAM,CAAC,GAAG,QAAQ,OAAO,KAAK,SAAS,EAAE;GAC5C,MAAM,OAAO,MAAM,QAAQ,IAAI;AAC/B,OAAI;IACF,MAAM,SAAS,MAAM,QACnB,MACA;KAAE;KAAQ;KAAO;KAAM,EACvB,UACC,aAAa,OAAO,KAAK;KAAE,MAAM,IAAI;KAAG,MAAM;KAAU,CAAC,CAC3D;AACD,UAAM,KAAK,WAAW,SAAY,EAAE,IAAI,MAAM,GAAG;KAAE,IAAI;KAAM;KAAQ,CAAC;IACtE,MAAM,UAAU,UAAU,OAAO;AACjC,QAAI,QAAQ,IAAI,KAAK,GAAG,IAAI,YAAY,KACtC,OAAM,SAAS,IAAI,GAAG,QAAQ;YACzB,KAAK;AACZ,QAAI,EAAE,eAAe,gBAAiB,OAAM;AAC5C,UAAM,KAAK;KACT,IAAI;KACJ,OACE,IAAI,UAAU,SACV,EAAE,MAAM,IAAI,MAAM,GAClB;MAAE,MAAM,IAAI;MAAM,OAAO,IAAI;MAAO;KAC3C,CAAC;;;AAGN,SAAO,QAAQ,OAAO,IAAI,IAAI,OAAO,MAAM,OAAO,OAAO;WACjD;AACR,KAAG,OAAO;;;;;;ACted,MAAM,aAAa;AAInB,SAAS,IAAI,KAAoB;CAC/B,MAAMC,SAAO,KAAK,UAAU,IAAI,CAAC,QAC/B,aACC,MAAM,MAAM,EAAE,WAAW,EAAE,CAAC,SAAS,GAAG,GAC1C;AACD,SAAQ,OAAO,MAAM,GAAGA,OAAK,IAAI;;AAKnC,SAAgB,WACd,OACA,KACM;CACN,eAAe,OAAO,MAA6B;EACjD,MAAM,MAAM,KAAK,MAAM,KAAK;AAC5B,MAAI,IAAI,QAAQ,SAAS;AACvB,OAAI,MAAM;AACV;;AAEF,MAAI,IAAI,QAAQ,MAAO,SAAQ,KAAK,EAAE;AACtC,MAAI,IAAI,QAAQ,SAAS,IAAI,WAAW,OAAW;AACnD,MAAI;AACF,OAAI,MAAM,IAAI,IAAI,OAAO,CAAC;WACnB,KAAK;AACZ,OAAI,EAAE,eAAe,eAAgB,OAAM;AAC3C,OAAI;IAAE,KAAK;IAAe,IAAI,IAAI,OAAO;IAAI,QAAQ,IAAI;IAAS,CAAC;;;CAKvE,IAAIC,QAAuB,QAAQ,SAAS;CAC5C,SAAS,QAAQ,MAAoB;AACnC,UAAQ,MACL,WAAW,OAAO,KAAK,CAAC,CACxB,OAAO,QAAiB;GACvB,MAAM,MACJ,eAAe,QAAS,IAAI,SAAS,IAAI,UAAW,OAAO,IAAI;AACjE,WAAQ,OAAO,MAAM,GAAG,IAAI,WAAW,QAAQ,KAAK,EAAE,CAAC;IACvD;;CAKN,IAAI,WAAW;AACf,SAAQ,MAAM,YAAY,OAAO;AACjC,SAAQ,MAAM,GAAG,SAAS,UAAkB;EAC1C,MAAM,SAAS,WAAW,OAAO,MAAM,KAAK;AAC5C,aAAW,MAAM,KAAK,IAAI;AAC1B,OAAK,MAAM,QAAQ,MACjB,SAAQ,KAAK,SAAS,KAAK,GAAG,KAAK,MAAM,GAAG,GAAG,GAAG,KAAK;GACzD;AACF,SAAQ,MAAM,GAAG,aAAa;AAC5B,MAAI,aAAa,GAAI,SAAQ,SAAS;GACtC"}
@@ -0,0 +1,376 @@
1
+ import { C as JsonValue, D as Ref, E as MessageKind, F as Address, T as Message, _ as SettledAs, a as SqliteDatabase, b as ThreadSummary, c as ChannelRecord, d as DeliveryState, f as DeliveryVia, g as RemoteState, h as RemoteDelivery, k as SendInput, l as Delivery, o as AgentRecord, p as MessageStore, u as DeliveryFilter, v as Settlement, y as StoredMeta } from "./untrusted-DJNiucEX-tUd9XZzz.js";
2
+
3
+ //#region src/host.d.ts
4
+
5
+ type PolicyRuling = 'allow' | 'ask' | 'deny';
6
+ interface PolicyRequest {
7
+ type: 'wake';
8
+ target: Address;
9
+ message: Message;
10
+ /** The replica a remote message came from; absent for one sent here. */
11
+ origin?: string;
12
+ }
13
+ type WakeResult = {
14
+ ok: true;
15
+ runId: string;
16
+ } | {
17
+ ok: false;
18
+ reason: string;
19
+ };
20
+ /** An address outside the machine: an A2A client of this project, or a peer agent. */
21
+ type ExternalKind = 'client' | 'peer';
22
+ type ExternalAdmission = 'deliver' | 'skip';
23
+ /** One external recipient of a send, with the caller's `to[i]` for errors. */
24
+ interface ExternalTarget {
25
+ recipient: Address;
26
+ via: DeliveryVia;
27
+ field: string;
28
+ }
29
+ /** A recipient homed on other replicas: where it lives and who may wake it. */
30
+ interface RemoteTarget {
31
+ recipient: Address;
32
+ via: DeliveryVia;
33
+ homes: string[];
34
+ wakeAt?: string;
35
+ }
36
+ /** A received message's source replica and its resolved targets, which receivers never re-expand. */
37
+ interface RemoteOrigin {
38
+ replica: string;
39
+ targets: RemoteTarget[];
40
+ /** Set on a forward: the one target it carries the message to this replica for. */
41
+ forwardTarget?: Address;
42
+ }
43
+ /** Where one target of a local send lives: here, on other replicas, or nowhere it may go. */
44
+ type Placement = {
45
+ kind: 'local';
46
+ } | {
47
+ kind: 'remote';
48
+ homes: string[];
49
+ alsoLocal: boolean;
50
+ wakeAt?: string;
51
+ } | {
52
+ kind: 'refuse';
53
+ reason: string;
54
+ };
55
+ interface FederationHooks {
56
+ /** This replica's id, compared with a placement's `wakeAt`. */
57
+ readonly replica: string;
58
+ /** A persisted tick of the ledger clock, stamped on every message sent here. */
59
+ hlc(): string;
60
+ placement(target: {
61
+ recipient: Address;
62
+ via: DeliveryVia;
63
+ }, message: Message, replyTarget: Message | null): Placement;
64
+ /** The task of a run live on another replica, from its presence, or null. */
65
+ remoteRunTask(runId: string): string | null;
66
+ /** A replica's roster handle, for "(remote: <handle>)". */
67
+ label(replica: string): string;
68
+ /** Records a problem the engine found in federated data. */
69
+ problem(subject: string, message: string): void;
70
+ }
71
+ /** A remote home's report of one recipient's delivery state. */
72
+ type DeliveryEntry = {
73
+ t: 'delivery';
74
+ message: string;
75
+ recipient: Address;
76
+ state: 'held' | 'pushed' | 'notified' | 'read' | 'answered';
77
+ at: string;
78
+ };
79
+ /** A remote home refused a message for every recipient it holds. */
80
+ type RefusedEntry = {
81
+ t: 'refused';
82
+ message: string;
83
+ reason: string;
84
+ at: string;
85
+ };
86
+ /** A question's settler recording its accepted answer, or its close. */
87
+ type SettleEntry = {
88
+ t: 'settle';
89
+ question: string;
90
+ answer: string;
91
+ closed?: string;
92
+ at: string;
93
+ };
94
+ type StateEntry = DeliveryEntry | RefusedEntry;
95
+ interface MessagingHost {
96
+ liveRunFor(taskId: string): string | null;
97
+ isLiveRun(runId: string): boolean;
98
+ taskOfRun(runId: string): string | null;
99
+ push(runId: string, rendered: string, message: Message): Promise<void>;
100
+ notify(runId: string, digest: string, message: Message): Promise<void>;
101
+ notifyHuman(actor: Address, message: Message): void;
102
+ wake(target: Address, message: Message): Promise<WakeResult>;
103
+ decide(request: PolicyRequest): PolicyRuling;
104
+ owner(target: Address, sender?: Address): Address;
105
+ implicitMembers(channel: string): Address[];
106
+ onAnswered(question: Message, answer: Message): Promise<void>;
107
+ now(): Date;
108
+ quotaGroup?(sender: Address): Address[];
109
+ external?(address: Address): ExternalKind | null;
110
+ admitExternal?(target: ExternalTarget, sender: Sender, replyTarget: Message | null, message: Message): ExternalAdmission;
111
+ federation?: FederationHooks;
112
+ }
113
+ //#endregion
114
+ //#region src/engine.d.ts
115
+ interface EngineLimits {
116
+ urgentPerHour: number;
117
+ agentTurnsPerThreadPerHour: number;
118
+ /** New threads an agent-authored sender may start among agents and
119
+ * sessions (no human recipient) per hour. A host's own guardrail beyond
120
+ * the spec's breaker, which counts replies only; off by default. */
121
+ agentThreadsPerHour: number;
122
+ /** Open wake gates one target may have at once; a further ask is merged
123
+ * into the open gate, its message held as before. Off by default. */
124
+ openWakeGatesPerTarget: number;
125
+ }
126
+ declare const DEFAULT_LIMITS: EngineLimits;
127
+ /** Who is sending, as the host authenticated them. */
128
+ interface Sender {
129
+ address: Address;
130
+ canDecide: boolean;
131
+ }
132
+ /** How a send reached the engine: `received` when a binding delivered it. */
133
+ interface SendOptions {
134
+ origin?: 'local' | 'received';
135
+ }
136
+ interface SendResult {
137
+ message: Message;
138
+ deliveries: Delivery[];
139
+ /** True when `urgent` was dropped because the sender hit its quota. */
140
+ downgraded: boolean;
141
+ /** Set when `idempotencyKey` matched an earlier send from the same sender. */
142
+ replayed?: true;
143
+ }
144
+ type EngineEvent = {
145
+ type: 'message';
146
+ message: Message;
147
+ } | {
148
+ type: 'delivery';
149
+ delivery: Delivery;
150
+ } | {
151
+ type: 'membership';
152
+ channel: string;
153
+ member: Address;
154
+ joined: boolean;
155
+ } | {
156
+ type: 'remote';
157
+ messageId: string;
158
+ recipient: Address;
159
+ };
160
+ /** What receive did: stored it (`applied`) or already held it (`duplicate`). */
161
+ interface ReceiveResult {
162
+ status: 'applied' | 'duplicate';
163
+ /** The local deliveries this call made, after their push or notify. */
164
+ deliveries: Delivery[];
165
+ }
166
+ declare class DeliveryEngine {
167
+ private readonly store;
168
+ private readonly host;
169
+ private readonly limits;
170
+ private readonly ulid;
171
+ private readonly gateTypes;
172
+ private readonly listeners;
173
+ constructor(opts: {
174
+ store: MessageStore;
175
+ host: MessagingHost;
176
+ limits?: Partial<EngineLimits>;
177
+ newUlid?: (nowMs: number) => string;
178
+ gateTypes?: readonly string[];
179
+ });
180
+ subscribe(listener: (e: EngineEvent) => void): () => void;
181
+ /** How many listeners are subscribed right now, so a test can check that a
182
+ * subscriber's cleanup unsubscribed it. */
183
+ get listenerCount(): number;
184
+ private emit;
185
+ private id;
186
+ private nowIso;
187
+ private hourAgoIso;
188
+ private authorize;
189
+ private resolveTargets;
190
+ private plan;
191
+ send(input: SendInput, sender: Sender, options?: SendOptions): Promise<SendResult>;
192
+ private localAnswerSettledAs;
193
+ private hasTask;
194
+ private place;
195
+ private admitExternal;
196
+ private isExternal;
197
+ private replay;
198
+ private rewriteForReply;
199
+ private replyRecipients;
200
+ private recipientFields;
201
+ private participates;
202
+ canRead(messageId: string, sender: Sender): boolean;
203
+ canReadThread(threadId: string, sender: Sender): boolean;
204
+ private applyGate;
205
+ private dispatch;
206
+ private remoteLabel;
207
+ recover(): Promise<{
208
+ retried: number;
209
+ reverted: number;
210
+ replayed: number;
211
+ voided: number;
212
+ }>;
213
+ private voidAndReopen;
214
+ private reopenState;
215
+ getMessage(id: string): Message | null;
216
+ /** What `address` sent at or after `sinceIso`, oldest first, optionally only these kinds. */
217
+ messagesFrom(address: Address, sinceIso: string, kinds?: MessageKind[]): Message[];
218
+ answerOf(questionId: string): Message | null;
219
+ openBlocking(): Message[];
220
+ /** One message's local deliveries; recipients homed elsewhere are not among them. */
221
+ deliveriesOf(messageId: string): Delivery[];
222
+ thread(threadId: string): {
223
+ messages: Message[];
224
+ deliveries: Delivery[];
225
+ };
226
+ inbox(recipient: Address, states?: DeliveryState[]): {
227
+ delivery: Delivery;
228
+ message: Message;
229
+ }[];
230
+ markRead(deliveryId: string): Delivery;
231
+ markRelayed(deliveryId: string): Delivery | null;
232
+ join(channel: string, member: Address): void;
233
+ leave(channel: string, member: Address): boolean;
234
+ deliverableAddress(address: Address): Address;
235
+ reply(messageId: string, input: {
236
+ body: string;
237
+ choice?: string;
238
+ refs?: Ref[];
239
+ data?: JsonValue;
240
+ session?: string;
241
+ }, sender: Sender): Promise<SendResult>;
242
+ close(questionId: string, reason: string): Message;
243
+ private markAnswered;
244
+ deliverHeld(runId: string, taskId: string): Promise<Delivery[]>;
245
+ private requireFederation;
246
+ receive(message: Message, origin: RemoteOrigin): Promise<ReceiveResult>;
247
+ private applyForward;
248
+ private authorizeRemote;
249
+ private exchangedWith;
250
+ private remoteParticipant;
251
+ private answerEarly;
252
+ private earlyAnswerHolds;
253
+ private planRemote;
254
+ private settleOnArrival;
255
+ applyState(entries: StateEntry[], publisher: string): void;
256
+ private mergeDelivery;
257
+ private mergeRefused;
258
+ applySettlement(entry: SettleEntry, publisher: string): void;
259
+ private honourSettlement;
260
+ private swapSettled;
261
+ private demoteOtherAnswers;
262
+ private emitChanged;
263
+ claimRemote(taskId: string): Delivery[];
264
+ moveToRemote(messageId: string, recipient: Address, homes: string[], state?: RemoteState): void;
265
+ private putRemote;
266
+ private mayNoteSuperseded;
267
+ private noticeTo;
268
+ private runWake;
269
+ private checkNewThreads;
270
+ private openWakeGates;
271
+ private checkBreaker;
272
+ }
273
+ //#endregion
274
+ //#region src/sqliteStore.d.ts
275
+ declare const MESSAGES_DB_VERSION = 1;
276
+ declare function openMessagesDb(path: string): SqliteDatabase;
277
+ /** Which messages a conversation read matches: both parties of a pair, every
278
+ * thread an address took part in, or every thread referencing a ref. */
279
+ type ConversationMatch = {
280
+ kind: 'pair';
281
+ a: Address;
282
+ b: Address;
283
+ } | {
284
+ kind: 'about';
285
+ addresses: readonly Address[];
286
+ } | {
287
+ kind: 'ref';
288
+ type: string;
289
+ id: string;
290
+ };
291
+ interface ConversationPage {
292
+ /** Only ids below this one (ulid order). */
293
+ before?: string;
294
+ limit?: number;
295
+ /** Only thread roots. */
296
+ rootsOnly?: boolean;
297
+ }
298
+ declare class SqliteMessageStore implements MessageStore {
299
+ private readonly db;
300
+ private depth;
301
+ constructor(db: SqliteDatabase);
302
+ transaction<T>(fn: () => T): T;
303
+ insertMessage(m: Message, idemKey?: string, meta?: StoredMeta): void;
304
+ private toMessage;
305
+ getMessage(id: string): Message | null;
306
+ byIdemKey(from: Address, key: string): Message | null;
307
+ idemKeysFor(messageIds: string[]): Map<string, string>;
308
+ messagesFrom(address: Address, sinceIso: string, kinds?: MessageKind[]): Message[];
309
+ thread(threadId: string): Message[];
310
+ answersTo(messageId: string): Message[];
311
+ openBlocking(): Message[];
312
+ insertDelivery(d: Delivery): void;
313
+ deleteDelivery(id: string): boolean;
314
+ private toDelivery;
315
+ getDelivery(id: string): Delivery | null;
316
+ deliveries(filter: DeliveryFilter): Delivery[];
317
+ setDelivery(id: string, state: DeliveryState, runId: string | null, at: string, expected?: DeliveryState): boolean;
318
+ markGateApplied(questionId: string, at: string): void;
319
+ voidAnswer(answerId: string, questionId: string, at: string): boolean;
320
+ unappliedAnsweredGates(): {
321
+ question: Message;
322
+ answer: Message;
323
+ }[];
324
+ countFrom(from: Address, sinceIso: string, urgentOnly: boolean, origin?: string, untilIso?: string): number;
325
+ countDeliveredTo(recipient: Address, sinceIso: string, untilIso?: string): number;
326
+ countAgentThreadsFrom(from: Address, sinceIso: string): number;
327
+ countAgentAuthored(threadId: string, sinceIso: string, exclude: Address): number;
328
+ settledAs(messageId: string): SettledAs | null;
329
+ setSettled(messageId: string, kind: 'answer' | 'message', settledAs: SettledAs | null): void;
330
+ answerCandidates(questionId: string): {
331
+ message: Message;
332
+ settledAs: SettledAs | null;
333
+ }[];
334
+ insertRemote(row: RemoteDelivery): boolean;
335
+ private toRemote;
336
+ remoteDeliveries(filter: {
337
+ messageId?: string;
338
+ recipient?: Address;
339
+ states?: RemoteState[];
340
+ }): RemoteDelivery[];
341
+ setRemote(messageId: string, recipient: Address, patch: {
342
+ state?: RemoteState;
343
+ refusedBy?: string[];
344
+ homes?: string[];
345
+ }, at: string, expected?: RemoteState): boolean;
346
+ deleteRemote(messageId: string, recipient: Address): boolean;
347
+ settlement(questionId: string): Settlement | null;
348
+ putSettlement(s: Settlement): void;
349
+ putEarlySettlement(s: Settlement): void;
350
+ earlySettlements(questionId: string): Settlement[];
351
+ clearEarlySettlements(questionId: string): void;
352
+ messagesAfter(rowid: number, limit: number): {
353
+ rowid: number;
354
+ message: Message;
355
+ }[];
356
+ maxRowid(): number;
357
+ ensureChannel(name: string, at: string, auto: boolean): void;
358
+ channels(): ChannelRecord[];
359
+ addMember(channel: string, member: Address, at: string): boolean;
360
+ removeMember(channel: string, member: Address): boolean;
361
+ members(channel: string): Address[];
362
+ channelsOf(member: Address): string[];
363
+ putAgent(a: AgentRecord): void;
364
+ private toAgent;
365
+ getAgent(address: Address): AgentRecord | null;
366
+ agentByTokenHash(hash: string): AgentRecord | null;
367
+ agents(): AgentRecord[];
368
+ recentThreads(limit: number, about?: readonly Address[]): ThreadSummary[];
369
+ /** Messages a conversation read matches, newest (highest id) first. */
370
+ conversation(match: ConversationMatch, page: ConversationPage): Message[];
371
+ private firstStored;
372
+ private byRowid;
373
+ }
374
+ //#endregion
375
+ export { RefusedEntry as C, StateEntry as D, SettleEntry as E, WakeResult as O, PolicyRuling as S, RemoteTarget as T, ExternalTarget as _, openMessagesDb as a, Placement as b, EngineEvent as c, SendOptions as d, SendResult as f, ExternalKind as g, ExternalAdmission as h, SqliteMessageStore as i, EngineLimits as l, DeliveryEntry as m, ConversationPage as n, DEFAULT_LIMITS as o, Sender as p, MESSAGES_DB_VERSION as r, DeliveryEngine as s, ConversationMatch as t, ReceiveResult as u, FederationHooks as v, RemoteOrigin as w, PolicyRequest as x, MessagingHost as y };
376
+ //# sourceMappingURL=sqliteStore-BtFP1f8O.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sqliteStore-BtFP1f8O.d.ts","names":[],"sources":["../src/host.ts","../src/engine.ts","../src/sqliteStore.ts"],"sourcesContent":[],"mappings":"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"}