@holokai/neuron-sdk 0.5.1 → 0.7.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.
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../../neuron-protocol/src/capability.ts","../../neuron-protocol/src/lease.ts","../../neuron-protocol/src/frames.ts","../../neuron-protocol/src/transport.ts","../src/capability-def.ts","../src/heartbeat.ts","../src/logger.ts","../src/sse-parser.ts","../src/http-transport.ts","../src/lease-runner.ts","../src/schema-validator.ts","../src/worker-pool.ts","../src/neuron.ts"],"names":["z","zodToJsonSchema","opts","AjvDefault","addFormatsDefault","EventEmitter"],"mappings":"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","file":"index.js","sourcesContent":["import type { CapabilityScope, CapabilityType, JsonSchema, UserId } from '@workflow/core';\nimport { z } from 'zod';\n\n// The TS type aliases (CapabilityType, UserId, CapabilityScope) live in\n// `@workflow/core/types/neuron-primitives` so core can reference them\n// without depending on this package — see commit history for the layering\n// rationale. Runtime validation (regex, structural checks) stays here.\n\n// Namespaced capability type: \"owner/package[/name][.variant]\". Each segment\n// allows alphanumerics + `.` `_` `-` (case-insensitive — real identifiers\n// like ULIDs in `user/{userId}/...` and `org/{orgId}/...` segments are\n// uppercase). Examples: \"core/script.python\", \"desktop/mcp/drive.read\",\n// \"org/01HBQ8ZK3F5N1G4WQR8YZB5MTC/custom\", \"user/{userId}/mytool\".\nexport const CapabilityTypeSchema = z\n .string()\n .min(1)\n .regex(\n /^[A-Za-z0-9_.\\-]+(\\/[A-Za-z0-9_.\\-]+)+$/,\n 'capability type must be namespaced: {owner}/{package}[/{name}][.{variant}]',\n ) satisfies z.ZodType<CapabilityType>;\n\nexport const UserIdSchema = z.string().min(1) satisfies z.ZodType<UserId>;\n\n// JSON Schema travels on the wire as opaque data; the SDK/gateway validate\n// task inputs/outputs against it without re-parsing the schema here. Lives\n// here (not lease.ts) since HOL-2926 — `Capability` needs it too and\n// lease.ts already imports from this module.\nexport const JsonSchemaSchema = z.unknown() satisfies z.ZodType<JsonSchema>;\n\nexport const CapabilityScopeSchema = z.union([\n z.literal('any'),\n z.object({ onBehalfOf: UserIdSchema }).strict(),\n]) satisfies z.ZodType<CapabilityScope>;\n\nexport const CapabilitySchema = z\n .object({\n type: CapabilityTypeSchema,\n scope: CapabilityScopeSchema,\n concurrency: z.number().int().positive(),\n /**\n * Plain-language contract advertisement (HOL-2926). All three fields\n * are optional and additive: older neurons keep sending\n * `{ type, scope, concurrency }` and the gateway accepts both shapes.\n * When present they flow (fire-and-forget) to Moku's\n * `capability_catalog` so registry-sourced capabilities render with a\n * real contract in the supervisor catalog instead of type-only stubs.\n *\n * Omit rather than null — the fields are `.optional()`, not\n * `.nullable()`, and a `null` description fails validation.\n */\n description: z.string().optional(),\n /**\n * JSON Schema for the capability's input payload — opaque on the wire,\n * but `null` is rejected: the reconcile push to Moku is last-writer-wins\n * per present key, so a null here could wipe a stored schema.\n * (`description` already rejects null via `z.string()`.)\n */\n // The `: boolean` return annotations stop TS (5.5+) from inferring the\n // lambdas as type predicates, which would narrow the field from\n // `unknown` to `{}` and ripple into every consumer.\n inputSchema: JsonSchemaSchema.refine(\n (v): boolean => v !== null,\n 'omit inputSchema instead of sending null',\n ).optional(),\n /** JSON Schema for the capability's output payload — same rules as inputSchema. */\n outputSchema: JsonSchemaSchema.refine(\n (v): boolean => v !== null,\n 'omit outputSchema instead of sending null',\n ).optional(),\n /**\n * Per-capability lease TTL override in milliseconds (HOL-356).\n * The gateway uses this when minting a lease's `expiresAt`; absent\n * → falls back to the gateway's default (`leaseTtlMs` on the\n * dispatcher). Lets a slow capability (e.g. a scripted run with a\n * 10-minute deadline) declare a longer TTL without tuning the\n * whole gateway.\n *\n * Bounded by reasonable extremes: at least 1s (anything shorter\n * than a heartbeat is meaningless) and at most 1h (the reaper +\n * heartbeat budget should be the limiter, not a single\n * capability).\n */\n leaseTtlMs: z.number().int().min(1_000).max(60 * 60 * 1_000).optional(),\n })\n .strict();\nexport type Capability = z.infer<typeof CapabilitySchema>;\n\n// Re-export the primitive type aliases so consumers can keep importing\n// CapabilityType / UserId / CapabilityScope from `@workflow/neuron-protocol`\n// alongside the wire schemas.\nexport type { CapabilityScope, CapabilityType, UserId };\n","import type { JsonSchema, LeaseId } from '@workflow/core';\nimport { z } from 'zod';\nimport { CapabilityTypeSchema, JsonSchemaSchema, UserIdSchema } from './capability.js';\n\n// JsonSchemaSchema moved to capability.ts (HOL-2926 — `Capability` needs it\n// too); re-exported here so existing lease-centric imports keep working.\nexport { JsonSchemaSchema };\nexport const LeaseIdSchema = z.string().min(1) satisfies z.ZodType<LeaseId>;\n\n// Re-export the primitive type aliases so consumers can keep importing\n// JsonSchema / LeaseId from `@workflow/neuron-protocol`.\nexport type { JsonSchema, LeaseId };\n\nexport const TaskPayloadSchema = z\n .object({\n taskId: z.string().min(1),\n workflowId: z.string().min(1),\n capability: CapabilityTypeSchema,\n onBehalfOf: UserIdSchema.optional(),\n input: z.unknown(),\n attempt: z.number().int().nonnegative(),\n metadata: z.record(z.string(), z.unknown()).optional(),\n })\n .strict();\nexport type TaskPayload = z.infer<typeof TaskPayloadSchema>;\n\nexport const LeasePayloadSchema = z\n .object({\n leaseId: LeaseIdSchema,\n expiresAt: z.string().datetime(),\n task: TaskPayloadSchema,\n inputSchema: JsonSchemaSchema,\n outputSchema: JsonSchemaSchema,\n })\n .strict();\nexport type LeasePayload = z.infer<typeof LeasePayloadSchema>;\n","import { z } from 'zod';\nimport { CapabilitySchema, CapabilityTypeSchema } from './capability.js';\nimport { LeaseIdSchema, LeasePayloadSchema } from './lease.js';\n\nexport const NeuronIdSchema = z.string().min(1);\nexport type NeuronId = z.infer<typeof NeuronIdSchema>;\n\n// ===================================================================\n// Neuron → Server frames (sent via HTTPS POST to POST_PATH.*).\n// ===================================================================\n\nexport const RegisterFrameSchema = z\n .object({\n type: z.literal('register'),\n neuronId: NeuronIdSchema,\n // Free-form by design — the gateway records this verbatim and performs\n // no version negotiation; compatibility comes from additive-only frame\n // evolution (see PROTOCOL_VERSION in transport.ts). Do not pin this to\n // the exported constant.\n protocolVersion: z.string().min(1),\n capabilities: z\n .array(CapabilitySchema)\n .min(1)\n .refine(\n (caps) => new Set(caps.map((c) => c.type)).size === caps.length,\n 'duplicate capability types are not allowed in a single register frame',\n ),\n })\n .strict();\nexport type RegisterFrame = z.infer<typeof RegisterFrameSchema>;\n\n// Modifies an existing advertisement (matched by capability.type) — typically\n// to change concurrency (e.g., desktop plugged in) or scope. To stop\n// advertising a capability the neuron must disconnect and re-register without\n// it; server-initiated revocation uses the capability-revoked frame.\n// Concurrency must remain > 0 by design — capability-pause is not a state.\nexport const UpdateCapabilityFrameSchema = z\n .object({\n type: z.literal('update-capability'),\n neuronId: NeuronIdSchema,\n capability: CapabilitySchema,\n })\n .strict();\nexport type UpdateCapabilityFrame = z.infer<typeof UpdateCapabilityFrameSchema>;\n\nexport const HeartbeatInFlightEntrySchema = z\n .object({\n leaseId: LeaseIdSchema,\n taskId: z.string().min(1),\n startedAt: z.string().datetime(),\n })\n .strict();\nexport type HeartbeatInFlightEntry = z.infer<typeof HeartbeatInFlightEntrySchema>;\n\nexport const HeartbeatFrameSchema = z\n .object({\n type: z.literal('heartbeat'),\n neuronId: NeuronIdSchema,\n inFlight: z.array(HeartbeatInFlightEntrySchema),\n sentAt: z.string().datetime(),\n })\n .strict();\nexport type HeartbeatFrame = z.infer<typeof HeartbeatFrameSchema>;\n\nexport const AckFrameSchema = z\n .object({\n type: z.literal('ack'),\n leaseId: LeaseIdSchema,\n output: z.unknown(),\n completedAt: z.string().datetime(),\n })\n .strict();\nexport type AckFrame = z.infer<typeof AckFrameSchema>;\n\nexport const NackKindSchema = z.enum([\n 'retryable',\n 'terminal',\n 'schema-mismatch',\n 'cancelled',\n]);\nexport type NackKind = z.infer<typeof NackKindSchema>;\n\nexport const NackFrameSchema = z\n .object({\n type: z.literal('nack'),\n leaseId: LeaseIdSchema,\n kind: NackKindSchema,\n reason: z.string().min(1),\n code: z.string().optional(),\n details: z.unknown().optional(),\n failedAt: z.string().datetime(),\n })\n .strict();\nexport type NackFrame = z.infer<typeof NackFrameSchema>;\n\nexport const ProgressFrameSchema = z\n .object({\n type: z.literal('progress'),\n leaseId: LeaseIdSchema,\n percent: z.number().min(0).max(100).optional(),\n message: z.string().optional(),\n data: z.unknown().optional(),\n sentAt: z.string().datetime(),\n })\n .strict();\nexport type ProgressFrame = z.infer<typeof ProgressFrameSchema>;\n\nexport const NeuronToServerFrameSchema = z.discriminatedUnion('type', [\n RegisterFrameSchema,\n UpdateCapabilityFrameSchema,\n HeartbeatFrameSchema,\n AckFrameSchema,\n NackFrameSchema,\n ProgressFrameSchema,\n]);\nexport type NeuronToServerFrame = z.infer<typeof NeuronToServerFrameSchema>;\n\n// ===================================================================\n// Server → Neuron frames (delivered on the SSE_PATH event stream;\n// each frame's `type` matches its SSE event name).\n// ===================================================================\n\nexport const RegisteredFrameSchema = z\n .object({\n type: z.literal('registered'),\n sessionId: z.string().min(1),\n // Effective capability bindings after auth + policy filters; may be a\n // subset of what the neuron advertised.\n capabilities: z.array(CapabilitySchema),\n acceptedAt: z.string().datetime(),\n })\n .strict();\nexport type RegisteredFrame = z.infer<typeof RegisteredFrameSchema>;\n\nexport const LeaseFrameSchema = z\n .object({\n type: z.literal('lease'),\n lease: LeasePayloadSchema,\n sentAt: z.string().datetime(),\n })\n .strict();\nexport type LeaseFrame = z.infer<typeof LeaseFrameSchema>;\n\nexport const CancelFrameSchema = z\n .object({\n type: z.literal('cancel'),\n leaseId: LeaseIdSchema,\n reason: z.string().min(1),\n cancelledAt: z.string().datetime(),\n })\n .strict();\nexport type CancelFrame = z.infer<typeof CancelFrameSchema>;\n\nexport const CapabilityRevokedFrameSchema = z\n .object({\n type: z.literal('capability-revoked'),\n capability: CapabilityTypeSchema,\n reason: z.string().min(1),\n revokedAt: z.string().datetime(),\n })\n .strict();\nexport type CapabilityRevokedFrame = z.infer<typeof CapabilityRevokedFrameSchema>;\n\nexport const DisconnectFrameSchema = z\n .object({\n type: z.literal('disconnect'),\n reason: z.string().min(1),\n code: z.string().optional(),\n reconnectable: z.boolean(),\n sentAt: z.string().datetime(),\n })\n .strict();\nexport type DisconnectFrame = z.infer<typeof DisconnectFrameSchema>;\n\nexport const ServerToNeuronFrameSchema = z.discriminatedUnion('type', [\n RegisteredFrameSchema,\n LeaseFrameSchema,\n CancelFrameSchema,\n CapabilityRevokedFrameSchema,\n DisconnectFrameSchema,\n]);\nexport type ServerToNeuronFrame = z.infer<typeof ServerToNeuronFrameSchema>;\n\n// ===================================================================\n// Any frame (convenience union for generic dispatch/logging).\n// ===================================================================\n\nexport const FrameSchema = z.discriminatedUnion('type', [\n RegisterFrameSchema,\n UpdateCapabilityFrameSchema,\n HeartbeatFrameSchema,\n AckFrameSchema,\n NackFrameSchema,\n ProgressFrameSchema,\n RegisteredFrameSchema,\n LeaseFrameSchema,\n CancelFrameSchema,\n CapabilityRevokedFrameSchema,\n DisconnectFrameSchema,\n]);\nexport type Frame = z.infer<typeof FrameSchema>;\n","// Wire-protocol version. Major bump on breaking changes to frame shapes;\n// minor bump on additive/optional changes.\n// Note: RegisterFrame.protocolVersion is intentionally a free-form string and\n// is NOT pinned to this constant. The gateway records it verbatim and\n// performs NO version negotiation today — compatibility rests on frames\n// evolving additively (old senders keep working because new fields are\n// optional). The inverse is NOT guaranteed: frames are validated strictly,\n// so a sender using new optional fields needs a gateway that already knows\n// them — deploy the gateway before releasing SDKs that send new fields.\n//\n// 1.1.0 (HOL-2926): Capability gains optional `description` /\n// `inputSchema` / `outputSchema` so neurons can advertise their contract.\n// Gateways older than HOL-2926 reject register frames that carry them.\nexport const PROTOCOL_VERSION = '1.1.0';\n\n// Server-Sent Events endpoint (server → neuron stream).\nexport const SSE_PATH = '/neuron/events';\n\n// SSE event names used on the stream.\nexport const SSE_EVENT = {\n registered: 'registered',\n lease: 'lease',\n cancel: 'cancel',\n capabilityRevoked: 'capability-revoked',\n disconnect: 'disconnect',\n} as const;\nexport type SSEEvent = (typeof SSE_EVENT)[keyof typeof SSE_EVENT];\n\n// HTTP POST endpoints (neuron → server commands). Correlation back to the\n// SSE stream is by the authenticated session, not by path.\nexport const POST_PATH = {\n register: '/neuron/register',\n updateCapability: '/neuron/update-capability',\n heartbeat: '/neuron/heartbeat',\n ack: '/neuron/ack',\n nack: '/neuron/nack',\n progress: '/neuron/progress',\n} as const;\nexport type PostPath = (typeof POST_PATH)[keyof typeof POST_PATH];\n","/**\n * `defineCapability` — single source of truth for a capability's contract.\n *\n * One object carries everything a neuron and a planner need to know about a\n * capability: namespaced type, human-readable description, typed input and\n * output schemas, and (optionally) deployment defaults like scope and\n * concurrency. The SDK serializes only the fields each endpoint cares\n * about — plan-time gets the contract, registration gets the deployment.\n *\n * Why one object: users don't have to juggle a \"plan-time def\" vs a\n * \"registration-time def\". Defaults set on the def can still be overridden\n * at `neuron.handle(...)` time per deployment (e.g., desktop vs server).\n */\nimport type { Capability, JsonSchema } from '@workflow/neuron-protocol';\nimport type { z } from 'zod';\nimport { zodToJsonSchema } from 'zod-to-json-schema';\n\nimport type { CapabilityHandleOptions } from './types.js';\n\nexport interface CapabilityDefInit<TIn extends z.ZodTypeAny, TOut extends z.ZodTypeAny> {\n /** Namespaced capability type, e.g. `core/script.python`. */\n type: string;\n /**\n * Plain-language description shown to the planner LLM. Required at\n * plan-time so the model can choose this capability appropriately.\n */\n description: string;\n /** Zod schema for the capability's input payload. */\n input: TIn;\n /** Zod schema for the capability's output payload. */\n output: TOut;\n /**\n * Optional deployment defaults. All can be overridden at\n * `neuron.handle(def, opts, fn)` time.\n */\n scope?: Capability['scope'];\n concurrency?: number;\n /**\n * Per-capability lease TTL override in milliseconds (HOL-356).\n * Flows through the register frame to the gateway, which uses it\n * when minting a lease's `expiresAt` for this capability instead of\n * its own default. Useful when one capability runs much longer than\n * the rest of a neuron's repertoire (e.g. a sandboxed Python script\n * with a 10-minute deadline) — set this rather than tuning the\n * gateway-wide default for everyone.\n *\n * Bounded `[1_000, 3_600_000]` (1s..1h) by `CapabilitySchema`.\n */\n leaseTtlMs?: number;\n}\n\n/**\n * A typed capability definition. The phantom `_input` / `_output` fields\n * carry the inferred TS types so `neuron.handle(def, fn)` can constrain\n * `fn`'s argument and return type.\n *\n * Internal serializers (`toPlanShape`, `toRegistrationCapability`) keep the\n * \"send only what the endpoint needs\" rule in one place — endpoints get\n * the right subset and never accidentally see the wrong fields.\n */\nexport interface CapabilityDef<TIn = unknown, TOut = unknown> {\n readonly type: string;\n readonly description: string;\n /** Compiled JSON Schema — derived once at definition time. */\n readonly inputSchema: JsonSchema;\n readonly outputSchema: JsonSchema;\n readonly scope?: Capability['scope'];\n readonly concurrency?: number;\n /** See {@link CapabilityDefInit.leaseTtlMs}. */\n readonly leaseTtlMs?: number;\n /** Original zod schemas — kept for runtime validation in handlers if needed. */\n readonly _zod: { input: z.ZodType<TIn>; output: z.ZodType<TOut> };\n /** Phantom type carriers — never read at runtime. */\n readonly _input?: TIn;\n readonly _output?: TOut;\n}\n\n/**\n * Plan-request shape: `{ type, description, input, output }`. Scope and\n * concurrency are intentionally dropped — they're per-deployment and\n * don't belong in the planner's catalog.\n */\nexport interface CapabilityPlanShape {\n type: string;\n description: string;\n input: JsonSchema;\n output: JsonSchema;\n}\n\nexport function defineCapability<TIn extends z.ZodTypeAny, TOut extends z.ZodTypeAny>(\n init: CapabilityDefInit<TIn, TOut>,\n): CapabilityDef<z.infer<TIn>, z.infer<TOut>> {\n return {\n type: init.type,\n description: init.description,\n inputSchema: zodToJsonSchema(init.input, { $refStrategy: 'none' }) as JsonSchema,\n outputSchema: zodToJsonSchema(init.output, { $refStrategy: 'none' }) as JsonSchema,\n scope: init.scope,\n concurrency: init.concurrency,\n leaseTtlMs: init.leaseTtlMs,\n _zod: { input: init.input, output: init.output },\n };\n}\n\n/** Render the def for inclusion in a `POST /plan` catalog. */\nexport function toPlanShape(def: CapabilityDef): CapabilityPlanShape {\n return {\n type: def.type,\n description: def.description,\n input: def.inputSchema,\n output: def.outputSchema,\n };\n}\n\n/**\n * Render the registration `Capability` frame for the gateway. `opts`\n * overrides any defaults set on the def. `scope` and `concurrency` are\n * required at registration time — if neither the def nor `opts` provides\n * them, this throws so the misconfiguration surfaces at start time\n * rather than as a confusing wire-validation error.\n *\n * Since HOL-2926 the frame also carries the contract (`description` +\n * compiled JSON Schemas): the gateway forwards it to Moku's capability\n * catalog so registry-sourced capabilities render with a real contract\n * in the supervisor catalog instead of type-only stubs.\n */\nexport function toRegistrationCapability(\n def: CapabilityDef,\n opts?: CapabilityHandleOptions,\n): Capability {\n const scope = opts?.scope ?? def.scope;\n const concurrency = opts?.concurrency ?? def.concurrency;\n if (!scope) {\n throw new Error(\n `capability ${def.type}: scope is required for registration — set it on defineCapability(...) or at neuron.handle(def, { scope }, fn)`,\n );\n }\n if (typeof concurrency !== 'number') {\n throw new Error(\n `capability ${def.type}: concurrency is required for registration — set it on defineCapability(...) or at neuron.handle(def, { concurrency }, fn)`,\n );\n }\n // leaseTtlMs is purely additive — only included on the wire when the\n // def actually set it. Spreading conditionally keeps the strict()\n // schema happy and keeps the wire frame small for capabilities that\n // don't care.\n const leaseTtlMs = opts?.leaseTtlMs ?? def.leaseTtlMs;\n return {\n type: def.type,\n scope,\n concurrency,\n // Contract advertisement (HOL-2926). `description` is required on the\n // def, so it is always present here; `opts.description` lets a\n // deployment reword it without redefining the capability.\n description: opts?.description ?? def.description,\n inputSchema: def.inputSchema,\n outputSchema: def.outputSchema,\n ...(typeof leaseTtlMs === 'number' ? { leaseTtlMs } : {}),\n };\n}\n","import { POST_PATH, type HeartbeatInFlightEntry } from '@workflow/neuron-protocol';\n\nimport type { Transport } from './transport.js';\nimport type { NeuronLogger } from './types.js';\n\nexport interface HeartbeatLoopOptions {\n transport: Transport;\n /** Stable per-process neuron identifier (matches the SSE `?neuronId=`). */\n neuronId: string;\n /** Returns the current in-flight lease list at heartbeat time. */\n inFlight: () => HeartbeatInFlightEntry[];\n /** Interval in ms between heartbeats. Default 10s. */\n intervalMs?: number;\n logger?: NeuronLogger;\n}\n\nconst DEFAULT_INTERVAL_MS = 10_000;\n\n/**\n * Periodic heartbeat loop. Posts the current in-flight lease list so the\n * gateway:\n * 1. Knows the session is alive (bumps `last_heartbeat_at`).\n * 2. Renews lease expiries so the reaper doesn't reclaim long-running\n * tasks.\n *\n * The loop is paused while the transport is disconnected (between SSE\n * drop and reconnect). Once `start()` resumes after a reconnect, the\n * next interval tick fires immediately so the gateway sees we're back.\n */\nexport class HeartbeatLoop {\n private timer: NodeJS.Timeout | null = null;\n private running = false;\n private readonly intervalMs: number;\n\n constructor(private readonly opts: HeartbeatLoopOptions) {\n this.intervalMs = opts.intervalMs ?? DEFAULT_INTERVAL_MS;\n }\n\n start(): void {\n if (this.timer) return;\n this.timer = setInterval(() => {\n void this.tick();\n }, this.intervalMs);\n // Deliberately REF'D (HOL-3030) — same ref-while-started semantics\n // as the transport's reconnect timer: while the neuron is started,\n // the SDK keeps the process alive; stop() clears the interval.\n }\n\n stop(): void {\n if (this.timer) {\n clearInterval(this.timer);\n this.timer = null;\n }\n }\n\n /** Public for tests so they don't have to wait for the timer. */\n async tick(): Promise<void> {\n if (this.running) return;\n if (!this.opts.transport.isConnected()) return;\n this.running = true;\n try {\n await this.opts.transport.post(POST_PATH.heartbeat, {\n type: 'heartbeat',\n neuronId: this.opts.neuronId,\n inFlight: this.opts.inFlight(),\n sentAt: new Date().toISOString(),\n });\n } catch (err) {\n this.opts.logger?.warn({ err }, 'heartbeat post failed; will retry next tick');\n } finally {\n this.running = false;\n }\n }\n}\n","import type { NeuronLogger } from './types.js';\n\n/**\n * Silent logger used as a default when no consumer provides one. Single\n * shared instance to avoid each module defining its own copy.\n */\nexport const noopLogger: NeuronLogger = {\n debug() {},\n info() {},\n warn() {},\n error() {},\n};\n","/**\n * Minimal SSE (Server-Sent Events) parser. Consumes a `ReadableStream` of\n * UTF-8 bytes and yields parsed `event` / `data` frames.\n *\n * Wire format (RFC for SSE):\n * - Lines starting with `:` are comments (keep-alive pings).\n * - Lines `event: <name>` set the next event's name.\n * - Lines `data: <text>` accumulate into the data payload (joined by `\\n`).\n * - A blank line (`\\n\\n`) flushes the event.\n *\n * Default event name is `'message'` if no `event:` line precedes the data.\n */\n\nexport interface SSEEvent {\n event: string;\n data: string;\n}\n\nexport async function* parseSSEStream(\n stream: ReadableStream<Uint8Array>,\n signal?: AbortSignal,\n): AsyncGenerator<SSEEvent> {\n const reader = stream.getReader();\n const decoder = new TextDecoder();\n let buffer = '';\n\n const onAbort = () => {\n void reader.cancel().catch(() => undefined);\n };\n signal?.addEventListener('abort', onAbort);\n\n try {\n while (true) {\n if (signal?.aborted) return;\n const { value, done } = await reader.read();\n if (done) break;\n // Normalize CRLF/CR to LF up-front so block-separator detection\n // and per-line parsing only need to handle `\\n`.\n buffer += decoder.decode(value, { stream: true })\n .replace(/\\r\\n/g, '\\n')\n .replace(/\\r/g, '\\n');\n\n // Flush every complete event (terminated by blank line).\n let blockEnd: number;\n while ((blockEnd = buffer.indexOf('\\n\\n')) !== -1) {\n const block = buffer.slice(0, blockEnd);\n buffer = buffer.slice(blockEnd + 2);\n const event = parseBlock(block);\n if (event) yield event;\n }\n }\n\n // Per the SSE spec, an event is only complete when terminated by a\n // blank line. A non-empty buffer here means the connection dropped\n // mid-frame; drop it rather than yield a malformed event that\n // downstream parsing would reject and log anyway.\n } finally {\n signal?.removeEventListener('abort', onAbort);\n try {\n reader.releaseLock();\n } catch {\n // already released\n }\n }\n}\n\nfunction parseBlock(block: string): SSEEvent | null {\n if (!block.trim()) return null;\n\n let event = 'message';\n const dataLines: string[] = [];\n\n for (const rawLine of block.split('\\n')) {\n const line = rawLine.endsWith('\\r') ? rawLine.slice(0, -1) : rawLine;\n if (line.startsWith(':')) continue; // comment\n if (line.startsWith('event:')) {\n event = line.slice('event:'.length).trim();\n } else if (line.startsWith('data:')) {\n dataLines.push(line.slice('data:'.length).replace(/^ /, ''));\n }\n // ignore `id:` and `retry:` for now — gateway doesn't emit them\n }\n\n if (dataLines.length === 0) return null;\n return { event, data: dataLines.join('\\n') };\n}\n","import {\n SSE_PATH,\n ServerToNeuronFrameSchema,\n type PostPath,\n type ServerToNeuronFrame,\n} from '@workflow/neuron-protocol';\n\nimport { noopLogger } from './logger.js';\nimport { parseSSEStream } from './sse-parser.js';\nimport type { Transport, TransportCallbacks } from './transport.js';\nimport type { AuthCallback, ClientFrame, NeuronLogger } from './types.js';\n\nexport interface HttpTransportOptions {\n /** Base URL of the gateway (e.g. `https://bigbrain.holokai.dev`). */\n gatewayUrl: string;\n /** Stable per-process identifier sent as `?neuronId=` on the SSE GET. */\n neuronId: string;\n /** Token provider — called on every POST and SSE open; called again on 401 retry. */\n auth: AuthCallback;\n /** Logger; defaults to a silent no-op. */\n logger?: NeuronLogger;\n /**\n * Initial reconnect delay in ms. Doubles on each consecutive failure\n * up to `maxReconnectDelayMs`. Defaults: 500ms initial, 30s ceiling.\n */\n initialReconnectDelayMs?: number;\n maxReconnectDelayMs?: number;\n /** Override `fetch`. Defaults to global fetch (Node 20+ undici). */\n fetch?: typeof fetch;\n}\n\n/**\n * HTTP+SSE transport. Holds a single SSE stream open against the\n * gateway, parses inbound frames, exposes a typed `post(...)` for\n * outbound frames, and reconnects on disconnect with exponential backoff.\n *\n * Lifecycle:\n * - `start()` opens the SSE stream and resolves once the connection is\n * established. Reconnect logic kicks in if the stream drops.\n * - `post(path, frame)` sends an outbound frame; refreshes the token via\n * the auth callback on 401 and retries once.\n * - `stop()` aborts the SSE stream and prevents further reconnects.\n *\n * Note: `HttpTransport` does NOT call `register` itself — that's the\n * Neuron class's job, since register requires the SSE stream to already\n * exist (the gateway matches identity+neuronId between SSE pending stream\n * and register POST).\n */\nexport class HttpTransport implements Transport {\n private readonly opts: Required<Omit<HttpTransportOptions, 'logger' | 'fetch'>> & {\n logger: NeuronLogger;\n fetch: typeof fetch;\n };\n private callbacks: TransportCallbacks = {};\n\n private abortController: AbortController | null = null;\n private stopped = false;\n private connected = false;\n private reconnectAttempts = 0;\n private reconnectTimer: ReturnType<typeof setTimeout> | null = null;\n\n constructor(opts: HttpTransportOptions) {\n this.opts = {\n gatewayUrl: opts.gatewayUrl.replace(/\\/+$/, ''),\n neuronId: opts.neuronId,\n auth: opts.auth,\n initialReconnectDelayMs: opts.initialReconnectDelayMs ?? 500,\n maxReconnectDelayMs: opts.maxReconnectDelayMs ?? 30_000,\n logger: opts.logger ?? noopLogger,\n fetch: opts.fetch ?? globalThis.fetch.bind(globalThis),\n };\n }\n\n subscribe(callbacks: TransportCallbacks): void {\n this.callbacks = callbacks;\n }\n\n isConnected(): boolean {\n return this.connected;\n }\n\n /** Open the SSE stream. Resolves after the connection is established. */\n async start(): Promise<void> {\n this.stopped = false;\n await this.openStream();\n }\n\n /** Tear down the SSE stream and prevent further reconnect attempts. */\n async stop(): Promise<void> {\n this.stopped = true;\n if (this.reconnectTimer) {\n clearTimeout(this.reconnectTimer);\n this.reconnectTimer = null;\n }\n if (this.abortController) {\n this.abortController.abort();\n this.abortController = null;\n }\n this.connected = false;\n }\n\n /**\n * POST a client frame to the gateway. Refreshes the token via the auth\n * callback and retries once on 401 — that's the contract: callers\n * implement refresh inside their callback.\n */\n async post<T extends ClientFrame>(path: PostPath, frame: T): Promise<unknown> {\n return this.postRaw(path, frame, true);\n }\n\n private async postRaw(\n path: PostPath,\n frame: ClientFrame,\n allowRetry: boolean,\n ): Promise<unknown> {\n const token = await this.opts.auth();\n const url = `${this.opts.gatewayUrl}${path}`;\n const res = await this.opts.fetch(url, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n Authorization: `Bearer ${token}`,\n },\n body: JSON.stringify(frame),\n });\n\n if (res.status === 401 && allowRetry) {\n // Auth callback gets a chance to refresh; retry once.\n this.opts.logger.warn({ path }, 'gateway returned 401; retrying after auth refresh');\n return this.postRaw(path, frame, false);\n }\n\n if (!res.ok) {\n const text = await res.text().catch(() => '');\n throw new TransportError(\n `${path} failed: ${res.status} ${res.statusText}${text ? ` — ${text}` : ''}`,\n res.status,\n );\n }\n\n return res.headers.get('content-type')?.includes('application/json')\n ? await res.json()\n : await res.text();\n }\n\n private async openStream(allowAuthRetry = true): Promise<void> {\n if (this.stopped) return;\n const url = `${this.opts.gatewayUrl}${SSE_PATH}?neuronId=${encodeURIComponent(\n this.opts.neuronId,\n )}`;\n\n this.abortController = new AbortController();\n const signal = this.abortController.signal;\n\n let res: Response;\n try {\n const token = await this.opts.auth();\n res = await this.opts.fetch(url, {\n method: 'GET',\n headers: {\n Accept: 'text/event-stream',\n Authorization: `Bearer ${token}`,\n },\n signal,\n });\n } catch (err) {\n this.scheduleReconnect(`fetch error: ${(err as Error).message}`);\n return;\n }\n\n // 401 → give the auth callback one immediate retry to refresh the\n // token before falling back to the reconnect-with-backoff path.\n // Mirrors the POST behavior so consumers don't have to wait the\n // initial 500ms backoff just for a token refresh.\n if (res.status === 401 && allowAuthRetry) {\n this.opts.logger.warn(\n { reason: 'SSE 401' },\n 'SSE open returned 401; retrying after auth refresh',\n );\n this.abortController = null;\n void res.body?.cancel().catch(() => undefined);\n return this.openStream(false);\n }\n\n if (!res.ok || !res.body) {\n const reason = `SSE open failed: ${res.status} ${res.statusText}`;\n this.scheduleReconnect(reason);\n return;\n }\n\n this.connected = true;\n this.reconnectAttempts = 0;\n this.callbacks.onOpen?.();\n\n // Drive the parser in the background; openStream resolves once the\n // initial connection is established.\n void this.consumeStream(res.body, signal);\n }\n\n private async consumeStream(\n body: ReadableStream<Uint8Array>,\n signal: AbortSignal,\n ): Promise<void> {\n try {\n for await (const event of parseSSEStream(body, signal)) {\n let parsed: ServerToNeuronFrame;\n try {\n const data = JSON.parse(event.data);\n parsed = ServerToNeuronFrameSchema.parse(data);\n } catch (err) {\n this.opts.logger.warn(\n { err, event: event.event, data: event.data.slice(0, 200) },\n 'dropped malformed SSE frame',\n );\n continue;\n }\n this.callbacks.onFrame?.(parsed);\n }\n this.handleStreamEnd('clean close');\n } catch (err) {\n this.handleStreamEnd(`read error: ${(err as Error).message}`);\n }\n }\n\n private handleStreamEnd(reason: string): void {\n if (!this.connected) return;\n this.connected = false;\n this.abortController = null;\n this.callbacks.onClose?.(reason);\n if (!this.stopped) {\n this.scheduleReconnect(reason);\n }\n }\n\n private scheduleReconnect(reason: string): void {\n if (this.stopped) return;\n const attempt = this.reconnectAttempts++;\n const delay = Math.min(\n this.opts.maxReconnectDelayMs,\n this.opts.initialReconnectDelayMs * Math.pow(2, attempt),\n );\n this.opts.logger.warn(\n { reason, attempt: attempt + 1, delayMs: delay },\n 'transport reconnecting',\n );\n this.callbacks.onReconnecting?.({ attempt: attempt + 1, delayMs: delay, reason });\n this.reconnectTimer = setTimeout(() => {\n this.reconnectTimer = null;\n void this.openStream();\n }, delay);\n // Deliberately REF'D (HOL-3030). Between start() and stop() the\n // transport's contract is \"keep reconnecting\" — and for a standalone\n // neuron this timer is often the ONLY handle on the event loop while\n // disconnected. Unref'd, Node drained the loop and exited code 0\n // before the retry ever fired: core-neuron silently died on every\n // gateway bounce, removing all core/* capabilities from the org.\n // stop() clears the timer, so an embedding host that shuts down\n // cleanly is never pinned by it.\n }\n}\n\nexport class TransportError extends Error {\n constructor(message: string, public readonly statusCode: number) {\n super(message);\n this.name = 'TransportError';\n }\n}\n","import {\n POST_PATH,\n type JsonSchema,\n type LeasePayload,\n type NackKind,\n} from '@workflow/neuron-protocol';\nimport type { ZodType } from 'zod';\n\nimport type { SchemaValidator } from './schema-validator.js';\nimport type { Transport } from './transport.js';\nimport type { Handler, HandlerContext, NeuronLogger } from './types.js';\n\n/**\n * Internal exception used by `ctx.fail()` to short-circuit the handler\n * with a non-retryable nack. Caught by the runner; consumers should not\n * catch it.\n */\nclass TerminalFailure extends Error {\n constructor(\n public readonly reason: string,\n public readonly code?: string,\n ) {\n super(reason);\n this.name = 'TerminalFailure';\n }\n}\n\n/**\n * Drives one lease end-to-end:\n *\n * 1. Validate `lease.task.input` against the capability's own schema —\n * the zod schema from `defineCapability` if there is one, otherwise\n * the JSON Schema passed to `neuron.handle(registration, fn)`. zod\n * wins because JSON Schema can't express `.refine()`, `.transform()`,\n * or `.preprocess()`, and silently dropping them would be a footgun.\n * A capability registered with neither schema is not validated.\n *\n * The schemas riding on the lease frame are deliberately NOT consulted\n * (HOL-2913). They can only ever be the neuron's own schemas handed\n * back to it: the register frame carries none, so the server's only\n * source is the `POST /plan` handler catalog the client supplies.\n * Worse, the planner never persists those onto task rows — nothing in\n * the repo writes `task.inputSchema`/`outputSchema` — so on real\n * workflow tasks the lease frame's schemas are always absent. The only\n * populated case is the dev-only `/__dev__/inject-task` route, where\n * neuron-tester echoes back the capability's registered schemas.\n *\n * Note this means client-side validation is the ONLY validation that\n * runs. The gateway's ack check (`routes/ack.ts`) validates against\n * that same empty `lease.outputSchema`, so it is a no-op in practice.\n * 2. Build the handler context — typed input, AbortSignal, logger,\n * progress callback, terminal-fail helper.\n * 3. Invoke the handler.\n * 4. Validate the return value the same way (zod first, then JSON Schema).\n * 5. Send `ack` (success) with the output.\n *\n * Error classification:\n * - `AbortError` from the signal → `nack(kind='cancelled')` (benign,\n * orchestrator already knows about it).\n * - `TerminalFailure` (from `ctx.fail`) → `nack(kind='terminal')`.\n * - Anything else → `nack(kind='retryable')`. The gateway publishes a\n * retryable failure `TaskResultMessage` and the result-processor\n * decides whether to redispatch based on\n * `task.retry.maxRetries` — see HOL-546. Retry policy lives on the\n * workflow, never on the SDK side.\n */\nexport interface RunLeaseOptions {\n lease: LeasePayload;\n handler: Handler;\n /** Original zod schemas from `defineCapability`. Take precedence over\n * the JSON Schemas below. */\n zodInput?: ZodType<unknown>;\n zodOutput?: ZodType<unknown>;\n /**\n * JSON Schemas the caller registered for this capability — passed to\n * `neuron.handle(registration, fn)`, or derived from the zod schemas on a\n * `CapabilityDef`. Used when no zod schema is available; absent means no\n * validation for that direction.\n */\n inputSchema?: JsonSchema;\n outputSchema?: JsonSchema;\n transport: Transport;\n validator: SchemaValidator;\n logger: NeuronLogger;\n /** Externally-controlled abort signal for cancel and shutdown. */\n signal: AbortSignal;\n /** How long one progress POST may take before the runner gives up on it and sends the next. */\n progressTimeoutMs?: number;\n}\n\nconst DEFAULT_PROGRESS_TIMEOUT_MS = 5_000;\n\ninterface ValidationResult {\n ok: boolean;\n errors?: unknown;\n /** zod may transform the value during parsing; pass the parsed result on. */\n value?: unknown;\n}\n\nfunction validateInput(\n zod: ZodType<unknown> | undefined,\n validator: SchemaValidator,\n jsonSchema: unknown,\n data: unknown,\n): ValidationResult {\n if (zod) {\n const result = zod.safeParse(data);\n return result.success\n ? { ok: true, value: result.data }\n : { ok: false, errors: result.error.issues };\n }\n const errors = validator.validate(\n jsonSchema as Parameters<SchemaValidator['validate']>[0],\n data,\n );\n return errors === null ? { ok: true, value: data } : { ok: false, errors };\n}\n\nexport async function runLease(opts: RunLeaseOptions): Promise<void> {\n const {\n lease,\n handler,\n zodInput,\n zodOutput,\n inputSchema,\n outputSchema,\n transport,\n validator,\n logger,\n signal,\n progressTimeoutMs = DEFAULT_PROGRESS_TIMEOUT_MS,\n } = opts;\n\n // Input validation against the capability's own schema. Prefer zod; fall\n // back to ajv on the registered JSON Schema. `lease.inputSchema` is\n // intentionally ignored — see the note on this function.\n const inputCheck = validateInput(zodInput, validator, inputSchema, lease.task.input);\n if (!inputCheck.ok) {\n await sendNack(\n transport,\n lease.leaseId,\n 'schema-mismatch',\n 'lease input does not match inputSchema',\n { code: 'INPUT_SCHEMA_MISMATCH', details: { errors: inputCheck.errors } },\n logger,\n );\n return;\n }\n // Use the parsed value — zod transforms run here so handlers see the\n // post-transform shape (e.g., trimmed strings, defaulted fields).\n const parsedInput = inputCheck.value;\n\n const reporter = makeProgressReporter(transport, lease.leaseId, logger, signal, progressTimeoutMs);\n const ctx: HandlerContext = {\n task: lease.task,\n leaseId: lease.leaseId,\n signal,\n log: scopedLogger(logger, lease),\n progress: reporter.progress,\n fail: (reason, opts) => {\n throw new TerminalFailure(reason, opts?.code);\n },\n };\n\n let output: unknown;\n try {\n output = await handler(parsedInput, ctx);\n } catch (err) {\n const cancelled = signal.aborted || (err as Error).name === 'AbortError';\n // The lease closes at its ack/nack, so progress still queued must reach\n // the gateway first or it lands on a lease that no longer exists. A\n // cancelled lease nacks at once instead.\n if (!cancelled) await reporter.drained();\n if (cancelled) {\n await sendNack(\n transport,\n lease.leaseId,\n 'cancelled',\n 'handler aborted',\n { code: 'CANCELLED' },\n logger,\n );\n return;\n }\n if (err instanceof TerminalFailure) {\n await sendNack(\n transport,\n lease.leaseId,\n 'terminal',\n err.reason,\n { code: err.code ?? 'HANDLER_TERMINAL' },\n logger,\n );\n return;\n }\n const message = err instanceof Error ? err.message : String(err);\n logger.error({ err, leaseId: lease.leaseId }, 'handler threw; nacking retryable');\n await sendNack(\n transport,\n lease.leaseId,\n 'retryable',\n message,\n { code: 'HANDLER_THREW' },\n logger,\n );\n return;\n }\n\n await reporter.drained();\n\n // Output validation. Same precedence as the input above.\n const outputCheck = validateInput(zodOutput, validator, outputSchema, output);\n if (!outputCheck.ok) {\n await sendNack(\n transport,\n lease.leaseId,\n 'schema-mismatch',\n 'handler output does not match outputSchema',\n { code: 'OUTPUT_SCHEMA_MISMATCH', details: { errors: outputCheck.errors } },\n logger,\n );\n return;\n }\n // Parsed (post-transform) output goes on the wire so the gateway sees\n // the same shape the zod contract describes.\n const parsedOutput = outputCheck.value;\n\n await transport\n .post(POST_PATH.ack, {\n type: 'ack',\n leaseId: lease.leaseId,\n output: parsedOutput,\n completedAt: new Date().toISOString(),\n })\n .catch((err) => {\n // 4xx (e.g., SCHEMA_MISMATCH) signals the gateway rejected our\n // ack; 5xx (e.g., RESULT_PUBLISH_FAILED) signals a downstream\n // failure. Either way the lease is effectively lost — log loudly\n // so consumers can correlate with their gateway logs.\n logger.warn(\n { err, leaseId: lease.leaseId },\n 'ack POST rejected by gateway; lease will be reclaimed by reaper',\n );\n });\n}\n\nasync function sendNack(\n transport: Transport,\n leaseId: string,\n kind: NackKind,\n reason: string,\n extras: { code?: string; details?: unknown } = {},\n logger?: NeuronLogger,\n): Promise<void> {\n await transport\n .post(POST_PATH.nack, {\n type: 'nack',\n leaseId,\n kind,\n reason,\n code: extras.code,\n details: extras.details,\n failedAt: new Date().toISOString(),\n })\n .catch((err) => {\n logger?.warn(\n { err, leaseId, kind },\n 'nack POST rejected by gateway; lease will be reclaimed by reaper',\n );\n });\n}\n\n/**\n * A lease's progress sender. Frames go out one at a time in call order: each\n * POST waits for the previous one to settle, so pieces a handler streams (a\n * model's thinking, numbered by `seq`) reach the gateway, and every bus\n * subscriber, in the order they were sent. Each POST is bounded by\n * `timeoutMs`, so a gateway that never answers slows the queue instead of\n * stalling the lease, and once the lease is cancelled no queued frame that\n * has not started goes out. `drained` resolves once every queued frame has\n * settled.\n */\nfunction makeProgressReporter(\n transport: Transport,\n leaseId: string,\n logger: NeuronLogger,\n signal: AbortSignal,\n timeoutMs: number,\n): { progress: HandlerContext['progress']; drained: () => Promise<void> } {\n let tail: Promise<void> = Promise.resolve();\n return {\n progress: (update) => {\n const frame = {\n type: 'progress' as const,\n leaseId,\n percent: update.percent,\n message: update.message,\n data: update.data,\n sentAt: new Date().toISOString(),\n };\n tail = tail.then(async () => {\n if (signal.aborted) return;\n try {\n await withTimeout(transport.post(POST_PATH.progress, frame), timeoutMs);\n } catch (err) {\n logger.warn({ err, leaseId }, 'progress POST failed; continuing');\n }\n });\n },\n drained: () => tail,\n };\n}\n\nfunction withTimeout<T>(work: Promise<T>, ms: number): Promise<T> {\n let timer: ReturnType<typeof setTimeout> | undefined;\n const timeout = new Promise<never>((_resolve, reject) => {\n timer = setTimeout(() => reject(new Error(`timed out after ${ms}ms`)), ms);\n });\n return Promise.race([work, timeout]).finally(() => clearTimeout(timer));\n}\n\nfunction scopedLogger(logger: NeuronLogger, lease: LeasePayload): NeuronLogger {\n const scope = { leaseId: lease.leaseId, taskId: lease.task.taskId };\n return {\n debug: (meta, msg) => logger.debug({ ...scope, ...meta }, msg),\n info: (meta, msg) => logger.info({ ...scope, ...meta }, msg),\n warn: (meta, msg) => logger.warn({ ...scope, ...meta }, msg),\n error: (meta, msg) => logger.error({ ...scope, ...meta }, msg),\n };\n}\n","import AjvDefault, { type ErrorObject, type ValidateFunction } from 'ajv';\nimport addFormatsDefault from 'ajv-formats';\nimport type { JsonSchema } from '@workflow/neuron-protocol';\n\n// ajv and ajv-formats ship CJS-only. Under Node16 ESM resolution,\n// `import X from 'pkg'` may give us either the default export or the\n// whole module namespace depending on how the bundler/runtime resolved\n// it. Normalize to the actual constructor / function so we work in both\n// Node ESM and bundled-browser contexts.\ntype AjvCtor = new (opts?: object) => import('ajv').default;\ntype AddFormatsFn = (ajv: import('ajv').default, opts?: unknown) => unknown;\n\nconst Ajv: AjvCtor =\n ((AjvDefault as unknown) as { default?: AjvCtor }).default ??\n (AjvDefault as unknown as AjvCtor);\nconst addFormats: AddFormatsFn =\n ((addFormatsDefault as unknown) as { default?: AddFormatsFn }).default ??\n (addFormatsDefault as unknown as AddFormatsFn);\n\n/**\n * Compiles JSON Schemas once and caches by reference. Mirror of the\n * gateway-side OutputValidator — both ends of the wire validate against\n * the same schemas so a misbehaving party can't sneak by either side.\n */\nexport class SchemaValidator {\n private readonly ajv: import('ajv').default;\n private readonly cache = new WeakMap<object, ValidateFunction>();\n // Schemas whose compilation threw. Cannot-compile is an environment or\n // schema-authoring problem, not evidence about the data — so validate()\n // FAILS OPEN for these (returns null) instead of reporting a mismatch.\n // Nacking on compile failure turned every lease into an\n // INPUT_SCHEMA_MISMATCH retry loop on runtimes where ajv's codegen is\n // unavailable (Electron renderers with CSP `script-src 'self'` block\n // `new Function`) — HOL-2937.\n private readonly uncompilable = new WeakSet<object>();\n\n constructor(private readonly onCompileError?: (message: string) => void) {\n this.ajv = new Ajv({ allErrors: true, strict: false });\n addFormats(this.ajv);\n }\n\n /**\n * Returns null if the value matches the schema, no schema was given, or\n * the schema cannot be compiled in this runtime (fail-open — the gateway\n * remains the enforcement point); otherwise an array of structured errors.\n */\n validate(schema: JsonSchema | undefined, data: unknown): ErrorObject[] | null {\n if (!schema || typeof schema !== 'object') return null;\n if (this.uncompilable.has(schema as object)) return null;\n\n let validator = this.cache.get(schema as object);\n if (!validator) {\n try {\n validator = this.ajv.compile(schema as object);\n } catch (err) {\n this.uncompilable.add(schema as object);\n this.onCompileError?.(\n `schema failed to compile — skipping SDK-side validation for this schema: ${\n err instanceof Error ? err.message : String(err)\n }`,\n );\n return null;\n }\n this.cache.set(schema as object, validator);\n }\n\n // After the get/compile branch above, validator is guaranteed set.\n const v = validator as ValidateFunction;\n const ok = v(data);\n return ok ? null : v.errors ?? [];\n }\n}\n","/**\n * Per-capability concurrency limiter. Bounds the number of in-flight\n * handler invocations locally even if the gateway overshoots prefetch — a\n * misbehaving gateway should never push past the contract.\n *\n * Pools are created per (neuron, capability) and live for the duration of\n * the SDK's session. Drain support (used by `neuron.stop({ drain: true })`)\n * resolves once all in-flight tasks have completed; new submissions during\n * drain are rejected with `ShutdownError`.\n */\nexport class WorkerPool {\n private inFlight = 0;\n private queue: Array<() => void> = [];\n private draining = false;\n private drained: { resolve: () => void; promise: Promise<void> } | null = null;\n\n constructor(private maxConcurrency: number) {\n if (maxConcurrency <= 0) {\n throw new Error(\n `WorkerPool requires positive concurrency, got ${maxConcurrency}`,\n );\n }\n }\n\n /** Currently-running task count. */\n size(): number {\n return this.inFlight;\n }\n\n /** Tasks waiting for a slot. */\n pending(): number {\n return this.queue.length;\n }\n\n /**\n * Run `fn` once a concurrency slot is available. Resolves with the\n * function's return value (or rejects with its error). Throws\n * ShutdownError if the pool is already draining.\n */\n async run<T>(fn: () => Promise<T>): Promise<T> {\n if (this.draining) {\n throw new ShutdownError('worker pool is draining');\n }\n\n if (this.inFlight >= this.maxConcurrency) {\n await new Promise<void>((resolve) => this.queue.push(resolve));\n }\n\n this.inFlight++;\n try {\n return await fn();\n } finally {\n this.inFlight--;\n const next = this.queue.shift();\n if (next) {\n next();\n } else if (this.draining && this.inFlight === 0 && this.drained) {\n this.drained.resolve();\n }\n }\n }\n\n /**\n * Update the max concurrency. Lowering doesn't kill in-flight tasks —\n * they finish naturally — but it does prevent new ones from starting\n * until the in-flight count drops below the new limit.\n */\n setConcurrency(newMax: number): void {\n if (newMax <= 0) {\n throw new Error(\n `WorkerPool concurrency must be positive, got ${newMax}`,\n );\n }\n const oldMax = this.maxConcurrency;\n this.maxConcurrency = newMax;\n // If raising, release waiting tasks up to the new headroom.\n if (newMax > oldMax) {\n const headroom = newMax - this.inFlight;\n for (let i = 0; i < headroom && this.queue.length > 0; i++) {\n const next = this.queue.shift();\n next?.();\n }\n }\n }\n\n /**\n * Stop accepting new submissions. Returns a promise that resolves once\n * every in-flight AND queued task has finished — queued waiters from\n * before drain are released as in-flight slots free, run normally, and\n * are awaited as part of drain. Only fresh `run()` calls received after\n * `drain()` reject with ShutdownError. Callers that need a hard stop\n * should race this promise against a timeout and abort handlers.\n */\n drain(): Promise<void> {\n if (!this.draining) {\n this.draining = true;\n let resolveFn!: () => void;\n const promise = new Promise<void>((resolve) => {\n resolveFn = resolve;\n });\n this.drained = { resolve: resolveFn, promise };\n if (this.inFlight === 0) {\n resolveFn();\n }\n }\n return this.drained!.promise;\n }\n}\n\nexport class ShutdownError extends Error {\n constructor(message: string) {\n super(message);\n this.name = 'ShutdownError';\n }\n}\n","import {\n POST_PATH,\n PROTOCOL_VERSION,\n SSE_EVENT,\n type Capability,\n type HeartbeatInFlightEntry,\n type JsonSchema,\n type LeasePayload,\n type ServerToNeuronFrame,\n} from '@workflow/neuron-protocol';\n// eventemitter3 ships both a default and a named export of the same\n// class. Using the named import sidesteps a TS issue under Node16 ESM\n// resolution where the default-imported symbol is treated as a\n// namespace and isn't usable as a base class.\nimport { EventEmitter } from 'eventemitter3';\n\nimport {\n type CapabilityDef,\n toRegistrationCapability,\n} from './capability-def.js';\nimport { HeartbeatLoop } from './heartbeat.js';\nimport { HttpTransport } from './http-transport.js';\nimport { runLease } from './lease-runner.js';\nimport { noopLogger } from './logger.js';\nimport { SchemaValidator } from './schema-validator.js';\nimport type { Transport } from './transport.js';\nimport { ShutdownError, WorkerPool } from './worker-pool.js';\nimport type {\n AuthCallback,\n CapabilityHandleOptions,\n CapabilityRegistration,\n Handler,\n NeuronLogger,\n} from './types.js';\n\n/**\n * Public event surface. The `Neuron` class extends `EventEmitter<NeuronEvents>`\n * from `eventemitter3` so consumers can subscribe with the familiar\n * `.on() / .once() / .off()` API:\n *\n * neuron.on('frame', (frame) => log.append(frame));\n * neuron.once('connection:registered', ({ sessionId }) => mountUI(sessionId));\n * const off = neuron.on('error', captureError);\n * off();\n *\n * Two flavors:\n *\n * - `frame` — a pass-through of the gateway's `/neuron/events` SSE stream.\n * Fires for every parsed `ServerToNeuronFrame`, including ones for\n * which no handler is registered. Useful for live event logs,\n * observability, and the neuron-tester debug UI.\n *\n * - `connection:*` and `error` — synthetic, SDK-generated. Mirror the\n * transport's lifecycle (SSE handshake, register acceptance, close,\n * reconnect scheduling).\n *\n * Adding new events is intentionally cheap — extend `NeuronEvents` and emit\n * from inside the class. Future entries (e.g. `'workflow:task-completed'`\n * for sibling-neuron notifications) slot in without breaking subscribers.\n */\nexport interface NeuronEvents {\n /** Fired after the SSE handshake succeeds, before register is posted. */\n 'connection:open': () => void;\n /** Fired after the gateway accepts the register frame. */\n 'connection:registered': (info: {\n sessionId: string;\n capabilities: number;\n }) => void;\n /** Fired when the SSE stream closes — clean shutdown or transient error. */\n 'connection:close': (reason: string) => void;\n /** Fired when a reconnect is scheduled, before the backoff delay elapses. */\n 'connection:reconnecting': (info: {\n attempt: number;\n delayMs: number;\n reason: string;\n }) => void;\n /**\n * Fired on transport / parse errors (reconnect handling is automatic)\n * and on register rejection (HOL-2926 — NOT automatically recovered:\n * the SSE stream stays open, so the neuron sits connected but\n * lease-less until the app reacts, e.g. by calling `stop()`).\n */\n error: (err: Error) => void;\n /** Pass-through of every parsed inbound SSE frame. */\n frame: (frame: ServerToNeuronFrame) => void;\n}\n\n/**\n * Options shared by both `NeuronOptions` shapes.\n */\ninterface NeuronCommonOptions {\n /**\n * Stable per-process identifier. Reused across reconnects so the\n * gateway can correlate the new session with the same neuron. SDK does\n * NOT generate one for you — pick something stable per device/process\n * (UUID stored on disk for desktop, hostname+pid for server).\n */\n neuronId: string;\n /** Logger; defaults to a silent no-op. */\n logger?: NeuronLogger;\n /** Heartbeat interval (ms). Default 10s. */\n heartbeatIntervalMs?: number;\n}\n\n/**\n * Power-user shape — bring your own `Transport`. Used when the default\n * HTTP+SSE transport doesn't fit, e.g. a renderer-process neuron in\n * Electron embedding BigBrain in main, where leases arrive over IPC.\n */\nexport interface NeuronOptionsWithTransport extends NeuronCommonOptions {\n transport: Transport;\n}\n\n/**\n * Convenience shape — provide gateway URL + auth, the SDK builds an\n * `HttpTransport` for you. The most common path; matches the v1 SDK\n * surface so existing call sites keep compiling unchanged.\n */\nexport interface NeuronOptionsWithHttp extends NeuronCommonOptions {\n /** Base URL of the gateway, e.g. `https://bigbrain.holokai.dev`. */\n gatewayUrl: string;\n /** Token provider — see `AuthCallback` for refresh semantics. */\n auth: AuthCallback;\n /** Initial reconnect delay (ms). Default 500ms. */\n initialReconnectDelayMs?: number;\n /** Max reconnect delay (ms). Default 30s. */\n maxReconnectDelayMs?: number;\n /** Override `fetch`; mainly for tests. */\n fetch?: typeof fetch;\n}\n\nexport type NeuronOptions = NeuronOptionsWithTransport | NeuronOptionsWithHttp;\n\nfunction isWithTransport(opts: NeuronOptions): opts is NeuronOptionsWithTransport {\n return 'transport' in opts && opts.transport !== undefined;\n}\n\ninterface RegisteredHandler {\n capability: Capability;\n /**\n * JSON Schemas for this capability — derived from the zod schemas on a\n * `CapabilityDef`, or supplied verbatim on the legacy\n * `CapabilityRegistration` shape. These are what the lease runner\n * validates against; the schemas on the lease frame are ignored\n * (HOL-2913).\n */\n inputSchema?: JsonSchema;\n outputSchema?: JsonSchema;\n /**\n * Original zod schemas from `defineCapability`. When set, these are the\n * canonical validators — JSON Schema is only the wire artifact and\n * silently loses zod features like `.refine()`, `.transform()`, and\n * `.preprocess()`. Absent when the legacy `handle(registration, fn)`\n * shape was used.\n */\n zodInput?: import('zod').ZodType<unknown>;\n zodOutput?: import('zod').ZodType<unknown>;\n handler: Handler;\n pool: WorkerPool;\n}\n\n/**\n * Public SDK class. Compose:\n *\n * const neuron = new Neuron({ gatewayUrl, neuronId, auth: () => token });\n * neuron.handle({ type: 'core/script.python', scope: 'any', concurrency: 4 }, handler);\n * neuron.on('connection:registered', ({ sessionId }) => log(sessionId));\n * await neuron.start();\n * ...\n * await neuron.stop({ drain: true, timeoutMs: 30_000 });\n *\n * See `NeuronEvents` for the full set of subscribable events.\n */\nexport class Neuron extends EventEmitter<NeuronEvents> {\n private readonly transport: Transport;\n private readonly handlers = new Map<string, RegisteredHandler>();\n private readonly inFlightLeases = new Map<\n string,\n { taskId: string; startedAt: string; abort: AbortController }\n >();\n /**\n * Leases admitted by `dispatchLease` but still waiting for a worker-pool\n * slot. Tracked separately from `inFlightLeases` so the heartbeat snapshot\n * doesn't lie — only running leases extend the gateway's lease TTL.\n */\n private readonly queuedLeases = new Map<string, { abort: AbortController }>();\n private readonly heartbeat: HeartbeatLoop;\n private readonly validator: SchemaValidator;\n private readonly logger: NeuronLogger;\n private readonly neuronId: string;\n\n private started = false;\n private stopping = false;\n private hasOpenedOnce = false;\n\n constructor(opts: NeuronOptions) {\n super();\n this.logger = opts.logger ?? noopLogger;\n this.neuronId = opts.neuronId;\n this.validator = new SchemaValidator((message) =>\n this.logger.warn({ neuronId: this.neuronId }, message),\n );\n\n this.transport = isWithTransport(opts)\n ? opts.transport\n : new HttpTransport({\n gatewayUrl: opts.gatewayUrl,\n neuronId: opts.neuronId,\n auth: opts.auth,\n logger: this.logger,\n initialReconnectDelayMs: opts.initialReconnectDelayMs,\n maxReconnectDelayMs: opts.maxReconnectDelayMs,\n fetch: opts.fetch,\n });\n\n // Single-subscriber callback model — Neuron is the only thing that\n // ever subscribes to a transport, so wiring lifecycle events through\n // this method (instead of an emitter) keeps transport implementations\n // free of any event-library dependency.\n this.transport.subscribe({\n onOpen: () => {\n this.emit('connection:open');\n void this.handleConnectionOpen();\n },\n onClose: (reason) => {\n this.handleConnectionClose(reason);\n this.emit('connection:close', reason);\n },\n onFrame: (frame) => this.handleFrame(frame),\n onError: (err) => {\n this.logger.error({ err }, 'transport error');\n this.emit('error', err);\n },\n onReconnecting: (info) => this.emit('connection:reconnecting', info),\n });\n\n this.heartbeat = new HeartbeatLoop({\n transport: this.transport,\n neuronId: opts.neuronId,\n inFlight: () => this.snapshotInFlight(),\n intervalMs: opts.heartbeatIntervalMs,\n logger: this.logger,\n });\n }\n\n /**\n * Register a handler for a capability. Must be called before `start()`;\n * the gateway expects the full capability list in the register frame.\n *\n * Three call shapes:\n *\n * neuron.handle(capDef, fn) // typed via defineCapability defaults\n * neuron.handle(capDef, opts, fn) // typed; override scope/concurrency\n * neuron.handle(capabilityRegistration, fn) // legacy/low-level: explicit JSON Schemas\n *\n * If called twice for the same capability before start, the second call\n * replaces the first. After start, use `updateCapability` to adjust\n * concurrency at runtime.\n */\n handle<TIn, TOut>(def: CapabilityDef<TIn, TOut>, handler: Handler<TIn, TOut>): void;\n handle<TIn, TOut>(\n def: CapabilityDef<TIn, TOut>,\n opts: CapabilityHandleOptions,\n handler: Handler<TIn, TOut>,\n ): void;\n handle(reg: CapabilityRegistration, handler: Handler): void;\n handle(\n defOrReg: CapabilityDef | CapabilityRegistration,\n optsOrHandler: CapabilityHandleOptions | Handler,\n maybeHandler?: Handler,\n ): void {\n if (this.started) {\n throw new Error(\n 'Neuron.handle() must be called before start(). Use updateCapability(...) for runtime changes.',\n );\n }\n\n const isCapDef = '_zod' in defOrReg;\n\n let capability: Capability;\n let inputSchema: JsonSchema | undefined;\n let outputSchema: JsonSchema | undefined;\n let zodInput: import('zod').ZodType<unknown> | undefined;\n let zodOutput: import('zod').ZodType<unknown> | undefined;\n let handler: Handler;\n\n if (isCapDef) {\n const def = defOrReg as CapabilityDef;\n let opts: CapabilityHandleOptions | undefined;\n if (typeof optsOrHandler === 'function') {\n handler = optsOrHandler;\n } else {\n opts = optsOrHandler;\n if (!maybeHandler) {\n throw new Error('Neuron.handle(def, opts, fn): handler is required');\n }\n handler = maybeHandler;\n }\n capability = toRegistrationCapability(def, opts);\n inputSchema = def.inputSchema;\n outputSchema = def.outputSchema;\n zodInput = def._zod.input;\n zodOutput = def._zod.output;\n } else {\n const reg = defOrReg as CapabilityRegistration;\n if (typeof optsOrHandler !== 'function') {\n throw new Error(\n 'Neuron.handle(registration, fn): expected handler function as second argument',\n );\n }\n handler = optsOrHandler;\n // The legacy shape's schemas (and description, if set) ride along on\n // the wire capability too (HOL-2926) — the gateway forwards them to\n // Moku's capability catalog. Spread conditionally: the wire schema is\n // strict() and `key: undefined` is not the same as an absent key for\n // JSON round-trips.\n capability = {\n type: reg.type,\n scope: reg.scope,\n concurrency: reg.concurrency,\n ...(reg.description !== undefined ? { description: reg.description } : {}),\n ...(reg.inputSchema !== undefined ? { inputSchema: reg.inputSchema } : {}),\n ...(reg.outputSchema !== undefined ? { outputSchema: reg.outputSchema } : {}),\n ...(typeof reg.leaseTtlMs === 'number' ? { leaseTtlMs: reg.leaseTtlMs } : {}),\n };\n inputSchema = reg.inputSchema;\n outputSchema = reg.outputSchema;\n }\n\n this.handlers.set(capability.type, {\n capability,\n inputSchema,\n outputSchema,\n zodInput,\n zodOutput,\n handler,\n pool: new WorkerPool(capability.concurrency),\n });\n }\n\n /**\n * Adjust an already-registered capability's concurrency at runtime and\n * notify the gateway via an `update-capability` frame so prefetch can be\n * tuned. Schema and handler are not replaced — re-register before start\n * if those need to change.\n */\n async updateCapability(\n reg: Pick<CapabilityRegistration, 'type' | 'concurrency'>,\n ): Promise<void> {\n const entry = this.handlers.get(reg.type);\n if (!entry) {\n throw new Error(\n `updateCapability: no handler registered for ${reg.type}`,\n );\n }\n entry.capability = { ...entry.capability, concurrency: reg.concurrency };\n entry.pool.setConcurrency(reg.concurrency);\n\n if (this.started && this.transport.isConnected()) {\n await this.transport\n .post(POST_PATH.updateCapability, {\n type: 'update-capability',\n neuronId: this.neuronId,\n capability: entry.capability,\n })\n .catch((err) => {\n this.logger.warn(\n { err, capability: reg.type },\n 'update-capability POST failed; gateway will pick up new value on next reconnect',\n );\n });\n }\n }\n\n /**\n * Open the SSE stream, post register with all advertised capabilities,\n * and start the heartbeat loop. Resolves once the gateway accepts the\n * register frame.\n */\n async start(): Promise<void> {\n if (this.started) return;\n if (this.handlers.size === 0) {\n throw new Error(\n 'Neuron.start() requires at least one handler — call Neuron.handle(...) first.',\n );\n }\n this.started = true;\n await this.transport.start();\n // `handleConnectionOpen` runs in the background to post register;\n // its completion is signalled by the `registered` SSE frame, which\n // we don't strictly need to wait for here. start() returning means\n // the SSE is open and register has been issued.\n }\n\n /**\n * Refuse new leases, drain in-flight handlers up to `timeoutMs`, then\n * tear down the connection. Pending leases (queued but not started)\n * are abandoned — the gateway's lease TTL will reclaim them.\n */\n async stop(opts: { drain?: boolean; timeoutMs?: number } = {}): Promise<void> {\n if (this.stopping) return;\n this.stopping = true;\n const drain = opts.drain ?? true;\n const timeoutMs = opts.timeoutMs ?? 30_000;\n\n this.heartbeat.stop();\n\n if (drain) {\n const drainPromises = Array.from(this.handlers.values()).map((h) =>\n h.pool.drain(),\n );\n const allDrained = Promise.all(drainPromises);\n const timeout = new Promise<void>((resolve) => {\n const t = setTimeout(() => {\n this.logger.warn({ timeoutMs }, 'drain timeout exceeded; aborting in-flight leases');\n for (const inFlight of this.inFlightLeases.values()) {\n inFlight.abort.abort();\n }\n for (const queued of this.queuedLeases.values()) {\n queued.abort.abort();\n }\n resolve();\n }, timeoutMs);\n if (typeof t.unref === 'function') t.unref();\n });\n await Promise.race([allDrained, timeout]);\n } else {\n for (const inFlight of this.inFlightLeases.values()) {\n inFlight.abort.abort();\n }\n for (const queued of this.queuedLeases.values()) {\n queued.abort.abort();\n }\n }\n\n await this.transport.stop();\n }\n\n // ----- internals ----------------------------------------------------\n\n private snapshotInFlight(): HeartbeatInFlightEntry[] {\n return Array.from(this.inFlightLeases.entries()).map(([leaseId, info]) => ({\n leaseId,\n taskId: info.taskId,\n startedAt: info.startedAt,\n }));\n }\n\n private async handleConnectionOpen(): Promise<void> {\n try {\n await this.postRegister();\n this.hasOpenedOnce = true;\n this.heartbeat.start();\n } catch (err) {\n const cause = err instanceof Error ? err : new Error(String(err));\n this.logger.error(\n { err: cause },\n 'register POST rejected; SSE is open but the neuron is NOT registered and will receive no leases',\n );\n // Surface the rejection to the application (HOL-2926). A permanent\n // rejection — e.g. INVALID_FRAME from a gateway that predates fields\n // this SDK sends — leaves the SSE stream open, so nothing reconnects\n // and nothing retries: without this event the neuron dies silently\n // with only a log line. Subscribers can stop()/alert/fall back.\n // Matches the existing `error` idiom (transport/parse errors emit the\n // same event); `start()`'s resolve semantics are unchanged.\n this.emit(\n 'error',\n new Error(`registration rejected by gateway: ${cause.message}`, { cause }),\n );\n }\n }\n\n private handleConnectionClose(reason: string): void {\n this.logger.warn({ reason }, 'transport disconnected');\n this.heartbeat.stop();\n }\n\n private async postRegister(): Promise<void> {\n await this.transport.post(POST_PATH.register, {\n type: 'register',\n neuronId: this.neuronId,\n protocolVersion: PROTOCOL_VERSION,\n capabilities: Array.from(this.handlers.values()).map((h) => h.capability),\n });\n }\n\n private handleFrame(frame: ServerToNeuronFrame): void {\n // Pass-through firehose first, so subscribers see every frame even\n // for types the SDK handles internally (lease/cancel) — useful for\n // observability and the neuron-tester debug log.\n this.emit('frame', frame);\n\n switch (frame.type) {\n case 'registered':\n this.logger.info(\n { sessionId: frame.sessionId, capabilities: frame.capabilities.length },\n 'gateway accepted registration',\n );\n this.emit('connection:registered', {\n sessionId: frame.sessionId,\n capabilities: frame.capabilities.length,\n });\n return;\n case 'lease':\n void this.dispatchLease(frame.lease);\n return;\n case 'cancel':\n this.handleCancel(frame.leaseId, frame.reason);\n return;\n case 'capability-revoked':\n this.logger.warn(\n { capability: frame.capability, reason: frame.reason },\n 'capability revoked by gateway',\n );\n return;\n case 'disconnect':\n this.logger.info({ reason: frame.reason, code: frame.code }, 'gateway disconnect');\n return;\n }\n }\n\n private async dispatchLease(lease: LeasePayload): Promise<void> {\n const handler = this.handlers.get(lease.task.capability);\n if (!handler) {\n this.logger.warn(\n { capability: lease.task.capability, leaseId: lease.leaseId },\n 'no handler registered for lease capability; nacking retryable',\n );\n await this.transport\n .post(POST_PATH.nack, {\n type: 'nack',\n leaseId: lease.leaseId,\n kind: 'retryable',\n reason: 'no handler registered for capability',\n failedAt: new Date().toISOString(),\n })\n .catch(() => undefined);\n return;\n }\n\n const abort = new AbortController();\n // Track as queued until pool admits us. Heartbeats only report\n // running leases (via inFlightLeases) so the gateway's reaper isn't\n // misled into renewing a TTL on work that hasn't started.\n this.queuedLeases.set(lease.leaseId, { abort });\n\n try {\n await handler.pool.run(async () => {\n this.queuedLeases.delete(lease.leaseId);\n this.inFlightLeases.set(lease.leaseId, {\n taskId: lease.task.taskId,\n startedAt: new Date().toISOString(),\n abort,\n });\n try {\n await runLease({\n lease,\n handler: handler.handler,\n zodInput: handler.zodInput,\n zodOutput: handler.zodOutput,\n inputSchema: handler.inputSchema,\n outputSchema: handler.outputSchema,\n transport: this.transport,\n validator: this.validator,\n logger: this.logger,\n signal: abort.signal,\n });\n } finally {\n this.inFlightLeases.delete(lease.leaseId);\n }\n });\n } catch (err) {\n this.queuedLeases.delete(lease.leaseId);\n if (err instanceof ShutdownError) {\n // Pool refused before we could start — explicit retryable nack so\n // the broker can redeliver immediately rather than waiting for\n // the gateway's lease TTL to expire.\n this.logger.info(\n { leaseId: lease.leaseId },\n 'lease refused during shutdown; nacking retryable',\n );\n await this.transport\n .post(POST_PATH.nack, {\n type: 'nack',\n leaseId: lease.leaseId,\n kind: 'retryable',\n reason: 'neuron shutting down',\n failedAt: new Date().toISOString(),\n })\n .catch(() => undefined);\n } else {\n this.logger.error({ err, leaseId: lease.leaseId }, 'unhandled lease runner error');\n }\n }\n }\n\n private handleCancel(leaseId: string, reason: string): void {\n const tracked =\n this.inFlightLeases.get(leaseId) ?? this.queuedLeases.get(leaseId);\n if (!tracked) {\n this.logger.warn(\n { leaseId, reason },\n 'cancel for unknown lease; ignoring (already completed?)',\n );\n return;\n }\n this.logger.info({ leaseId, reason }, 'cancelling lease');\n tracked.abort.abort();\n }\n}\n\n/** SSE event names re-exported for tests / consumers that want to match\n * by name without importing the protocol package. */\nexport const SSE_EVENT_NAMES = SSE_EVENT;\n"]}
1
+ {"version":3,"sources":["../../neuron-protocol/src/capability.ts","../../neuron-protocol/src/lease.ts","../../neuron-protocol/src/frames.ts","../../neuron-protocol/src/transport.ts","../src/capability-def.ts","../src/heartbeat.ts","../src/logger.ts","../src/sse-parser.ts","../src/http-transport.ts","../src/lease-runner.ts","../src/schema-validator.ts","../src/worker-pool.ts","../src/neuron.ts"],"names":["z","zodToJsonSchema","opts","AjvDefault","addFormatsDefault","EventEmitter"],"mappings":"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","file":"index.js","sourcesContent":["import type { CapabilityScope, CapabilityType, JsonSchema, UserId } from '@workflow/core';\nimport { z } from 'zod';\n\n// The TS type aliases (CapabilityType, UserId, CapabilityScope) live in\n// `@workflow/core/types/neuron-primitives` so core can reference them\n// without depending on this package — see commit history for the layering\n// rationale. Runtime validation (regex, structural checks) stays here.\n\n// Namespaced capability type: \"owner/package[/name][.variant]\". Each segment\n// allows alphanumerics + `.` `_` `-` (case-insensitive — real identifiers\n// like ULIDs in `user/{userId}/...` and `org/{orgId}/...` segments are\n// uppercase). Examples: \"core/script.python\", \"desktop/mcp/drive.read\",\n// \"org/01HBQ8ZK3F5N1G4WQR8YZB5MTC/custom\", \"user/{userId}/mytool\".\nexport const CapabilityTypeSchema = z\n .string()\n .min(1)\n .regex(\n /^[A-Za-z0-9_.\\-]+(\\/[A-Za-z0-9_.\\-]+)+$/,\n 'capability type must be namespaced: {owner}/{package}[/{name}][.{variant}]',\n ) satisfies z.ZodType<CapabilityType>;\n\nexport const UserIdSchema = z.string().min(1) satisfies z.ZodType<UserId>;\n\n// A skill (HOL-4326) is a capability type namespaced under `skill/` that\n// composes other capability types to carry out one recurring job. The\n// prefix is also what `composes` on `CapabilitySchema` below is gated on.\nexport const SKILL_CAPABILITY_PREFIX = 'skill/';\n\nexport function isSkillCapabilityType(type: string): boolean {\n return type.startsWith(SKILL_CAPABILITY_PREFIX);\n}\n\n// `composes` bound: generous enough for a real recurring job, small enough\n// that a register frame can't smuggle in an unbounded array.\nexport const MAX_COMPOSED_CAPABILITIES = 64;\n\n// JSON Schema travels on the wire as opaque data; the SDK/gateway validate\n// task inputs/outputs against it without re-parsing the schema here. Lives\n// here (not lease.ts) since HOL-2926 — `Capability` needs it too and\n// lease.ts already imports from this module.\nexport const JsonSchemaSchema = z.unknown() satisfies z.ZodType<JsonSchema>;\n\nexport const CapabilityScopeSchema = z.union([\n z.literal('any'),\n z.object({ onBehalfOf: UserIdSchema }).strict(),\n]) satisfies z.ZodType<CapabilityScope>;\n\nexport const CapabilitySchema = z\n .object({\n type: CapabilityTypeSchema,\n scope: CapabilityScopeSchema,\n concurrency: z.number().int().positive(),\n /**\n * Plain-language contract advertisement (HOL-2926). All three fields\n * are optional and additive: older neurons keep sending\n * `{ type, scope, concurrency }` and the gateway accepts both shapes.\n * When present they flow (fire-and-forget) to Moku's\n * `capability_catalog` so registry-sourced capabilities render with a\n * real contract in the supervisor catalog instead of type-only stubs.\n *\n * Omit rather than null — the fields are `.optional()`, not\n * `.nullable()`, and a `null` description fails validation.\n */\n description: z.string().optional(),\n /**\n * JSON Schema for the capability's input payload — opaque on the wire,\n * but `null` is rejected: the reconcile push to Moku is last-writer-wins\n * per present key, so a null here could wipe a stored schema.\n * (`description` already rejects null via `z.string()`.)\n */\n // The `: boolean` return annotations stop TS (5.5+) from inferring the\n // lambdas as type predicates, which would narrow the field from\n // `unknown` to `{}` and ripple into every consumer.\n inputSchema: JsonSchemaSchema.refine(\n (v): boolean => v !== null,\n 'omit inputSchema instead of sending null',\n ).optional(),\n /** JSON Schema for the capability's output payload — same rules as inputSchema. */\n outputSchema: JsonSchemaSchema.refine(\n (v): boolean => v !== null,\n 'omit outputSchema instead of sending null',\n ).optional(),\n /**\n * Per-capability lease TTL override in milliseconds (HOL-356).\n * The gateway uses this when minting a lease's `expiresAt`; absent\n * → falls back to the gateway's default (`leaseTtlMs` on the\n * dispatcher). Lets a slow capability (e.g. a scripted run with a\n * 10-minute deadline) declare a longer TTL without tuning the\n * whole gateway.\n *\n * Bounded by reasonable extremes: at least 1s (anything shorter\n * than a heartbeat is meaningless) and at most 1h (the reaper +\n * heartbeat budget should be the limiter, not a single\n * capability).\n */\n leaseTtlMs: z.number().int().min(1_000).max(60 * 60 * 1_000).optional(),\n /**\n * Capability types this `skill/*` capability composes (HOL-4326).\n * Only valid on a `skill/*` type — enforced below, since a non-skill\n * type carrying `composes` is a modeling error the gateway should\n * reject rather than silently ignore.\n */\n composes: z\n .array(CapabilityTypeSchema)\n .min(1)\n .max(MAX_COMPOSED_CAPABILITIES)\n .refine(\n (types) => new Set(types).size === types.length,\n 'composes must not contain duplicate capability types',\n )\n .refine(\n (types) => types.every((t) => !isSkillCapabilityType(t)),\n 'composes must not contain skill/* capability types',\n )\n .optional(),\n })\n .strict()\n .superRefine((cap, ctx) => {\n if (cap.composes !== undefined && !isSkillCapabilityType(cap.type)) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n message: 'composes is only valid on a skill/* capability type',\n path: ['composes'],\n });\n }\n });\nexport type Capability = z.infer<typeof CapabilitySchema>;\n\n// Re-export the primitive type aliases so consumers can keep importing\n// CapabilityType / UserId / CapabilityScope from `@workflow/neuron-protocol`\n// alongside the wire schemas.\nexport type { CapabilityScope, CapabilityType, UserId };\n","import type { JsonSchema, LeaseId } from '@workflow/core';\nimport { z } from 'zod';\nimport { CapabilityTypeSchema, JsonSchemaSchema, UserIdSchema } from './capability.js';\n\n// JsonSchemaSchema moved to capability.ts (HOL-2926 — `Capability` needs it\n// too); re-exported here so existing lease-centric imports keep working.\nexport { JsonSchemaSchema };\nexport const LeaseIdSchema = z.string().min(1) satisfies z.ZodType<LeaseId>;\n\n// Re-export the primitive type aliases so consumers can keep importing\n// JsonSchema / LeaseId from `@workflow/neuron-protocol`.\nexport type { JsonSchema, LeaseId };\n\nexport const TaskPayloadSchema = z\n .object({\n taskId: z.string().min(1),\n workflowId: z.string().min(1),\n capability: CapabilityTypeSchema,\n onBehalfOf: UserIdSchema.optional(),\n input: z.unknown(),\n attempt: z.number().int().nonnegative(),\n metadata: z.record(z.string(), z.unknown()).optional(),\n })\n .strict();\nexport type TaskPayload = z.infer<typeof TaskPayloadSchema>;\n\nexport const LeasePayloadSchema = z\n .object({\n leaseId: LeaseIdSchema,\n expiresAt: z.string().datetime(),\n task: TaskPayloadSchema,\n inputSchema: JsonSchemaSchema,\n outputSchema: JsonSchemaSchema,\n })\n .strict();\nexport type LeasePayload = z.infer<typeof LeasePayloadSchema>;\n","import { z } from 'zod';\nimport { CapabilitySchema, CapabilityTypeSchema } from './capability.js';\nimport { LeaseIdSchema, LeasePayloadSchema } from './lease.js';\n\nexport const NeuronIdSchema = z.string().min(1);\nexport type NeuronId = z.infer<typeof NeuronIdSchema>;\n\n// ===================================================================\n// Neuron → Server frames (sent via HTTPS POST to POST_PATH.*).\n// ===================================================================\n\nexport const RegisterFrameSchema = z\n .object({\n type: z.literal('register'),\n neuronId: NeuronIdSchema,\n // Free-form by design — the gateway records this verbatim and performs\n // no version negotiation; compatibility comes from additive-only frame\n // evolution (see PROTOCOL_VERSION in transport.ts). Do not pin this to\n // the exported constant.\n protocolVersion: z.string().min(1),\n capabilities: z\n .array(CapabilitySchema)\n .min(1)\n .refine(\n (caps) => new Set(caps.map((c) => c.type)).size === caps.length,\n 'duplicate capability types are not allowed in a single register frame',\n ),\n })\n .strict();\nexport type RegisterFrame = z.infer<typeof RegisterFrameSchema>;\n\n// Modifies an existing advertisement (matched by capability.type) — typically\n// to change concurrency (e.g., desktop plugged in) or scope. To stop\n// advertising a capability the neuron must disconnect and re-register without\n// it; server-initiated revocation uses the capability-revoked frame.\n// Concurrency must remain > 0 by design — capability-pause is not a state.\nexport const UpdateCapabilityFrameSchema = z\n .object({\n type: z.literal('update-capability'),\n neuronId: NeuronIdSchema,\n capability: CapabilitySchema,\n })\n .strict();\nexport type UpdateCapabilityFrame = z.infer<typeof UpdateCapabilityFrameSchema>;\n\nexport const HeartbeatInFlightEntrySchema = z\n .object({\n leaseId: LeaseIdSchema,\n taskId: z.string().min(1),\n startedAt: z.string().datetime(),\n })\n .strict();\nexport type HeartbeatInFlightEntry = z.infer<typeof HeartbeatInFlightEntrySchema>;\n\nexport const HeartbeatFrameSchema = z\n .object({\n type: z.literal('heartbeat'),\n neuronId: NeuronIdSchema,\n inFlight: z.array(HeartbeatInFlightEntrySchema),\n sentAt: z.string().datetime(),\n })\n .strict();\nexport type HeartbeatFrame = z.infer<typeof HeartbeatFrameSchema>;\n\nexport const AckFrameSchema = z\n .object({\n type: z.literal('ack'),\n leaseId: LeaseIdSchema,\n output: z.unknown(),\n completedAt: z.string().datetime(),\n })\n .strict();\nexport type AckFrame = z.infer<typeof AckFrameSchema>;\n\nexport const NackKindSchema = z.enum([\n 'retryable',\n 'terminal',\n 'schema-mismatch',\n 'cancelled',\n]);\nexport type NackKind = z.infer<typeof NackKindSchema>;\n\nexport const NackFrameSchema = z\n .object({\n type: z.literal('nack'),\n leaseId: LeaseIdSchema,\n kind: NackKindSchema,\n reason: z.string().min(1),\n code: z.string().optional(),\n details: z.unknown().optional(),\n failedAt: z.string().datetime(),\n })\n .strict();\nexport type NackFrame = z.infer<typeof NackFrameSchema>;\n\nexport const ProgressFrameSchema = z\n .object({\n type: z.literal('progress'),\n leaseId: LeaseIdSchema,\n percent: z.number().min(0).max(100).optional(),\n message: z.string().optional(),\n data: z.unknown().optional(),\n sentAt: z.string().datetime(),\n })\n .strict();\nexport type ProgressFrame = z.infer<typeof ProgressFrameSchema>;\n\nexport const NeuronToServerFrameSchema = z.discriminatedUnion('type', [\n RegisterFrameSchema,\n UpdateCapabilityFrameSchema,\n HeartbeatFrameSchema,\n AckFrameSchema,\n NackFrameSchema,\n ProgressFrameSchema,\n]);\nexport type NeuronToServerFrame = z.infer<typeof NeuronToServerFrameSchema>;\n\n// ===================================================================\n// Server → Neuron frames (delivered on the SSE_PATH event stream;\n// each frame's `type` matches its SSE event name).\n// ===================================================================\n\nexport const RegisteredFrameSchema = z\n .object({\n type: z.literal('registered'),\n sessionId: z.string().min(1),\n // Effective capability bindings after auth + policy filters; may be a\n // subset of what the neuron advertised.\n capabilities: z.array(CapabilitySchema),\n acceptedAt: z.string().datetime(),\n })\n .strict();\nexport type RegisteredFrame = z.infer<typeof RegisteredFrameSchema>;\n\nexport const LeaseFrameSchema = z\n .object({\n type: z.literal('lease'),\n lease: LeasePayloadSchema,\n sentAt: z.string().datetime(),\n })\n .strict();\nexport type LeaseFrame = z.infer<typeof LeaseFrameSchema>;\n\nexport const CancelFrameSchema = z\n .object({\n type: z.literal('cancel'),\n leaseId: LeaseIdSchema,\n reason: z.string().min(1),\n cancelledAt: z.string().datetime(),\n })\n .strict();\nexport type CancelFrame = z.infer<typeof CancelFrameSchema>;\n\nexport const CapabilityRevokedFrameSchema = z\n .object({\n type: z.literal('capability-revoked'),\n capability: CapabilityTypeSchema,\n reason: z.string().min(1),\n revokedAt: z.string().datetime(),\n })\n .strict();\nexport type CapabilityRevokedFrame = z.infer<typeof CapabilityRevokedFrameSchema>;\n\nexport const DisconnectFrameSchema = z\n .object({\n type: z.literal('disconnect'),\n reason: z.string().min(1),\n code: z.string().optional(),\n reconnectable: z.boolean(),\n sentAt: z.string().datetime(),\n })\n .strict();\nexport type DisconnectFrame = z.infer<typeof DisconnectFrameSchema>;\n\nexport const ServerToNeuronFrameSchema = z.discriminatedUnion('type', [\n RegisteredFrameSchema,\n LeaseFrameSchema,\n CancelFrameSchema,\n CapabilityRevokedFrameSchema,\n DisconnectFrameSchema,\n]);\nexport type ServerToNeuronFrame = z.infer<typeof ServerToNeuronFrameSchema>;\n\n// ===================================================================\n// Any frame (convenience union for generic dispatch/logging).\n// ===================================================================\n\nexport const FrameSchema = z.discriminatedUnion('type', [\n RegisterFrameSchema,\n UpdateCapabilityFrameSchema,\n HeartbeatFrameSchema,\n AckFrameSchema,\n NackFrameSchema,\n ProgressFrameSchema,\n RegisteredFrameSchema,\n LeaseFrameSchema,\n CancelFrameSchema,\n CapabilityRevokedFrameSchema,\n DisconnectFrameSchema,\n]);\nexport type Frame = z.infer<typeof FrameSchema>;\n","// Wire-protocol version. Major bump on breaking changes to frame shapes;\n// minor bump on additive/optional changes.\n// Note: RegisterFrame.protocolVersion is intentionally a free-form string and\n// is NOT pinned to this constant. The gateway records it verbatim and\n// performs NO version negotiation today — compatibility rests on frames\n// evolving additively (old senders keep working because new fields are\n// optional). The inverse is NOT guaranteed: frames are validated strictly,\n// so a sender using new optional fields needs a gateway that already knows\n// them — deploy the gateway before releasing SDKs that send new fields.\n//\n// 1.1.0 (HOL-2926): Capability gains optional `description` /\n// `inputSchema` / `outputSchema` so neurons can advertise their contract.\n// Gateways older than HOL-2926 reject register frames that carry them.\n// 1.2.0 (HOL-4326): Capability gains optional `composes` — additive, same shape as 1.1.0's bump.\nexport const PROTOCOL_VERSION = '1.2.0';\n\n// Server-Sent Events endpoint (server → neuron stream).\nexport const SSE_PATH = '/neuron/events';\n\n// SSE event names used on the stream.\nexport const SSE_EVENT = {\n registered: 'registered',\n lease: 'lease',\n cancel: 'cancel',\n capabilityRevoked: 'capability-revoked',\n disconnect: 'disconnect',\n} as const;\nexport type SSEEvent = (typeof SSE_EVENT)[keyof typeof SSE_EVENT];\n\n// HTTP POST endpoints (neuron → server commands). Correlation back to the\n// SSE stream is by the authenticated session, not by path.\nexport const POST_PATH = {\n register: '/neuron/register',\n updateCapability: '/neuron/update-capability',\n heartbeat: '/neuron/heartbeat',\n ack: '/neuron/ack',\n nack: '/neuron/nack',\n progress: '/neuron/progress',\n} as const;\nexport type PostPath = (typeof POST_PATH)[keyof typeof POST_PATH];\n","/**\n * `defineCapability` — single source of truth for a capability's contract.\n *\n * One object carries everything a neuron and a planner need to know about a\n * capability: namespaced type, human-readable description, typed input and\n * output schemas, and (optionally) deployment defaults like scope and\n * concurrency. The SDK serializes only the fields each endpoint cares\n * about — plan-time gets the contract, registration gets the deployment.\n *\n * Why one object: users don't have to juggle a \"plan-time def\" vs a\n * \"registration-time def\". Defaults set on the def can still be overridden\n * at `neuron.handle(...)` time per deployment (e.g., desktop vs server).\n */\nimport type { Capability, JsonSchema } from '@workflow/neuron-protocol';\nimport type { z } from 'zod';\nimport { zodToJsonSchema } from 'zod-to-json-schema';\n\nimport type { CapabilityHandleOptions } from './types.js';\n\nexport interface CapabilityDefInit<TIn extends z.ZodTypeAny, TOut extends z.ZodTypeAny> {\n /** Namespaced capability type, e.g. `core/script.python`. */\n type: string;\n /**\n * Plain-language description shown to the planner LLM. Required at\n * plan-time so the model can choose this capability appropriately.\n */\n description: string;\n /** Zod schema for the capability's input payload. */\n input: TIn;\n /** Zod schema for the capability's output payload. */\n output: TOut;\n /**\n * Optional deployment defaults. All can be overridden at\n * `neuron.handle(def, opts, fn)` time.\n */\n scope?: Capability['scope'];\n concurrency?: number;\n /**\n * Per-capability lease TTL override in milliseconds (HOL-356).\n * Flows through the register frame to the gateway, which uses it\n * when minting a lease's `expiresAt` for this capability instead of\n * its own default. Useful when one capability runs much longer than\n * the rest of a neuron's repertoire (e.g. a sandboxed Python script\n * with a 10-minute deadline) — set this rather than tuning the\n * gateway-wide default for everyone.\n *\n * Bounded `[1_000, 3_600_000]` (1s..1h) by `CapabilitySchema`.\n */\n leaseTtlMs?: number;\n /**\n * Capability types this `skill/*` capability composes (HOL-4326). Only\n * valid when `type` is namespaced `skill/*` — enforced by\n * `CapabilitySchema` on the gateway.\n */\n composes?: readonly string[];\n}\n\n/**\n * A typed capability definition. The phantom `_input` / `_output` fields\n * carry the inferred TS types so `neuron.handle(def, fn)` can constrain\n * `fn`'s argument and return type.\n *\n * Internal serializers (`toPlanShape`, `toRegistrationCapability`) keep the\n * \"send only what the endpoint needs\" rule in one place — endpoints get\n * the right subset and never accidentally see the wrong fields.\n */\nexport interface CapabilityDef<TIn = unknown, TOut = unknown> {\n readonly type: string;\n readonly description: string;\n /** Compiled JSON Schema — derived once at definition time. */\n readonly inputSchema: JsonSchema;\n readonly outputSchema: JsonSchema;\n readonly scope?: Capability['scope'];\n readonly concurrency?: number;\n /** See {@link CapabilityDefInit.leaseTtlMs}. */\n readonly leaseTtlMs?: number;\n /** See {@link CapabilityDefInit.composes}. */\n readonly composes?: readonly string[];\n /** Original zod schemas — kept for runtime validation in handlers if needed. */\n readonly _zod: { input: z.ZodType<TIn>; output: z.ZodType<TOut> };\n /** Phantom type carriers — never read at runtime. */\n readonly _input?: TIn;\n readonly _output?: TOut;\n}\n\n/**\n * Plan-request shape: `{ type, description, input, output }`. Scope and\n * concurrency are intentionally dropped — they're per-deployment and\n * don't belong in the planner's catalog.\n */\nexport interface CapabilityPlanShape {\n type: string;\n description: string;\n input: JsonSchema;\n output: JsonSchema;\n}\n\nexport function defineCapability<TIn extends z.ZodTypeAny, TOut extends z.ZodTypeAny>(\n init: CapabilityDefInit<TIn, TOut>,\n): CapabilityDef<z.infer<TIn>, z.infer<TOut>> {\n return {\n type: init.type,\n description: init.description,\n inputSchema: zodToJsonSchema(init.input, { $refStrategy: 'none' }) as JsonSchema,\n outputSchema: zodToJsonSchema(init.output, { $refStrategy: 'none' }) as JsonSchema,\n scope: init.scope,\n concurrency: init.concurrency,\n leaseTtlMs: init.leaseTtlMs,\n composes: init.composes,\n _zod: { input: init.input, output: init.output },\n };\n}\n\n/** Render the def for inclusion in a `POST /plan` catalog. */\nexport function toPlanShape(def: CapabilityDef): CapabilityPlanShape {\n return {\n type: def.type,\n description: def.description,\n input: def.inputSchema,\n output: def.outputSchema,\n };\n}\n\n/**\n * Render the registration `Capability` frame for the gateway. `opts`\n * overrides any defaults set on the def. `scope` and `concurrency` are\n * required at registration time — if neither the def nor `opts` provides\n * them, this throws so the misconfiguration surfaces at start time\n * rather than as a confusing wire-validation error.\n *\n * Since HOL-2926 the frame also carries the contract (`description` +\n * compiled JSON Schemas): the gateway forwards it to Moku's capability\n * catalog so registry-sourced capabilities render with a real contract\n * in the supervisor catalog instead of type-only stubs.\n */\nexport function toRegistrationCapability(\n def: CapabilityDef,\n opts?: CapabilityHandleOptions,\n): Capability {\n const scope = opts?.scope ?? def.scope;\n const concurrency = opts?.concurrency ?? def.concurrency;\n if (!scope) {\n throw new Error(\n `capability ${def.type}: scope is required for registration — set it on defineCapability(...) or at neuron.handle(def, { scope }, fn)`,\n );\n }\n if (typeof concurrency !== 'number') {\n throw new Error(\n `capability ${def.type}: concurrency is required for registration — set it on defineCapability(...) or at neuron.handle(def, { concurrency }, fn)`,\n );\n }\n // leaseTtlMs is purely additive — only included on the wire when the\n // def actually set it. Spreading conditionally keeps the strict()\n // schema happy and keeps the wire frame small for capabilities that\n // don't care.\n const leaseTtlMs = opts?.leaseTtlMs ?? def.leaseTtlMs;\n // composes is purely additive too — only included on the wire when the\n // def or opts actually set it (HOL-4326), same reasoning as leaseTtlMs.\n const composes = opts?.composes ?? def.composes;\n return {\n type: def.type,\n scope,\n concurrency,\n // Contract advertisement (HOL-2926). `description` is required on the\n // def, so it is always present here; `opts.description` lets a\n // deployment reword it without redefining the capability.\n description: opts?.description ?? def.description,\n inputSchema: def.inputSchema,\n outputSchema: def.outputSchema,\n ...(typeof leaseTtlMs === 'number' ? { leaseTtlMs } : {}),\n ...(composes !== undefined ? { composes: [...composes] } : {}),\n };\n}\n","import { POST_PATH, type HeartbeatInFlightEntry } from '@workflow/neuron-protocol';\n\nimport type { Transport } from './transport.js';\nimport type { NeuronLogger } from './types.js';\n\nexport interface HeartbeatLoopOptions {\n transport: Transport;\n /** Stable per-process neuron identifier (matches the SSE `?neuronId=`). */\n neuronId: string;\n /** Returns the current in-flight lease list at heartbeat time. */\n inFlight: () => HeartbeatInFlightEntry[];\n /** Interval in ms between heartbeats. Default 10s. */\n intervalMs?: number;\n logger?: NeuronLogger;\n}\n\nconst DEFAULT_INTERVAL_MS = 10_000;\n\n/**\n * Periodic heartbeat loop. Posts the current in-flight lease list so the\n * gateway:\n * 1. Knows the session is alive (bumps `last_heartbeat_at`).\n * 2. Renews lease expiries so the reaper doesn't reclaim long-running\n * tasks.\n *\n * The loop is paused while the transport is disconnected (between SSE\n * drop and reconnect). Once `start()` resumes after a reconnect, the\n * next interval tick fires immediately so the gateway sees we're back.\n */\nexport class HeartbeatLoop {\n private timer: NodeJS.Timeout | null = null;\n private running = false;\n private readonly intervalMs: number;\n\n constructor(private readonly opts: HeartbeatLoopOptions) {\n this.intervalMs = opts.intervalMs ?? DEFAULT_INTERVAL_MS;\n }\n\n start(): void {\n if (this.timer) return;\n this.timer = setInterval(() => {\n void this.tick();\n }, this.intervalMs);\n // Deliberately REF'D (HOL-3030) — same ref-while-started semantics\n // as the transport's reconnect timer: while the neuron is started,\n // the SDK keeps the process alive; stop() clears the interval.\n }\n\n stop(): void {\n if (this.timer) {\n clearInterval(this.timer);\n this.timer = null;\n }\n }\n\n /** Public for tests so they don't have to wait for the timer. */\n async tick(): Promise<void> {\n if (this.running) return;\n if (!this.opts.transport.isConnected()) return;\n this.running = true;\n try {\n await this.opts.transport.post(POST_PATH.heartbeat, {\n type: 'heartbeat',\n neuronId: this.opts.neuronId,\n inFlight: this.opts.inFlight(),\n sentAt: new Date().toISOString(),\n });\n } catch (err) {\n this.opts.logger?.warn({ err }, 'heartbeat post failed; will retry next tick');\n } finally {\n this.running = false;\n }\n }\n}\n","import type { NeuronLogger } from './types.js';\n\n/**\n * Silent logger used as a default when no consumer provides one. Single\n * shared instance to avoid each module defining its own copy.\n */\nexport const noopLogger: NeuronLogger = {\n debug() {},\n info() {},\n warn() {},\n error() {},\n};\n","/**\n * Minimal SSE (Server-Sent Events) parser. Consumes a `ReadableStream` of\n * UTF-8 bytes and yields parsed `event` / `data` frames.\n *\n * Wire format (RFC for SSE):\n * - Lines starting with `:` are comments (keep-alive pings).\n * - Lines `event: <name>` set the next event's name.\n * - Lines `data: <text>` accumulate into the data payload (joined by `\\n`).\n * - A blank line (`\\n\\n`) flushes the event.\n *\n * Default event name is `'message'` if no `event:` line precedes the data.\n */\n\nexport interface SSEEvent {\n event: string;\n data: string;\n}\n\nexport async function* parseSSEStream(\n stream: ReadableStream<Uint8Array>,\n signal?: AbortSignal,\n): AsyncGenerator<SSEEvent> {\n const reader = stream.getReader();\n const decoder = new TextDecoder();\n let buffer = '';\n\n const onAbort = () => {\n void reader.cancel().catch(() => undefined);\n };\n signal?.addEventListener('abort', onAbort);\n\n try {\n while (true) {\n if (signal?.aborted) return;\n const { value, done } = await reader.read();\n if (done) break;\n // Normalize CRLF/CR to LF up-front so block-separator detection\n // and per-line parsing only need to handle `\\n`.\n buffer += decoder.decode(value, { stream: true })\n .replace(/\\r\\n/g, '\\n')\n .replace(/\\r/g, '\\n');\n\n // Flush every complete event (terminated by blank line).\n let blockEnd: number;\n while ((blockEnd = buffer.indexOf('\\n\\n')) !== -1) {\n const block = buffer.slice(0, blockEnd);\n buffer = buffer.slice(blockEnd + 2);\n const event = parseBlock(block);\n if (event) yield event;\n }\n }\n\n // Per the SSE spec, an event is only complete when terminated by a\n // blank line. A non-empty buffer here means the connection dropped\n // mid-frame; drop it rather than yield a malformed event that\n // downstream parsing would reject and log anyway.\n } finally {\n signal?.removeEventListener('abort', onAbort);\n try {\n reader.releaseLock();\n } catch {\n // already released\n }\n }\n}\n\nfunction parseBlock(block: string): SSEEvent | null {\n if (!block.trim()) return null;\n\n let event = 'message';\n const dataLines: string[] = [];\n\n for (const rawLine of block.split('\\n')) {\n const line = rawLine.endsWith('\\r') ? rawLine.slice(0, -1) : rawLine;\n if (line.startsWith(':')) continue; // comment\n if (line.startsWith('event:')) {\n event = line.slice('event:'.length).trim();\n } else if (line.startsWith('data:')) {\n dataLines.push(line.slice('data:'.length).replace(/^ /, ''));\n }\n // ignore `id:` and `retry:` for now — gateway doesn't emit them\n }\n\n if (dataLines.length === 0) return null;\n return { event, data: dataLines.join('\\n') };\n}\n","import {\n SSE_PATH,\n ServerToNeuronFrameSchema,\n type PostPath,\n type ServerToNeuronFrame,\n} from '@workflow/neuron-protocol';\n\nimport { noopLogger } from './logger.js';\nimport { parseSSEStream } from './sse-parser.js';\nimport type { Transport, TransportCallbacks } from './transport.js';\nimport type { AuthCallback, ClientFrame, NeuronLogger } from './types.js';\n\nexport interface HttpTransportOptions {\n /** Base URL of the gateway (e.g. `https://bigbrain.holokai.dev`). */\n gatewayUrl: string;\n /** Stable per-process identifier sent as `?neuronId=` on the SSE GET. */\n neuronId: string;\n /** Token provider — called on every POST and SSE open; called again on 401 retry. */\n auth: AuthCallback;\n /** Logger; defaults to a silent no-op. */\n logger?: NeuronLogger;\n /**\n * Initial reconnect delay in ms. Doubles on each consecutive failure\n * up to `maxReconnectDelayMs`. Defaults: 500ms initial, 30s ceiling.\n */\n initialReconnectDelayMs?: number;\n maxReconnectDelayMs?: number;\n /** Override `fetch`. Defaults to global fetch (Node 20+ undici). */\n fetch?: typeof fetch;\n}\n\n/**\n * HTTP+SSE transport. Holds a single SSE stream open against the\n * gateway, parses inbound frames, exposes a typed `post(...)` for\n * outbound frames, and reconnects on disconnect with exponential backoff.\n *\n * Lifecycle:\n * - `start()` opens the SSE stream and resolves once the connection is\n * established. Reconnect logic kicks in if the stream drops.\n * - `post(path, frame)` sends an outbound frame; refreshes the token via\n * the auth callback on 401 and retries once.\n * - `stop()` aborts the SSE stream and prevents further reconnects.\n *\n * Note: `HttpTransport` does NOT call `register` itself — that's the\n * Neuron class's job, since register requires the SSE stream to already\n * exist (the gateway matches identity+neuronId between SSE pending stream\n * and register POST).\n */\nexport class HttpTransport implements Transport {\n private readonly opts: Required<Omit<HttpTransportOptions, 'logger' | 'fetch'>> & {\n logger: NeuronLogger;\n fetch: typeof fetch;\n };\n private callbacks: TransportCallbacks = {};\n\n private abortController: AbortController | null = null;\n private stopped = false;\n private connected = false;\n private reconnectAttempts = 0;\n private reconnectTimer: ReturnType<typeof setTimeout> | null = null;\n\n constructor(opts: HttpTransportOptions) {\n this.opts = {\n gatewayUrl: opts.gatewayUrl.replace(/\\/+$/, ''),\n neuronId: opts.neuronId,\n auth: opts.auth,\n initialReconnectDelayMs: opts.initialReconnectDelayMs ?? 500,\n maxReconnectDelayMs: opts.maxReconnectDelayMs ?? 30_000,\n logger: opts.logger ?? noopLogger,\n fetch: opts.fetch ?? globalThis.fetch.bind(globalThis),\n };\n }\n\n subscribe(callbacks: TransportCallbacks): void {\n this.callbacks = callbacks;\n }\n\n isConnected(): boolean {\n return this.connected;\n }\n\n /** Open the SSE stream. Resolves after the connection is established. */\n async start(): Promise<void> {\n this.stopped = false;\n await this.openStream();\n }\n\n /** Tear down the SSE stream and prevent further reconnect attempts. */\n async stop(): Promise<void> {\n this.stopped = true;\n if (this.reconnectTimer) {\n clearTimeout(this.reconnectTimer);\n this.reconnectTimer = null;\n }\n if (this.abortController) {\n this.abortController.abort();\n this.abortController = null;\n }\n this.connected = false;\n }\n\n /**\n * POST a client frame to the gateway. Refreshes the token via the auth\n * callback and retries once on 401 — that's the contract: callers\n * implement refresh inside their callback.\n */\n async post<T extends ClientFrame>(path: PostPath, frame: T): Promise<unknown> {\n return this.postRaw(path, frame, true);\n }\n\n private async postRaw(\n path: PostPath,\n frame: ClientFrame,\n allowRetry: boolean,\n ): Promise<unknown> {\n const token = await this.opts.auth();\n const url = `${this.opts.gatewayUrl}${path}`;\n const res = await this.opts.fetch(url, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n Authorization: `Bearer ${token}`,\n },\n body: JSON.stringify(frame),\n });\n\n if (res.status === 401 && allowRetry) {\n // Auth callback gets a chance to refresh; retry once.\n this.opts.logger.warn({ path }, 'gateway returned 401; retrying after auth refresh');\n return this.postRaw(path, frame, false);\n }\n\n if (!res.ok) {\n const text = await res.text().catch(() => '');\n throw new TransportError(\n `${path} failed: ${res.status} ${res.statusText}${text ? ` — ${text}` : ''}`,\n res.status,\n );\n }\n\n return res.headers.get('content-type')?.includes('application/json')\n ? await res.json()\n : await res.text();\n }\n\n private async openStream(allowAuthRetry = true): Promise<void> {\n if (this.stopped) return;\n const url = `${this.opts.gatewayUrl}${SSE_PATH}?neuronId=${encodeURIComponent(\n this.opts.neuronId,\n )}`;\n\n this.abortController = new AbortController();\n const signal = this.abortController.signal;\n\n let res: Response;\n try {\n const token = await this.opts.auth();\n res = await this.opts.fetch(url, {\n method: 'GET',\n headers: {\n Accept: 'text/event-stream',\n Authorization: `Bearer ${token}`,\n },\n signal,\n });\n } catch (err) {\n this.scheduleReconnect(`fetch error: ${(err as Error).message}`);\n return;\n }\n\n // 401 → give the auth callback one immediate retry to refresh the\n // token before falling back to the reconnect-with-backoff path.\n // Mirrors the POST behavior so consumers don't have to wait the\n // initial 500ms backoff just for a token refresh.\n if (res.status === 401 && allowAuthRetry) {\n this.opts.logger.warn(\n { reason: 'SSE 401' },\n 'SSE open returned 401; retrying after auth refresh',\n );\n this.abortController = null;\n void res.body?.cancel().catch(() => undefined);\n return this.openStream(false);\n }\n\n if (!res.ok || !res.body) {\n const reason = `SSE open failed: ${res.status} ${res.statusText}`;\n this.scheduleReconnect(reason);\n return;\n }\n\n this.connected = true;\n this.reconnectAttempts = 0;\n this.callbacks.onOpen?.();\n\n // Drive the parser in the background; openStream resolves once the\n // initial connection is established.\n void this.consumeStream(res.body, signal);\n }\n\n private async consumeStream(\n body: ReadableStream<Uint8Array>,\n signal: AbortSignal,\n ): Promise<void> {\n try {\n for await (const event of parseSSEStream(body, signal)) {\n let parsed: ServerToNeuronFrame;\n try {\n const data = JSON.parse(event.data);\n parsed = ServerToNeuronFrameSchema.parse(data);\n } catch (err) {\n this.opts.logger.warn(\n { err, event: event.event, data: event.data.slice(0, 200) },\n 'dropped malformed SSE frame',\n );\n continue;\n }\n this.callbacks.onFrame?.(parsed);\n }\n this.handleStreamEnd('clean close');\n } catch (err) {\n this.handleStreamEnd(`read error: ${(err as Error).message}`);\n }\n }\n\n private handleStreamEnd(reason: string): void {\n if (!this.connected) return;\n this.connected = false;\n this.abortController = null;\n this.callbacks.onClose?.(reason);\n if (!this.stopped) {\n this.scheduleReconnect(reason);\n }\n }\n\n private scheduleReconnect(reason: string): void {\n if (this.stopped) return;\n const attempt = this.reconnectAttempts++;\n const delay = Math.min(\n this.opts.maxReconnectDelayMs,\n this.opts.initialReconnectDelayMs * Math.pow(2, attempt),\n );\n this.opts.logger.warn(\n { reason, attempt: attempt + 1, delayMs: delay },\n 'transport reconnecting',\n );\n this.callbacks.onReconnecting?.({ attempt: attempt + 1, delayMs: delay, reason });\n this.reconnectTimer = setTimeout(() => {\n this.reconnectTimer = null;\n void this.openStream();\n }, delay);\n // Deliberately REF'D (HOL-3030). Between start() and stop() the\n // transport's contract is \"keep reconnecting\" — and for a standalone\n // neuron this timer is often the ONLY handle on the event loop while\n // disconnected. Unref'd, Node drained the loop and exited code 0\n // before the retry ever fired: core-neuron silently died on every\n // gateway bounce, removing all core/* capabilities from the org.\n // stop() clears the timer, so an embedding host that shuts down\n // cleanly is never pinned by it.\n }\n}\n\nexport class TransportError extends Error {\n constructor(message: string, public readonly statusCode: number) {\n super(message);\n this.name = 'TransportError';\n }\n}\n","import {\n POST_PATH,\n type JsonSchema,\n type LeasePayload,\n type NackKind,\n} from '@workflow/neuron-protocol';\nimport type { ZodType } from 'zod';\n\nimport type { SchemaValidator } from './schema-validator.js';\nimport type { Transport } from './transport.js';\nimport type { Handler, HandlerContext, NeuronLogger } from './types.js';\n\n/**\n * The exception `ctx.fail()` throws to short-circuit the handler with a\n * nack. Caught by the runner; consumers should not catch it. Exported so a\n * wrapper around a handler can raise one for a refusal the handler answered\n * as data.\n */\nexport class HandlerFailure extends Error {\n public readonly kind: 'terminal' | 'retryable';\n constructor(\n public readonly reason: string,\n public readonly code?: string,\n public readonly details?: unknown,\n kind: 'terminal' | 'retryable' = 'terminal',\n ) {\n super(reason);\n this.name = 'HandlerFailure';\n this.kind = kind;\n }\n}\n\n/**\n * Drives one lease end-to-end:\n *\n * 1. Validate `lease.task.input` against the capability's own schema —\n * the zod schema from `defineCapability` if there is one, otherwise\n * the JSON Schema passed to `neuron.handle(registration, fn)`. zod\n * wins because JSON Schema can't express `.refine()`, `.transform()`,\n * or `.preprocess()`, and silently dropping them would be a footgun.\n * A capability registered with neither schema is not validated.\n *\n * The schemas riding on the lease frame are deliberately NOT consulted\n * (HOL-2913). They can only ever be the neuron's own schemas handed\n * back to it: the register frame carries none, so the server's only\n * source is the `POST /plan` handler catalog the client supplies.\n * Worse, the planner never persists those onto task rows — nothing in\n * the repo writes `task.inputSchema`/`outputSchema` — so on real\n * workflow tasks the lease frame's schemas are always absent. The only\n * populated case is the dev-only `/__dev__/inject-task` route, where\n * neuron-tester echoes back the capability's registered schemas.\n *\n * Note this means client-side validation is the ONLY validation that\n * runs. The gateway's ack check (`routes/ack.ts`) validates against\n * that same empty `lease.outputSchema`, so it is a no-op in practice.\n * 2. Build the handler context — typed input, AbortSignal, logger,\n * progress callback, terminal-fail helper.\n * 3. Invoke the handler.\n * 4. Validate the return value the same way (zod first, then JSON Schema).\n * 5. Send `ack` (success) with the output.\n *\n * Error classification:\n * - `AbortError` from the signal → `nack(kind='cancelled')` (benign,\n * orchestrator already knows about it).\n * - `HandlerFailure` (from `ctx.fail`) → `nack(kind=terminal|retryable)` with\n * the handler's code and details.\n * - Anything else → `nack(kind='retryable')`. The gateway publishes a\n * retryable failure `TaskResultMessage` and the result-processor\n * decides whether to redispatch based on\n * `task.retry.maxRetries` — see HOL-546. Retry policy lives on the\n * workflow, never on the SDK side.\n */\nexport interface RunLeaseOptions {\n lease: LeasePayload;\n handler: Handler;\n /** Original zod schemas from `defineCapability`. Take precedence over\n * the JSON Schemas below. */\n zodInput?: ZodType<unknown>;\n zodOutput?: ZodType<unknown>;\n /**\n * JSON Schemas the caller registered for this capability — passed to\n * `neuron.handle(registration, fn)`, or derived from the zod schemas on a\n * `CapabilityDef`. Used when no zod schema is available; absent means no\n * validation for that direction.\n */\n inputSchema?: JsonSchema;\n outputSchema?: JsonSchema;\n transport: Transport;\n validator: SchemaValidator;\n logger: NeuronLogger;\n /** Externally-controlled abort signal for cancel and shutdown. */\n signal: AbortSignal;\n /** How long one progress POST may take before the runner gives up on it and sends the next. */\n progressTimeoutMs?: number;\n}\n\nconst DEFAULT_PROGRESS_TIMEOUT_MS = 5_000;\n\ninterface ValidationResult {\n ok: boolean;\n errors?: unknown;\n /** zod may transform the value during parsing; pass the parsed result on. */\n value?: unknown;\n}\n\nfunction validateInput(\n zod: ZodType<unknown> | undefined,\n validator: SchemaValidator,\n jsonSchema: unknown,\n data: unknown,\n): ValidationResult {\n if (zod) {\n const result = zod.safeParse(data);\n return result.success\n ? { ok: true, value: result.data }\n : { ok: false, errors: result.error.issues };\n }\n const errors = validator.validate(jsonSchema as Parameters<SchemaValidator['validate']>[0], data);\n return errors === null ? { ok: true, value: data } : { ok: false, errors };\n}\n\nexport async function runLease(opts: RunLeaseOptions): Promise<void> {\n const {\n lease,\n handler,\n zodInput,\n zodOutput,\n inputSchema,\n outputSchema,\n transport,\n validator,\n logger,\n signal,\n progressTimeoutMs = DEFAULT_PROGRESS_TIMEOUT_MS,\n } = opts;\n\n // Input validation against the capability's own schema. Prefer zod; fall\n // back to ajv on the registered JSON Schema. `lease.inputSchema` is\n // intentionally ignored — see the note on this function.\n const inputCheck = validateInput(zodInput, validator, inputSchema, lease.task.input);\n if (!inputCheck.ok) {\n await sendNack(\n transport,\n lease.leaseId,\n 'schema-mismatch',\n 'lease input does not match inputSchema',\n { code: 'INPUT_SCHEMA_MISMATCH', details: { errors: inputCheck.errors } },\n logger,\n );\n return;\n }\n // Use the parsed value — zod transforms run here so handlers see the\n // post-transform shape (e.g., trimmed strings, defaulted fields).\n const parsedInput = inputCheck.value;\n\n const reporter = makeProgressReporter(\n transport,\n lease.leaseId,\n logger,\n signal,\n progressTimeoutMs,\n );\n const ctx: HandlerContext = {\n task: lease.task,\n leaseId: lease.leaseId,\n signal,\n log: scopedLogger(logger, lease),\n progress: reporter.progress,\n fail: (reason, opts) => {\n throw new HandlerFailure(reason, opts?.code, opts?.details, opts?.kind);\n },\n };\n\n let output: unknown;\n try {\n output = await handler(parsedInput, ctx);\n } catch (err) {\n const cancelled = signal.aborted || (err as Error).name === 'AbortError';\n // The lease closes at its ack/nack, so progress still queued must reach\n // the gateway first or it lands on a lease that no longer exists. A\n // cancelled lease nacks at once instead.\n if (!cancelled) await reporter.drained();\n if (cancelled) {\n await sendNack(\n transport,\n lease.leaseId,\n 'cancelled',\n 'handler aborted',\n { code: 'CANCELLED' },\n logger,\n );\n return;\n }\n if (err instanceof HandlerFailure) {\n await sendNack(\n transport,\n lease.leaseId,\n err.kind,\n err.reason,\n {\n code: err.code ?? (err.kind === 'terminal' ? 'HANDLER_TERMINAL' : 'HANDLER_RETRYABLE'),\n ...(err.details !== undefined ? { details: err.details } : {}),\n },\n logger,\n );\n return;\n }\n const message = err instanceof Error ? err.message : String(err);\n logger.error({ err, leaseId: lease.leaseId }, 'handler threw; nacking retryable');\n await sendNack(\n transport,\n lease.leaseId,\n 'retryable',\n message,\n { code: 'HANDLER_THREW' },\n logger,\n );\n return;\n }\n\n await reporter.drained();\n\n // Output validation. Same precedence as the input above.\n const outputCheck = validateInput(zodOutput, validator, outputSchema, output);\n if (!outputCheck.ok) {\n await sendNack(\n transport,\n lease.leaseId,\n 'schema-mismatch',\n 'handler output does not match outputSchema',\n { code: 'OUTPUT_SCHEMA_MISMATCH', details: { errors: outputCheck.errors } },\n logger,\n );\n return;\n }\n // Parsed (post-transform) output goes on the wire so the gateway sees\n // the same shape the zod contract describes.\n const parsedOutput = outputCheck.value;\n\n await transport\n .post(POST_PATH.ack, {\n type: 'ack',\n leaseId: lease.leaseId,\n output: parsedOutput,\n completedAt: new Date().toISOString(),\n })\n .catch((err) => {\n // 4xx (e.g., SCHEMA_MISMATCH) signals the gateway rejected our\n // ack; 5xx (e.g., RESULT_PUBLISH_FAILED) signals a downstream\n // failure. Either way the lease is effectively lost — log loudly\n // so consumers can correlate with their gateway logs.\n logger.warn(\n { err, leaseId: lease.leaseId },\n 'ack POST rejected by gateway; lease will be reclaimed by reaper',\n );\n });\n}\n\nasync function sendNack(\n transport: Transport,\n leaseId: string,\n kind: NackKind,\n reason: string,\n extras: { code?: string; details?: unknown } = {},\n logger?: NeuronLogger,\n): Promise<void> {\n await transport\n .post(POST_PATH.nack, {\n type: 'nack',\n leaseId,\n kind,\n reason,\n code: extras.code,\n details: extras.details,\n failedAt: new Date().toISOString(),\n })\n .catch((err) => {\n logger?.warn(\n { err, leaseId, kind },\n 'nack POST rejected by gateway; lease will be reclaimed by reaper',\n );\n });\n}\n\n/**\n * A lease's progress sender. Frames go out one at a time in call order: each\n * POST waits for the previous one to settle, so pieces a handler streams (a\n * model's thinking, numbered by `seq`) reach the gateway, and every bus\n * subscriber, in the order they were sent. Each POST is bounded by\n * `timeoutMs`, so a gateway that never answers slows the queue instead of\n * stalling the lease, and once the lease is cancelled no queued frame that\n * has not started goes out. `drained` resolves once every queued frame has\n * settled.\n */\nfunction makeProgressReporter(\n transport: Transport,\n leaseId: string,\n logger: NeuronLogger,\n signal: AbortSignal,\n timeoutMs: number,\n): { progress: HandlerContext['progress']; drained: () => Promise<void> } {\n let tail: Promise<void> = Promise.resolve();\n return {\n progress: (update) => {\n const frame = {\n type: 'progress' as const,\n leaseId,\n percent: update.percent,\n message: update.message,\n data: update.data,\n sentAt: new Date().toISOString(),\n };\n tail = tail.then(async () => {\n if (signal.aborted) return;\n try {\n await withTimeout(transport.post(POST_PATH.progress, frame), timeoutMs);\n } catch (err) {\n logger.warn({ err, leaseId }, 'progress POST failed; continuing');\n }\n });\n },\n drained: () => tail,\n };\n}\n\nfunction withTimeout<T>(work: Promise<T>, ms: number): Promise<T> {\n let timer: ReturnType<typeof setTimeout> | undefined;\n const timeout = new Promise<never>((_resolve, reject) => {\n timer = setTimeout(() => reject(new Error(`timed out after ${ms}ms`)), ms);\n });\n return Promise.race([work, timeout]).finally(() => clearTimeout(timer));\n}\n\nfunction scopedLogger(logger: NeuronLogger, lease: LeasePayload): NeuronLogger {\n const scope = { leaseId: lease.leaseId, taskId: lease.task.taskId };\n return {\n debug: (meta, msg) => logger.debug({ ...scope, ...meta }, msg),\n info: (meta, msg) => logger.info({ ...scope, ...meta }, msg),\n warn: (meta, msg) => logger.warn({ ...scope, ...meta }, msg),\n error: (meta, msg) => logger.error({ ...scope, ...meta }, msg),\n };\n}\n","import AjvDefault, { type ErrorObject, type ValidateFunction } from 'ajv';\nimport addFormatsDefault from 'ajv-formats';\nimport type { JsonSchema } from '@workflow/neuron-protocol';\n\n// ajv and ajv-formats ship CJS-only. Under Node16 ESM resolution,\n// `import X from 'pkg'` may give us either the default export or the\n// whole module namespace depending on how the bundler/runtime resolved\n// it. Normalize to the actual constructor / function so we work in both\n// Node ESM and bundled-browser contexts.\ntype AjvCtor = new (opts?: object) => import('ajv').default;\ntype AddFormatsFn = (ajv: import('ajv').default, opts?: unknown) => unknown;\n\nconst Ajv: AjvCtor =\n ((AjvDefault as unknown) as { default?: AjvCtor }).default ??\n (AjvDefault as unknown as AjvCtor);\nconst addFormats: AddFormatsFn =\n ((addFormatsDefault as unknown) as { default?: AddFormatsFn }).default ??\n (addFormatsDefault as unknown as AddFormatsFn);\n\n/**\n * Compiles JSON Schemas once and caches by reference. Mirror of the\n * gateway-side OutputValidator — both ends of the wire validate against\n * the same schemas so a misbehaving party can't sneak by either side.\n */\nexport class SchemaValidator {\n private readonly ajv: import('ajv').default;\n private readonly cache = new WeakMap<object, ValidateFunction>();\n // Schemas whose compilation threw. Cannot-compile is an environment or\n // schema-authoring problem, not evidence about the data — so validate()\n // FAILS OPEN for these (returns null) instead of reporting a mismatch.\n // Nacking on compile failure turned every lease into an\n // INPUT_SCHEMA_MISMATCH retry loop on runtimes where ajv's codegen is\n // unavailable (Electron renderers with CSP `script-src 'self'` block\n // `new Function`) — HOL-2937.\n private readonly uncompilable = new WeakSet<object>();\n\n constructor(private readonly onCompileError?: (message: string) => void) {\n this.ajv = new Ajv({ allErrors: true, strict: false });\n addFormats(this.ajv);\n }\n\n /**\n * Returns null if the value matches the schema, no schema was given, or\n * the schema cannot be compiled in this runtime (fail-open — the gateway\n * remains the enforcement point); otherwise an array of structured errors.\n */\n validate(schema: JsonSchema | undefined, data: unknown): ErrorObject[] | null {\n if (!schema || typeof schema !== 'object') return null;\n if (this.uncompilable.has(schema as object)) return null;\n\n let validator = this.cache.get(schema as object);\n if (!validator) {\n try {\n validator = this.ajv.compile(schema as object);\n } catch (err) {\n this.uncompilable.add(schema as object);\n this.onCompileError?.(\n `schema failed to compile — skipping SDK-side validation for this schema: ${\n err instanceof Error ? err.message : String(err)\n }`,\n );\n return null;\n }\n this.cache.set(schema as object, validator);\n }\n\n // After the get/compile branch above, validator is guaranteed set.\n const v = validator as ValidateFunction;\n const ok = v(data);\n return ok ? null : v.errors ?? [];\n }\n}\n","/**\n * Per-capability concurrency limiter. Bounds the number of in-flight\n * handler invocations locally even if the gateway overshoots prefetch — a\n * misbehaving gateway should never push past the contract.\n *\n * Pools are created per (neuron, capability) and live for the duration of\n * the SDK's session. Drain support (used by `neuron.stop({ drain: true })`)\n * resolves once all in-flight tasks have completed; new submissions during\n * drain are rejected with `ShutdownError`.\n */\nexport class WorkerPool {\n private inFlight = 0;\n private queue: Array<() => void> = [];\n private draining = false;\n private drained: { resolve: () => void; promise: Promise<void> } | null = null;\n\n constructor(private maxConcurrency: number) {\n if (maxConcurrency <= 0) {\n throw new Error(\n `WorkerPool requires positive concurrency, got ${maxConcurrency}`,\n );\n }\n }\n\n /** Currently-running task count. */\n size(): number {\n return this.inFlight;\n }\n\n /** Tasks waiting for a slot. */\n pending(): number {\n return this.queue.length;\n }\n\n /**\n * Run `fn` once a concurrency slot is available. Resolves with the\n * function's return value (or rejects with its error). Throws\n * ShutdownError if the pool is already draining.\n */\n async run<T>(fn: () => Promise<T>): Promise<T> {\n if (this.draining) {\n throw new ShutdownError('worker pool is draining');\n }\n\n if (this.inFlight >= this.maxConcurrency) {\n await new Promise<void>((resolve) => this.queue.push(resolve));\n }\n\n this.inFlight++;\n try {\n return await fn();\n } finally {\n this.inFlight--;\n const next = this.queue.shift();\n if (next) {\n next();\n } else if (this.draining && this.inFlight === 0 && this.drained) {\n this.drained.resolve();\n }\n }\n }\n\n /**\n * Update the max concurrency. Lowering doesn't kill in-flight tasks —\n * they finish naturally — but it does prevent new ones from starting\n * until the in-flight count drops below the new limit.\n */\n setConcurrency(newMax: number): void {\n if (newMax <= 0) {\n throw new Error(\n `WorkerPool concurrency must be positive, got ${newMax}`,\n );\n }\n const oldMax = this.maxConcurrency;\n this.maxConcurrency = newMax;\n // If raising, release waiting tasks up to the new headroom.\n if (newMax > oldMax) {\n const headroom = newMax - this.inFlight;\n for (let i = 0; i < headroom && this.queue.length > 0; i++) {\n const next = this.queue.shift();\n next?.();\n }\n }\n }\n\n /**\n * Stop accepting new submissions. Returns a promise that resolves once\n * every in-flight AND queued task has finished — queued waiters from\n * before drain are released as in-flight slots free, run normally, and\n * are awaited as part of drain. Only fresh `run()` calls received after\n * `drain()` reject with ShutdownError. Callers that need a hard stop\n * should race this promise against a timeout and abort handlers.\n */\n drain(): Promise<void> {\n if (!this.draining) {\n this.draining = true;\n let resolveFn!: () => void;\n const promise = new Promise<void>((resolve) => {\n resolveFn = resolve;\n });\n this.drained = { resolve: resolveFn, promise };\n if (this.inFlight === 0) {\n resolveFn();\n }\n }\n return this.drained!.promise;\n }\n}\n\nexport class ShutdownError extends Error {\n constructor(message: string) {\n super(message);\n this.name = 'ShutdownError';\n }\n}\n","import {\n POST_PATH,\n PROTOCOL_VERSION,\n SSE_EVENT,\n type Capability,\n type HeartbeatInFlightEntry,\n type JsonSchema,\n type LeasePayload,\n type ServerToNeuronFrame,\n} from '@workflow/neuron-protocol';\n// eventemitter3 ships both a default and a named export of the same\n// class. Using the named import sidesteps a TS issue under Node16 ESM\n// resolution where the default-imported symbol is treated as a\n// namespace and isn't usable as a base class.\nimport { EventEmitter } from 'eventemitter3';\n\nimport {\n type CapabilityDef,\n toRegistrationCapability,\n} from './capability-def.js';\nimport { HeartbeatLoop } from './heartbeat.js';\nimport { HttpTransport } from './http-transport.js';\nimport { runLease } from './lease-runner.js';\nimport { noopLogger } from './logger.js';\nimport { SchemaValidator } from './schema-validator.js';\nimport type { Transport } from './transport.js';\nimport { ShutdownError, WorkerPool } from './worker-pool.js';\nimport type {\n AuthCallback,\n CapabilityHandleOptions,\n CapabilityRegistration,\n Handler,\n NeuronLogger,\n} from './types.js';\n\n/**\n * Public event surface. The `Neuron` class extends `EventEmitter<NeuronEvents>`\n * from `eventemitter3` so consumers can subscribe with the familiar\n * `.on() / .once() / .off()` API:\n *\n * neuron.on('frame', (frame) => log.append(frame));\n * neuron.once('connection:registered', ({ sessionId }) => mountUI(sessionId));\n * const off = neuron.on('error', captureError);\n * off();\n *\n * Two flavors:\n *\n * - `frame` — a pass-through of the gateway's `/neuron/events` SSE stream.\n * Fires for every parsed `ServerToNeuronFrame`, including ones for\n * which no handler is registered. Useful for live event logs,\n * observability, and the neuron-tester debug UI.\n *\n * - `connection:*` and `error` — synthetic, SDK-generated. Mirror the\n * transport's lifecycle (SSE handshake, register acceptance, close,\n * reconnect scheduling).\n *\n * Adding new events is intentionally cheap — extend `NeuronEvents` and emit\n * from inside the class. Future entries (e.g. `'workflow:task-completed'`\n * for sibling-neuron notifications) slot in without breaking subscribers.\n */\nexport interface NeuronEvents {\n /** Fired after the SSE handshake succeeds, before register is posted. */\n 'connection:open': () => void;\n /** Fired after the gateway accepts the register frame. */\n 'connection:registered': (info: {\n sessionId: string;\n capabilities: number;\n }) => void;\n /** Fired when the SSE stream closes — clean shutdown or transient error. */\n 'connection:close': (reason: string) => void;\n /** Fired when a reconnect is scheduled, before the backoff delay elapses. */\n 'connection:reconnecting': (info: {\n attempt: number;\n delayMs: number;\n reason: string;\n }) => void;\n /**\n * Fired on transport / parse errors (reconnect handling is automatic)\n * and on register rejection (HOL-2926 — NOT automatically recovered:\n * the SSE stream stays open, so the neuron sits connected but\n * lease-less until the app reacts, e.g. by calling `stop()`).\n */\n error: (err: Error) => void;\n /** Pass-through of every parsed inbound SSE frame. */\n frame: (frame: ServerToNeuronFrame) => void;\n}\n\n/**\n * Options shared by both `NeuronOptions` shapes.\n */\ninterface NeuronCommonOptions {\n /**\n * Stable per-process identifier. Reused across reconnects so the\n * gateway can correlate the new session with the same neuron. SDK does\n * NOT generate one for you — pick something stable per device/process\n * (UUID stored on disk for desktop, hostname+pid for server).\n */\n neuronId: string;\n /** Logger; defaults to a silent no-op. */\n logger?: NeuronLogger;\n /** Heartbeat interval (ms). Default 10s. */\n heartbeatIntervalMs?: number;\n}\n\n/**\n * Power-user shape — bring your own `Transport`. Used when the default\n * HTTP+SSE transport doesn't fit, e.g. a renderer-process neuron in\n * Electron embedding BigBrain in main, where leases arrive over IPC.\n */\nexport interface NeuronOptionsWithTransport extends NeuronCommonOptions {\n transport: Transport;\n}\n\n/**\n * Convenience shape — provide gateway URL + auth, the SDK builds an\n * `HttpTransport` for you. The most common path; matches the v1 SDK\n * surface so existing call sites keep compiling unchanged.\n */\nexport interface NeuronOptionsWithHttp extends NeuronCommonOptions {\n /** Base URL of the gateway, e.g. `https://bigbrain.holokai.dev`. */\n gatewayUrl: string;\n /** Token provider — see `AuthCallback` for refresh semantics. */\n auth: AuthCallback;\n /** Initial reconnect delay (ms). Default 500ms. */\n initialReconnectDelayMs?: number;\n /** Max reconnect delay (ms). Default 30s. */\n maxReconnectDelayMs?: number;\n /** Override `fetch`; mainly for tests. */\n fetch?: typeof fetch;\n}\n\nexport type NeuronOptions = NeuronOptionsWithTransport | NeuronOptionsWithHttp;\n\nfunction isWithTransport(opts: NeuronOptions): opts is NeuronOptionsWithTransport {\n return 'transport' in opts && opts.transport !== undefined;\n}\n\ninterface RegisteredHandler {\n capability: Capability;\n /**\n * JSON Schemas for this capability — derived from the zod schemas on a\n * `CapabilityDef`, or supplied verbatim on the legacy\n * `CapabilityRegistration` shape. These are what the lease runner\n * validates against; the schemas on the lease frame are ignored\n * (HOL-2913).\n */\n inputSchema?: JsonSchema;\n outputSchema?: JsonSchema;\n /**\n * Original zod schemas from `defineCapability`. When set, these are the\n * canonical validators — JSON Schema is only the wire artifact and\n * silently loses zod features like `.refine()`, `.transform()`, and\n * `.preprocess()`. Absent when the legacy `handle(registration, fn)`\n * shape was used.\n */\n zodInput?: import('zod').ZodType<unknown>;\n zodOutput?: import('zod').ZodType<unknown>;\n handler: Handler;\n pool: WorkerPool;\n}\n\n/**\n * Public SDK class. Compose:\n *\n * const neuron = new Neuron({ gatewayUrl, neuronId, auth: () => token });\n * neuron.handle({ type: 'core/script.python', scope: 'any', concurrency: 4 }, handler);\n * neuron.on('connection:registered', ({ sessionId }) => log(sessionId));\n * await neuron.start();\n * ...\n * await neuron.stop({ drain: true, timeoutMs: 30_000 });\n *\n * See `NeuronEvents` for the full set of subscribable events.\n */\nexport class Neuron extends EventEmitter<NeuronEvents> {\n private readonly transport: Transport;\n private readonly handlers = new Map<string, RegisteredHandler>();\n private readonly inFlightLeases = new Map<\n string,\n { taskId: string; startedAt: string; abort: AbortController }\n >();\n /**\n * Leases admitted by `dispatchLease` but still waiting for a worker-pool\n * slot. Tracked separately from `inFlightLeases` so the heartbeat snapshot\n * doesn't lie — only running leases extend the gateway's lease TTL.\n */\n private readonly queuedLeases = new Map<string, { abort: AbortController }>();\n private readonly heartbeat: HeartbeatLoop;\n private readonly validator: SchemaValidator;\n private readonly logger: NeuronLogger;\n private readonly neuronId: string;\n\n private started = false;\n private stopping = false;\n private hasOpenedOnce = false;\n\n constructor(opts: NeuronOptions) {\n super();\n this.logger = opts.logger ?? noopLogger;\n this.neuronId = opts.neuronId;\n this.validator = new SchemaValidator((message) =>\n this.logger.warn({ neuronId: this.neuronId }, message),\n );\n\n this.transport = isWithTransport(opts)\n ? opts.transport\n : new HttpTransport({\n gatewayUrl: opts.gatewayUrl,\n neuronId: opts.neuronId,\n auth: opts.auth,\n logger: this.logger,\n initialReconnectDelayMs: opts.initialReconnectDelayMs,\n maxReconnectDelayMs: opts.maxReconnectDelayMs,\n fetch: opts.fetch,\n });\n\n // Single-subscriber callback model — Neuron is the only thing that\n // ever subscribes to a transport, so wiring lifecycle events through\n // this method (instead of an emitter) keeps transport implementations\n // free of any event-library dependency.\n this.transport.subscribe({\n onOpen: () => {\n this.emit('connection:open');\n void this.handleConnectionOpen();\n },\n onClose: (reason) => {\n this.handleConnectionClose(reason);\n this.emit('connection:close', reason);\n },\n onFrame: (frame) => this.handleFrame(frame),\n onError: (err) => {\n this.logger.error({ err }, 'transport error');\n this.emit('error', err);\n },\n onReconnecting: (info) => this.emit('connection:reconnecting', info),\n });\n\n this.heartbeat = new HeartbeatLoop({\n transport: this.transport,\n neuronId: opts.neuronId,\n inFlight: () => this.snapshotInFlight(),\n intervalMs: opts.heartbeatIntervalMs,\n logger: this.logger,\n });\n }\n\n /**\n * Register a handler for a capability. Must be called before `start()`;\n * the gateway expects the full capability list in the register frame.\n *\n * Three call shapes:\n *\n * neuron.handle(capDef, fn) // typed via defineCapability defaults\n * neuron.handle(capDef, opts, fn) // typed; override scope/concurrency\n * neuron.handle(capabilityRegistration, fn) // legacy/low-level: explicit JSON Schemas\n *\n * If called twice for the same capability before start, the second call\n * replaces the first. After start, use `updateCapability` to adjust\n * concurrency at runtime.\n */\n handle<TIn, TOut>(def: CapabilityDef<TIn, TOut>, handler: Handler<TIn, TOut>): void;\n handle<TIn, TOut>(\n def: CapabilityDef<TIn, TOut>,\n opts: CapabilityHandleOptions,\n handler: Handler<TIn, TOut>,\n ): void;\n handle(reg: CapabilityRegistration, handler: Handler): void;\n handle(\n defOrReg: CapabilityDef | CapabilityRegistration,\n optsOrHandler: CapabilityHandleOptions | Handler,\n maybeHandler?: Handler,\n ): void {\n if (this.started) {\n throw new Error(\n 'Neuron.handle() must be called before start(). Use updateCapability(...) for runtime changes.',\n );\n }\n\n const isCapDef = '_zod' in defOrReg;\n\n let capability: Capability;\n let inputSchema: JsonSchema | undefined;\n let outputSchema: JsonSchema | undefined;\n let zodInput: import('zod').ZodType<unknown> | undefined;\n let zodOutput: import('zod').ZodType<unknown> | undefined;\n let handler: Handler;\n\n if (isCapDef) {\n const def = defOrReg as CapabilityDef;\n let opts: CapabilityHandleOptions | undefined;\n if (typeof optsOrHandler === 'function') {\n handler = optsOrHandler;\n } else {\n opts = optsOrHandler;\n if (!maybeHandler) {\n throw new Error('Neuron.handle(def, opts, fn): handler is required');\n }\n handler = maybeHandler;\n }\n capability = toRegistrationCapability(def, opts);\n inputSchema = def.inputSchema;\n outputSchema = def.outputSchema;\n zodInput = def._zod.input;\n zodOutput = def._zod.output;\n } else {\n const reg = defOrReg as CapabilityRegistration;\n if (typeof optsOrHandler !== 'function') {\n throw new Error(\n 'Neuron.handle(registration, fn): expected handler function as second argument',\n );\n }\n handler = optsOrHandler;\n // The legacy shape's schemas (and description, if set) ride along on\n // the wire capability too (HOL-2926) — the gateway forwards them to\n // Moku's capability catalog. Spread conditionally: the wire schema is\n // strict() and `key: undefined` is not the same as an absent key for\n // JSON round-trips.\n capability = {\n type: reg.type,\n scope: reg.scope,\n concurrency: reg.concurrency,\n ...(reg.description !== undefined ? { description: reg.description } : {}),\n ...(reg.inputSchema !== undefined ? { inputSchema: reg.inputSchema } : {}),\n ...(reg.outputSchema !== undefined ? { outputSchema: reg.outputSchema } : {}),\n ...(typeof reg.leaseTtlMs === 'number' ? { leaseTtlMs: reg.leaseTtlMs } : {}),\n ...(reg.composes !== undefined ? { composes: reg.composes } : {}),\n };\n inputSchema = reg.inputSchema;\n outputSchema = reg.outputSchema;\n }\n\n this.handlers.set(capability.type, {\n capability,\n inputSchema,\n outputSchema,\n zodInput,\n zodOutput,\n handler,\n pool: new WorkerPool(capability.concurrency),\n });\n }\n\n /**\n * Adjust an already-registered capability's concurrency at runtime and\n * notify the gateway via an `update-capability` frame so prefetch can be\n * tuned. Schema and handler are not replaced — re-register before start\n * if those need to change.\n */\n async updateCapability(\n reg: Pick<CapabilityRegistration, 'type' | 'concurrency'>,\n ): Promise<void> {\n const entry = this.handlers.get(reg.type);\n if (!entry) {\n throw new Error(\n `updateCapability: no handler registered for ${reg.type}`,\n );\n }\n entry.capability = { ...entry.capability, concurrency: reg.concurrency };\n entry.pool.setConcurrency(reg.concurrency);\n\n if (this.started && this.transport.isConnected()) {\n await this.transport\n .post(POST_PATH.updateCapability, {\n type: 'update-capability',\n neuronId: this.neuronId,\n capability: entry.capability,\n })\n .catch((err) => {\n this.logger.warn(\n { err, capability: reg.type },\n 'update-capability POST failed; gateway will pick up new value on next reconnect',\n );\n });\n }\n }\n\n /**\n * Open the SSE stream, post register with all advertised capabilities,\n * and start the heartbeat loop. Resolves once the gateway accepts the\n * register frame.\n */\n async start(): Promise<void> {\n if (this.started) return;\n if (this.handlers.size === 0) {\n throw new Error(\n 'Neuron.start() requires at least one handler — call Neuron.handle(...) first.',\n );\n }\n this.started = true;\n await this.transport.start();\n // `handleConnectionOpen` runs in the background to post register;\n // its completion is signalled by the `registered` SSE frame, which\n // we don't strictly need to wait for here. start() returning means\n // the SSE is open and register has been issued.\n }\n\n /**\n * Refuse new leases, drain in-flight handlers up to `timeoutMs`, then\n * tear down the connection. Pending leases (queued but not started)\n * are abandoned — the gateway's lease TTL will reclaim them.\n */\n async stop(opts: { drain?: boolean; timeoutMs?: number } = {}): Promise<void> {\n if (this.stopping) return;\n this.stopping = true;\n const drain = opts.drain ?? true;\n const timeoutMs = opts.timeoutMs ?? 30_000;\n\n this.heartbeat.stop();\n\n if (drain) {\n const drainPromises = Array.from(this.handlers.values()).map((h) =>\n h.pool.drain(),\n );\n const allDrained = Promise.all(drainPromises);\n const timeout = new Promise<void>((resolve) => {\n const t = setTimeout(() => {\n this.logger.warn({ timeoutMs }, 'drain timeout exceeded; aborting in-flight leases');\n for (const inFlight of this.inFlightLeases.values()) {\n inFlight.abort.abort();\n }\n for (const queued of this.queuedLeases.values()) {\n queued.abort.abort();\n }\n resolve();\n }, timeoutMs);\n if (typeof t.unref === 'function') t.unref();\n });\n await Promise.race([allDrained, timeout]);\n } else {\n for (const inFlight of this.inFlightLeases.values()) {\n inFlight.abort.abort();\n }\n for (const queued of this.queuedLeases.values()) {\n queued.abort.abort();\n }\n }\n\n await this.transport.stop();\n }\n\n // ----- internals ----------------------------------------------------\n\n private snapshotInFlight(): HeartbeatInFlightEntry[] {\n return Array.from(this.inFlightLeases.entries()).map(([leaseId, info]) => ({\n leaseId,\n taskId: info.taskId,\n startedAt: info.startedAt,\n }));\n }\n\n private async handleConnectionOpen(): Promise<void> {\n try {\n await this.postRegister();\n this.hasOpenedOnce = true;\n this.heartbeat.start();\n } catch (err) {\n const cause = err instanceof Error ? err : new Error(String(err));\n this.logger.error(\n { err: cause },\n 'register POST rejected; SSE is open but the neuron is NOT registered and will receive no leases',\n );\n // Surface the rejection to the application (HOL-2926). A permanent\n // rejection — e.g. INVALID_FRAME from a gateway that predates fields\n // this SDK sends — leaves the SSE stream open, so nothing reconnects\n // and nothing retries: without this event the neuron dies silently\n // with only a log line. Subscribers can stop()/alert/fall back.\n // Matches the existing `error` idiom (transport/parse errors emit the\n // same event); `start()`'s resolve semantics are unchanged.\n this.emit(\n 'error',\n new Error(`registration rejected by gateway: ${cause.message}`, { cause }),\n );\n }\n }\n\n private handleConnectionClose(reason: string): void {\n this.logger.warn({ reason }, 'transport disconnected');\n this.heartbeat.stop();\n }\n\n private async postRegister(): Promise<void> {\n await this.transport.post(POST_PATH.register, {\n type: 'register',\n neuronId: this.neuronId,\n protocolVersion: PROTOCOL_VERSION,\n capabilities: Array.from(this.handlers.values()).map((h) => h.capability),\n });\n }\n\n private handleFrame(frame: ServerToNeuronFrame): void {\n // Pass-through firehose first, so subscribers see every frame even\n // for types the SDK handles internally (lease/cancel) — useful for\n // observability and the neuron-tester debug log.\n this.emit('frame', frame);\n\n switch (frame.type) {\n case 'registered':\n this.logger.info(\n { sessionId: frame.sessionId, capabilities: frame.capabilities.length },\n 'gateway accepted registration',\n );\n this.emit('connection:registered', {\n sessionId: frame.sessionId,\n capabilities: frame.capabilities.length,\n });\n return;\n case 'lease':\n void this.dispatchLease(frame.lease);\n return;\n case 'cancel':\n this.handleCancel(frame.leaseId, frame.reason);\n return;\n case 'capability-revoked':\n this.logger.warn(\n { capability: frame.capability, reason: frame.reason },\n 'capability revoked by gateway',\n );\n return;\n case 'disconnect':\n this.logger.info({ reason: frame.reason, code: frame.code }, 'gateway disconnect');\n return;\n }\n }\n\n private async dispatchLease(lease: LeasePayload): Promise<void> {\n const handler = this.handlers.get(lease.task.capability);\n if (!handler) {\n this.logger.warn(\n { capability: lease.task.capability, leaseId: lease.leaseId },\n 'no handler registered for lease capability; nacking retryable',\n );\n await this.transport\n .post(POST_PATH.nack, {\n type: 'nack',\n leaseId: lease.leaseId,\n kind: 'retryable',\n reason: 'no handler registered for capability',\n failedAt: new Date().toISOString(),\n })\n .catch(() => undefined);\n return;\n }\n\n const abort = new AbortController();\n // Track as queued until pool admits us. Heartbeats only report\n // running leases (via inFlightLeases) so the gateway's reaper isn't\n // misled into renewing a TTL on work that hasn't started.\n this.queuedLeases.set(lease.leaseId, { abort });\n\n try {\n await handler.pool.run(async () => {\n this.queuedLeases.delete(lease.leaseId);\n this.inFlightLeases.set(lease.leaseId, {\n taskId: lease.task.taskId,\n startedAt: new Date().toISOString(),\n abort,\n });\n try {\n await runLease({\n lease,\n handler: handler.handler,\n zodInput: handler.zodInput,\n zodOutput: handler.zodOutput,\n inputSchema: handler.inputSchema,\n outputSchema: handler.outputSchema,\n transport: this.transport,\n validator: this.validator,\n logger: this.logger,\n signal: abort.signal,\n });\n } finally {\n this.inFlightLeases.delete(lease.leaseId);\n }\n });\n } catch (err) {\n this.queuedLeases.delete(lease.leaseId);\n if (err instanceof ShutdownError) {\n // Pool refused before we could start — explicit retryable nack so\n // the broker can redeliver immediately rather than waiting for\n // the gateway's lease TTL to expire.\n this.logger.info(\n { leaseId: lease.leaseId },\n 'lease refused during shutdown; nacking retryable',\n );\n await this.transport\n .post(POST_PATH.nack, {\n type: 'nack',\n leaseId: lease.leaseId,\n kind: 'retryable',\n reason: 'neuron shutting down',\n failedAt: new Date().toISOString(),\n })\n .catch(() => undefined);\n } else {\n this.logger.error({ err, leaseId: lease.leaseId }, 'unhandled lease runner error');\n }\n }\n }\n\n private handleCancel(leaseId: string, reason: string): void {\n const tracked =\n this.inFlightLeases.get(leaseId) ?? this.queuedLeases.get(leaseId);\n if (!tracked) {\n this.logger.warn(\n { leaseId, reason },\n 'cancel for unknown lease; ignoring (already completed?)',\n );\n return;\n }\n this.logger.info({ leaseId, reason }, 'cancelling lease');\n tracked.abort.abort();\n }\n}\n\n/** SSE event names re-exported for tests / consumers that want to match\n * by name without importing the protocol package. */\nexport const SSE_EVENT_NAMES = SSE_EVENT;\n"]}