@m4trix/core 0.10.0 → 0.11.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.cjs +154 -0
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.ts +75 -3
- package/dist/index.js +152 -1
- package/dist/index.js.map +1 -1
- package/dist/matrix/index.cjs +154 -0
- package/dist/matrix/index.cjs.map +1 -1
- package/dist/matrix/index.d.ts +72 -1
- package/dist/matrix/index.js +152 -1
- package/dist/matrix/index.js.map +1 -1
- package/package.json +1 -19
- package/dist/api/index.cjs +0 -83
- package/dist/api/index.cjs.map +0 -1
- package/dist/api/index.d.ts +0 -74
- package/dist/api/index.js +0 -81
- package/dist/api/index.js.map +0 -1
- package/dist/react/index.cjs +0 -1324
- package/dist/react/index.cjs.map +0 -1
- package/dist/react/index.d.ts +0 -213
- package/dist/react/index.js +0 -1316
- package/dist/react/index.js.map +0 -1
- package/dist/ui/index.cjs +0 -316
- package/dist/ui/index.cjs.map +0 -1
- package/dist/ui/index.d.ts +0 -30
- package/dist/ui/index.js +0 -314
- package/dist/ui/index.js.map +0 -1
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/stream/Pump.ts","../src/stream/utility/pipe-transformers/response.ts","../src/stream/utility/rechunker/ensure-full-words.ts","../src/api/socket-handler/SocketIoFactory.ts","../src/helper/transform-messages/TransformMessages.ts","../src/helper/transform-messages/message-filter.ts","../src/helper/transform-messages/formatter.ts","../src/matrix/agent-network/agent-network.ts","../src/matrix/identifiers/channel-name.ts","../src/matrix/agent-network/channel.ts","../src/matrix/agent-network/event-plane.ts","../src/helper/types/noop.ts","../src/matrix/agent-network/stores/inmemory-network-store.ts","../src/matrix/io/expose.ts","../src/matrix/agent-network/agent-network-event.ts","../src/matrix/agent.ts","../src/matrix/agent-factory.ts","../src/matrix/io/protocols/sse.ts","../src/matrix/io/adapters/next-endpoint.ts","../src/matrix/io/adapters/express-endpoint.ts","../src/matrix/console-tracer.ts"],"names":["out","window","AIMessage","i","msg","Effect","Queue","payload"],"mappings":"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","sourcesContent":["/**\n * StreamChunk is the base interface for all streams.\n * It can hold voice and text chunks.\n *\n * @template T The type of data contained in the chunk\n */\nexport interface StreamChunk<T> {\n sequence: number;\n data: T;\n done: boolean;\n}\n\n/**\n * MessageStream represents an asynchronous iterable stream of chunks.\n * Used as the core stream representation throughout the Pump library.\n *\n * @template T The type of data contained in the chunks of the stream\n */\nexport type MessageStream<T> = AsyncIterable<StreamChunk<T>>;\n\n/**\n * Represents any source that can be converted to a stream.\n * This includes AsyncIterable and ReadableStream sources.\n *\n * @template T The type of data contained in the source\n */\nexport type Source<T> =\n | AsyncIterable<T>\n | ReadableStream<T>\n | NodeJS.ReadableStream;\n\n/**\n * A transformer for stream data that also provides a response.\n * Used primarily to transform and consume stream data while producing a response object.\n *\n * @template T The type of data being transformed\n * @template R The type of the response (defaults to Response)\n */\nexport type StreamTransformer<T, R = Response> = {\n transform(data: T): T;\n close(): void;\n response: R;\n};\n\n/**\n * Pump is an asynchronous stream processing pipeline with fluent operators.\n * It provides a comprehensive set of operations for transforming, filtering, batching,\n * combining, and consuming stream data.\n *\n * The Pump class follows a builder pattern where each operation returns a new Pump instance,\n * allowing for chaining of operations to build complex stream processing pipelines.\n *\n * @template T The type of data contained in the stream\n */\nexport class Pump<T> {\n constructor(private readonly src: MessageStream<T>) {}\n\n /**\n * Wrap an existing AsyncIterable or Readable stream into a Pump\n *\n * @template U The type of data in the source stream\n * @param source The source stream to convert to a Pump (AsyncIterable, ReadableStream, or NodeJS.ReadableStream)\n * @returns A new Pump instance that wraps the source\n */\n static from<U>(source: Source<U>): Pump<U> {\n async function* gen(): AsyncGenerator<StreamChunk<U>> {\n let seq = 0;\n\n // Type guard functions to narrow the type\n function isAsyncIterable(obj: Source<U>): obj is AsyncIterable<U> {\n return Symbol.asyncIterator in obj;\n }\n\n function isWebReadableStream(obj: Source<U>): obj is ReadableStream {\n return 'getReader' in obj && typeof obj.getReader === 'function';\n }\n\n function isNodeReadableStream(\n obj: Source<U>\n ): obj is NodeJS.ReadableStream {\n return (\n 'pipe' in obj &&\n 'on' in obj &&\n typeof obj.pipe === 'function' &&\n typeof obj.on === 'function'\n );\n }\n\n if (isAsyncIterable(source)) {\n // Handle AsyncIterable\n const iterator = source[Symbol.asyncIterator]();\n try {\n while (true) {\n const result = await iterator.next();\n if (result.done) break;\n yield {\n sequence: seq++,\n data: result.value,\n done: false,\n };\n }\n } finally {\n // No need to clean up AsyncIterator\n }\n } else if (isWebReadableStream(source)) {\n // Handle Web API ReadableStream\n const reader = source.getReader();\n try {\n while (true) {\n const result = await reader.read();\n if (result.done) break;\n yield {\n sequence: seq++,\n data: result.value as U,\n done: false,\n };\n }\n } finally {\n reader.releaseLock();\n }\n } else if (isNodeReadableStream(source)) {\n // Handle Node.js ReadableStream\n try {\n // Convert Node stream to an AsyncIterable\n for await (const chunk of source) {\n yield {\n sequence: seq++,\n data: chunk as U,\n done: false,\n };\n }\n } catch (error) {\n console.error('Error reading from Node.js stream:', error);\n throw error;\n }\n }\n\n // final done signal\n yield { sequence: seq, data: undefined as unknown as U, done: true };\n }\n return new Pump<U>(gen()) as Pump<U>;\n }\n\n /**\n * Sync or async map over the data portion of each chunk\n *\n * @template U The output type after transformation\n * @param fn The mapping function that transforms each chunk\n * @returns A new Pump instance with the transformed data\n */\n map<U>(fn: (data: T) => U | Promise<U>): Pump<U> {\n async function* gen(this: Pump<T>): AsyncGenerator<StreamChunk<U>> {\n for await (const { sequence, data, done } of this.src) {\n if (done) {\n const out = data !== undefined ? await fn(data) : undefined;\n yield { sequence, data: out as unknown as U, done };\n break;\n }\n\n const out = await fn(data);\n yield { sequence, data: out, done };\n }\n }\n return new Pump<U>(gen.call(this));\n }\n\n /**\n * Stateful map allows processing stream chunks with a persistent context object.\n *\n * The context is initialized when the first chunk arrives and can be updated with each chunk.\n * This is useful for maintaining state across the stream processing.\n *\n * If you plan to use sockets you should rather opt for asyncStatefulMap.\n *\n * The pipe closes only after all processing is complete, including any final operations in onClose.\n *\n * TODO: Un-tested\n *\n * @param handlers Object containing callback functions for stream processing\n * @param handlers.onFirstChunk Function called when the first chunk arrives, initializes the context\n * @param handlers.onChunk Function called for each subsequent chunk, updates the context\n * @param handlers.onClose Optional function called when the stream closes, allows final processing\n * @returns A new Pump instance with transformed data\n */\n statefulMap<Context, U = T>(handlers: {\n onFirstChunk(\n chunk: T,\n yieldData: (data: U) => void\n ): Context | Promise<Context>;\n onChunk(\n chunk: T,\n context: Context,\n yieldData: (data: U) => void\n ): Context | Promise<Context>;\n onClose?(\n lastChunk: T | undefined,\n context: Context,\n yieldData: (data: U) => void\n ): void | Promise<void>;\n }): Pump<U> {\n const { src } = this;\n\n const gen = async function* (): AsyncGenerator<StreamChunk<U>> {\n let context: Context | undefined;\n let initialized = false;\n let lastChunk: T | undefined;\n let seq = 0;\n\n const queue: U[] = [];\n const yieldData = (data: U): void => {\n queue.push(data);\n };\n\n // <- here ->\n\n for await (const { data, done } of src) {\n if (done) {\n if (context && handlers.onClose) {\n await handlers.onClose(lastChunk, context, yieldData);\n }\n\n while (queue.length > 0) {\n yield { sequence: seq++, data: queue.shift()!, done: false };\n }\n\n yield {\n sequence: seq++,\n data: undefined as unknown as U,\n done: true,\n };\n break;\n }\n if (!initialized) {\n context = await handlers.onFirstChunk(data, yieldData);\n initialized = true;\n } else if (context) {\n context = await handlers.onChunk(data, context, yieldData);\n }\n\n lastChunk = data;\n\n while (queue.length > 0) {\n yield { sequence: seq++, data: queue.shift()!, done: false };\n }\n }\n };\n\n return new Pump<U>(gen());\n }\n\n /**\n * Async map means that each incoming chunk is causing an async operation that when it completes\n * should yield a new chunk.\n * The pipe closes only after you unlock the pipe by using the unlockCloseEvent callback.\n *\n * Stateful refers to the fact that you can create your own small context object that is passed in the subsequent callbacks.\n * This allows you to keep track of things like a socket connection.\n *\n * Why is this nice? Well if you use things like a socket the pipe might have received the close event,\n * before you got any or all of your socket responses. Sockets don't fit into the standard promise pattern,\n * which makes it harder to wait for them.\n *\n * TODO: Un-tested\n *\n * @param handlers Object containing callback functions for stream processing\n * @param handlers.onFirstChunk Function called when the first chunk arrives, initializes the context\n * @param handlers.onChunk Function called for each subsequent chunk, updates the context\n * @param handlers.onClose Optional function called when the stream closes, allows final processing\n * @returns A new Pump instance with transformed data\n */\n asyncStatefulMap<Context, U = T>(handlers: {\n onFirstChunk(\n chunk: T,\n yieldData: (data: U) => void,\n unlockCloseEvent: () => void\n ): Context | Promise<Context>;\n onChunk(\n chunk: T,\n context: Context,\n yieldData: (data: U) => void,\n unlockCloseEvent: () => void\n ): Context | Promise<Context>;\n onClose?(\n lastChunk: T | undefined,\n context: Context,\n yieldData: (data: U) => void,\n unlockCloseEvent: () => void\n ): void | Promise<void>;\n }): Pump<U> {\n const { src } = this;\n\n const gen = async function* (): AsyncGenerator<StreamChunk<U>> {\n let context: Context | undefined;\n let initialized = false;\n let lastChunk: T | undefined;\n let seq = 0;\n let lockedCloseEvent = true;\n\n const queue: U[] = [];\n const yieldData = (data: U): void => {\n queue.push(data);\n };\n const unlockCloseEvent = (): void => {\n lockedCloseEvent = false;\n };\n\n for await (const { data, done } of src) {\n if (done) {\n if (context && handlers.onClose) {\n await handlers.onClose(\n lastChunk,\n context,\n yieldData,\n unlockCloseEvent\n );\n }\n\n const timestamp = Date.now();\n // wait until the pipe is unlocked\n while (lockedCloseEvent && Date.now() - timestamp < 10_000) {\n // First emit all data in the queue\n while (queue.length > 0) {\n yield { sequence: seq++, data: queue.shift()!, done: false };\n }\n // put on top of event loop / call stack\n await new Promise((resolve) => setTimeout(resolve, 5));\n }\n\n // First emit all data in the queue\n while (queue.length > 0) {\n yield { sequence: seq++, data: queue.shift()!, done: false };\n }\n\n yield {\n sequence: seq++,\n data: undefined as unknown as U,\n done: true,\n };\n break;\n }\n if (!initialized) {\n context = await handlers.onFirstChunk(\n data,\n yieldData,\n unlockCloseEvent\n );\n initialized = true;\n } else if (context) {\n context = await handlers.onChunk(\n data,\n context,\n yieldData,\n unlockCloseEvent\n );\n }\n\n lastChunk = data;\n\n while (queue.length > 0) {\n yield { sequence: seq++, data: queue.shift()!, done: false };\n }\n }\n };\n\n return new Pump<U>(gen());\n }\n\n /**\n * Filter items based on a predicate\n *\n * @param predicate A function that determines whether to keep each chunk\n * @returns A new Pump instance containing only chunks that passed the predicate\n */\n filter(predicate: (data: T) => boolean | Promise<boolean>): Pump<T> {\n async function* gen(this: Pump<T>): AsyncGenerator<StreamChunk<T>> {\n for await (const { sequence, data, done } of this.src) {\n if (done) {\n yield { sequence, data, done: true };\n break;\n }\n\n const keep = await predicate(data);\n if (keep) {\n yield { sequence, data, done: false };\n }\n }\n }\n return new Pump<T>(gen.call(this));\n }\n\n /**\n * Bundles (accumulates) chunks together based on a condition rather than a fixed size.\n *\n * This is useful when you need to group chunks dynamically based on their content or other criteria.\n *\n * Example: Bundling text chunks with a maximum character limit\n *\n * Input chunks: [\"Hello\", \" this\", \" is\", \" a few\", \" chunks\", \" of text\"]\n * With max size of 10 characters:\n * - First bundle: [\"Hello\", \" this\"] (10 chars)\n * - Second bundle: [\" is\", \" a few\"] (8 chars)\n * - Third bundle: [\" chunks\", \" of text\"] (13 chars)\n *\n * @param closeBundleCondition - Function that determines when to close the current bundle\n * Returns true when the current bundle should be emitted\n * Parameters:\n * - chunk: The current chunk being processed\n * - accumulatedChunks: Array of chunks in the current bundle\n *\n * @returns A pump that emits arrays of bundled items\n */\n bundle(\n closeBundleCondition: (\n chunk: T,\n accumulatedChunks: Array<T>\n ) => boolean | Promise<boolean>\n ): Pump<Array<T>> {\n async function* gen(this: Pump<T>): AsyncGenerator<StreamChunk<Array<T>>> {\n let buffer: Array<T> = [];\n let lastSequence = 0;\n\n for await (const { sequence, data, done } of this.src) {\n lastSequence = sequence;\n\n if (done) {\n // Emit any remaining items in the buffer when the stream ends\n if (buffer.length > 0) {\n yield { sequence, data: [...buffer], done: false };\n }\n // Emit the termination signal\n yield {\n sequence: lastSequence,\n data: undefined as unknown as Array<T>,\n done: true,\n };\n break;\n }\n\n const shouldClose = await closeBundleCondition(data, buffer);\n buffer.push(data);\n\n if (shouldClose) {\n yield {\n sequence: lastSequence,\n data: [...buffer],\n done: false,\n };\n buffer = [];\n }\n }\n }\n return new Pump<Array<T>>(gen.call(this));\n }\n\n /**\n * Tap into each chunk without altering it\n *\n * @param fn A function that receives each chunk but doesn't affect the stream\n * @returns The same pump instance with unmodified data\n */\n onChunk(fn: (chunk: T) => void | Promise<void>): Pump<T> {\n async function* gen(this: Pump<T>): AsyncGenerator<StreamChunk<T>> {\n for await (const chunk of this.src) {\n if (chunk.data === undefined && chunk.done) {\n // Yield early since we don't need to tap into a closing signal (unless it contains data)\n yield chunk;\n }\n\n await fn(chunk.data);\n yield chunk;\n }\n }\n return new Pump<T>(gen.call(this));\n }\n\n /**\n * Collect all chunks in the stream and run a callback when the stream is done.\n * The callback receives an array of all chunks that passed through.\n *\n * This is useful for analytics, logging, or processing the complete stream history\n * after all chunks have been received.\n *\n * @param fn - Callback function that receives the array of all chunks when the stream is complete\n * @returns The same pump, for chaining\n */\n onClose(fn: (history: T[]) => void | Promise<void>): Pump<T> {\n async function* gen(this: Pump<T>): AsyncGenerator<StreamChunk<T>> {\n const history: T[] = [];\n\n for await (const chunk of this.src) {\n // Add non-done chunks to history\n if (chunk.data !== undefined) {\n history.push(chunk.data);\n }\n\n // If we've reached the end, run the callback\n if (chunk.done) {\n await fn(history);\n }\n\n // Pass through the chunk unchanged\n yield chunk;\n }\n }\n return new Pump<T>(gen.call(this));\n }\n\n /**\n * Batch `n` chunks into arrays before emitting\n *\n * @param n The number of chunks to batch together\n * @returns A new Pump instance that emits arrays of batched chunks\n */\n batch(n: number): Pump<Array<T>> {\n async function* gen(this: Pump<T>): AsyncGenerator<StreamChunk<Array<T>>> {\n let buffer: StreamChunk<T>[] = [];\n\n for await (const chunk of this.src) {\n if (chunk.done) {\n // Termination signal edge case handling\n if (chunk.data === undefined) {\n // Flush the rest\n yield {\n sequence: buffer[0].sequence,\n data: buffer.map((c) => c.data),\n done: false,\n };\n\n // and then emit the termination signal\n yield {\n sequence: chunk.sequence,\n data: undefined as unknown as Array<T>,\n done: true,\n };\n buffer = [];\n } else {\n // in that case the termination signal contains data\n // so we need to emit this as a closing singal with the rest of the buffer\n buffer.push(chunk);\n yield {\n sequence: buffer[0].sequence,\n data: buffer.map((c) => c.data),\n done: true,\n };\n }\n\n break;\n }\n\n // Normal case\n\n buffer.push(chunk);\n\n if (buffer.length === n) {\n yield {\n sequence: buffer[0].sequence,\n data: buffer.map((c) => c.data),\n done: chunk.done,\n };\n buffer = [];\n }\n }\n }\n return new Pump<Array<T>>(gen.call(this));\n }\n\n /**\n * If you want to prevent chunk starvation, you can buffer the chunks.\n * Chunks will not be bundled into arrays or object but kept as is,\n * but the pipeline will not progress at that segment until the buffer is filled up.\n * Once a buffer is filled up it will drain and never buffer again.\n *\n * @param n The number of chunks to buffer before processing continues\n * @returns A new Pump instance with buffering behavior\n */\n buffer(n: number): Pump<T> {\n async function* gen(this: Pump<T>): AsyncGenerator<StreamChunk<T>> {\n let buffer: StreamChunk<T>[] = [];\n let bufferFilled = false;\n\n for await (const chunk of this.src) {\n if (!bufferFilled) {\n if (!chunk.done) {\n buffer.push(chunk);\n }\n\n // If buffer is filled or we've reached the end of the stream\n if (buffer.length >= n || chunk.done) {\n bufferFilled = true;\n // Yield all buffered chunks\n for (const bufferedChunk of buffer) {\n yield bufferedChunk;\n }\n if (chunk.done) {\n yield {\n sequence: chunk.sequence,\n data: undefined as unknown as T,\n done: true,\n };\n break;\n }\n buffer = [];\n }\n } else {\n // After buffer is filled, just pass chunks through\n yield chunk;\n }\n }\n\n // Yield any remaining chunks in the buffer\n for (const bufferedChunk of buffer) {\n yield bufferedChunk;\n }\n }\n return new Pump<T>(gen.call(this));\n }\n\n /**\n * Rechunk the stream: transform one chunk into zero, one, or many output chunks.\n * The handler function receives the current buffer of chunks, a push function to emit new chunks,\n * and a flag indicating if this is the last chunk in the stream.\n *\n * @param handler Function that transforms chunks and pushes new ones\n * @returns A new Pump instance with rechunked data\n */\n rechunk(\n handler: (params: {\n buffer: T[];\n push: (chunk: T) => void;\n lastChunk: boolean;\n setBuffer: (buffer: T[]) => void;\n }) => void | Promise<void>\n ): Pump<T> {\n async function* gen(this: Pump<T>): AsyncGenerator<StreamChunk<T>> {\n let buffer: Array<T> = [];\n let seq = 0;\n const pending: Array<T> = [];\n\n const push = (chunk: T): void => {\n pending.push(chunk);\n };\n\n for await (const { data, done } of this.src) {\n if (!done) {\n if (data !== undefined) {\n buffer.push(data);\n }\n await handler({\n buffer,\n push,\n lastChunk: false,\n setBuffer: (b: T[]) => {\n buffer = b;\n },\n });\n } else {\n await handler({\n buffer,\n push,\n lastChunk: true,\n setBuffer: (b: T[]) => {\n buffer = b;\n },\n });\n }\n\n while (pending.length > 0) {\n const out = pending.shift()!;\n yield { sequence: seq++, data: out, done: false };\n }\n\n if (done) {\n break;\n }\n }\n\n yield { sequence: seq, data: undefined as unknown as T, done: true };\n }\n\n return new Pump<T>(gen.call(this));\n }\n\n /**\n * Emit sliding windows of the last `size` items with step `step`.\n * Each window is an array [current, previous1, ..., previous(size-1)].\n * Optionally, map each window through a function.\n *\n * | Step | Window | Resulting Window |\n * |------|--------|------------------|\n * | 1 | ▪︎▪︎[▪︎▫︎▫︎] | ▪︎▫︎▫︎ |\n * | 2 | ▪︎[▪︎▪︎▫︎] | ▪︎▪︎▫︎ |\n * | 3 | [▪︎▪︎▪︎] | ▪︎▪︎▪︎ |\n * | 4 | [▫︎▪︎▪︎] | ▫︎▪︎▪︎ |\n * | 5 | [▫︎▫︎▪︎] | ▫︎▫︎▪ |\n *\n * @param size The size of each window\n * @param step The number of items to move between windows\n * @returns A Pump that emits arrays representing sliding windows\n */\n slidingWindow(size: number, step: number): Pump<Array<T | undefined>>;\n /**\n * Emit sliding windows of the last `size` items with step `step`,\n * and map each window using the provided function.\n *\n * @template N The size type parameter (extends number)\n * @template U The output type after window transformation\n * @param size The size of each window\n * @param step The number of items to move between windows\n * @param fn A function to transform each window\n * @returns A Pump that emits transformed sliding windows\n */\n slidingWindow<N extends number, U>(\n size: N,\n step: number,\n fn: (window: Array<T | undefined>) => U | Promise<U>\n ): Pump<U>;\n slidingWindow<U>(\n size: number,\n step: number,\n fn?: (window: Array<T | undefined>) => U | Promise<U>\n ): Pump<Array<T | undefined>> | Pump<U> {\n async function* gen(\n this: Pump<T>\n ): AsyncGenerator<StreamChunk<Array<T | undefined>>> {\n const history: Array<T> = [];\n let offset = 0;\n let lastSeq = 0;\n\n function buildWindow(\n _offset: number,\n _size: number,\n _history: Array<T>\n ): Array<T | undefined> {\n const window: Array<T | undefined> = Array(_size).fill(undefined);\n let windowIndex = 0;\n\n for (let i = _offset; i > _offset - _size; i -= step) {\n if (i >= history.length) {\n windowIndex++;\n // we can skip this since we are filling the blank spots with undefined\n continue;\n }\n\n if (i < 0) {\n break;\n }\n\n window[windowIndex] = _history[i]; // the window follows the analoy so its filled reversed from the graphic\n windowIndex++;\n }\n\n return window;\n }\n\n for await (const { sequence, data, done } of this.src) {\n if (done) {\n // if we are done that means we are not receiving any more signals to push the window\n // so we have to emit the last window steps\n // [▪︎▪︎▫︎]\n // [▪︎▫︎▫︎]\n for (let i = 0; i < size - 1; i++) {\n const window = buildWindow(offset + i, size, history);\n yield { sequence: lastSeq, data: window, done: false };\n }\n\n if (data === undefined) {\n // final done signal\n yield {\n sequence: lastSeq,\n data: undefined as unknown as Array<T>,\n done: true,\n };\n } else {\n // final done signal\n yield {\n sequence: lastSeq,\n data: [\n history[history.length - 2] ?? undefined,\n history[history.length - 3] ?? undefined,\n history[history.length - 1],\n ],\n done: true,\n };\n }\n break;\n }\n\n lastSeq = sequence;\n history.push(data);\n\n // the rolling window goes from the oldest to the newest and pushes it self\n // with a step length. The analogy of the pipe shifts the window from right to left\n // but the array appends to the end. So in this implementation we are shifting from left to right.\n\n // lets calculate the window indexes\n // [▫︎▫︎▪︎]▪︎▪︎\n // [▫︎▪︎▪︎]▪︎\n // [▪︎▪︎▪︎]\n // [▪︎▪︎▫︎] <- this case is handled above\n // [▪︎▫︎▫︎] <- this case is handled above\n const window = buildWindow(offset, size, history);\n\n yield { sequence, data: window, done: false };\n offset++;\n }\n }\n const base = new Pump<Array<T | undefined>>(gen.call(this));\n // If fn is provided, map over the window, otherwise return the window as is\n return fn\n ? base.map(fn as (window: Array<T | undefined>) => U)\n : (base as Pump<Array<T | undefined>>);\n }\n\n /**\n * Sequentially flatten inner stream sources emitted by the pipeline.\n * Works with any Source type (AsyncIterable or ReadableStream).\n * This method is only available when the current Pump contains Source elements.\n *\n * @template U The type of data in the inner streams\n * @template F The type of inner stream source (extends Source<U>)\n * @returns A Pump instance with flattened stream data\n */\n sequenceStreams<U, F extends Source<U>>(this: Pump<F>): Pump<U> {\n async function* gen(this: Pump<F>): AsyncGenerator<StreamChunk<U>> {\n let seq = 0;\n\n for await (const { data: innerSource, done: outerDone } of this.src) {\n if (outerDone) break;\n\n // Convert the inner source to a pump first\n const innerPump = Pump.from(innerSource as unknown as Source<U>);\n\n // Then extract all items from it\n for await (const { data, done } of innerPump.src) {\n if (done) break;\n yield { sequence: seq++, data: data as U, done: false };\n }\n }\n\n yield { sequence: seq, data: undefined as unknown as U, done: true };\n }\n return new Pump<U>(gen.call(this));\n }\n\n /**\n * Fork the stream: two independent Pump<T> consumers\n * Both resulting Pumps will receive the same data, allowing for divergent processing paths.\n *\n * @returns An array containing two independent Pump instances with the same source data\n */\n fork(): [Pump<T>, Pump<T>] {\n const buffers: StreamChunk<T>[][] = [[], []];\n let done = false;\n const srcIter = this.src[Symbol.asyncIterator]();\n\n async function fill(): Promise<void> {\n const { value, done: streamDone } = await srcIter.next();\n if (streamDone) {\n done = true;\n return;\n }\n buffers.forEach((q) => q.push(value));\n if (value.done) done = true;\n }\n\n function makeStream(buf: StreamChunk<T>[]): MessageStream<T> {\n return {\n [Symbol.asyncIterator](): AsyncIterator<StreamChunk<T>> {\n return {\n async next(): Promise<IteratorResult<StreamChunk<T>>> {\n while (buf.length === 0 && !done) {\n await fill();\n }\n if (buf.length === 0)\n return {\n done: true,\n value: undefined as unknown as StreamChunk<T>,\n };\n return { done: false, value: buf.shift()! };\n },\n };\n },\n };\n }\n\n return [new Pump(makeStream(buffers[0])), new Pump(makeStream(buffers[1]))];\n }\n\n /**\n * Drain the pipeline, consuming all chunks.\n * Returns a Promise that resolves when all chunks have been consumed.\n *\n * @returns A Promise that resolves when all chunks have been consumed\n */\n drain(): Promise<void> {\n return (async (): Promise<void> => {\n for await (const { done } of this.src) {\n if (done) break;\n }\n })();\n }\n\n /**\n * Drain the pipeline to a StreamTransformer.\n * Applies transform() to each data chunk, then closes the transformer,\n * and returns its response (which can be of any type defined by the transformer).\n *\n * Example with httpStreamResponse:\n * ```\n * const { transform, response, close } = httpStreamResponse(options);\n * return Pump.from(messageStream).drainTo({ transform, close, response });\n * ```\n *\n * @template U The type of data expected by the transformer (extends T)\n * @template R The response type produced by the transformer\n * @param transformer The StreamTransformer to drain to\n * @returns The response from the transformer\n */\n drainTo<U extends T, R>(transformer: StreamTransformer<U, R>): R {\n (async (): Promise<void> => {\n for await (const { data, done } of this.src) {\n if (done) break;\n transformer.transform(data as unknown as U);\n }\n transformer.close();\n })();\n return transformer.response;\n }\n}\n\n// ----------------------------------------------------------\n// Example usage in Next.js App Router (e.g. app/api/stream/route.ts)\n//\n// import { NextRequest } from 'next/server';\n// import { Pump } from '@m4trix/core/stream';\n// import { /*...*/ } from '@/lib';\n\n// export async function POST(req: NextRequest) {\n// // Process the incoming audio request\n// const formData = await req.formData();\n// const transcript = await transcribeFormData(formData);\n// const agentStream = await getAgentResponse(transcript);\n\n// // Process and return the stream\n// return await Pump.from(agentStream)\n// .filter(shouldChunkBeStreamed)\n// .map(messageToText)\n// .bundle(intoChunksOfMinLength(40))\n// .map((text) => text.join(\"\")) // convert array of strings to string\n// .rechunk(ensureFullWords)\n// .rechunk(fixBrokenWords)\n// .onClose(handleCompletedAgentResponse)\n// .slidingWindow(10, 1)\n// .filter(filterOutIrrelevantWindows)\n// .buffer(5)\n// .map(textToSpeech)\n// .sequenceStreams()\n// .drainTo(httpStreamResponse());\n// }\n","import { StreamTransformer } from '../..';\n\nexport interface HttpStreamOptions<T> {\n /** HTTP ResponseInit (status, headers, etc.) */\n init?: ResponseInit;\n /** Encode each chunk of type T into bytes or string */\n encoder?: (data: T) => Uint8Array | string;\n}\n\n/**\n * Create a streaming HTTP response transformer.\n * Returns an object with:\n * - transform: function to write each chunk into the response\n * - response: the Fetch API Response ready to return\n * - close: function to close the stream when done\n *\n * Usage in a Next.js route:\n * ```\n * // With the new drainTo API:\n * const transformer = httpStreamResponse(options);\n * return Pump.from(messageStream).drainTo(transformer);\n *\n * // Or with manual control:\n * const { transform, response, close } = httpStreamResponse(options);\n * await Pump.from(messageStream).map(transform).drain();\n * close();\n * return response;\n * ```\n */\nexport function httpStreamResponse<T>(\n options: HttpStreamOptions<T> = {}\n): StreamTransformer<T, Response> {\n const { init, encoder } = options;\n const encodeFn =\n encoder ??\n ((d: T): Uint8Array | string => {\n if (d instanceof Uint8Array) return d;\n if (typeof d === 'string') return d;\n return JSON.stringify(d);\n });\n\n // Create a transform stream of Uint8Array\n const { readable, writable } = new TransformStream<Uint8Array>();\n const writer = writable.getWriter();\n const response = new Response(readable, init);\n\n const transform = (chunk: T): T => {\n const encoded = encodeFn(chunk);\n const bytes =\n typeof encoded === 'string' ? new TextEncoder().encode(encoded) : encoded;\n writer.write(bytes);\n return chunk;\n };\n\n const close = (): void => {\n writer.close();\n };\n\n return { transform, response, close };\n}\n","/**\n * A helper to be used with Pump.rechunk that ensures full word chunks.\n * Aggregates incoming chunks and emits only when a full word boundary is reached.\n */\nexport async function ensureFullWords({\n buffer,\n push,\n lastChunk,\n}: {\n buffer: string[];\n push: (chunk: string) => void;\n lastChunk: boolean;\n}): Promise<void> {\n const combined = buffer.join('');\n const lastBoundary = Math.max(\n combined.lastIndexOf(' '),\n combined.lastIndexOf('\\n'),\n combined.lastIndexOf('\\t')\n );\n\n if (lastBoundary !== -1 || lastChunk) {\n const emitPart =\n lastBoundary !== -1 ? combined.slice(0, lastBoundary + 1) : combined;\n const leftoverPart =\n lastBoundary !== -1 ? combined.slice(lastBoundary + 1) : '';\n\n if (emitPart.trim().length > 0) {\n push(emitPart);\n }\n\n buffer.length = 0;\n if (leftoverPart.length > 0) {\n buffer.push(leftoverPart);\n }\n }\n}\n","import { Socket } from 'socket.io';\nimport { Hooks, SetupSocketHandlersParams } from './socket-factory-types';\n\nexport class SocketIoFactory {\n private socket: Socket;\n private prefix: string;\n private hooks: Hooks<Socket>;\n\n private constructor(socket: Socket, prefix: string, hooks: Hooks<Socket>) {\n this.socket = socket;\n this.prefix = prefix;\n this.hooks = hooks;\n }\n\n static setupSocketHandlers({\n enableVoiceEvents,\n enableChatEvents,\n enableTranscriptEvents,\n prefix = '',\n socket,\n hooks,\n }: SetupSocketHandlersParams<\n Socket,\n {\n socket: Socket;\n }\n >): void {\n // Adapter will override the hooks\n\n const factory = new SocketIoFactory(socket, prefix, hooks!);\n if (enableVoiceEvents) {\n factory.setupVoiceEvents();\n }\n\n if (enableChatEvents) {\n factory.setupChatEvents(socket);\n }\n\n if (enableTranscriptEvents) {\n factory.setupTranscriptEvents(socket);\n }\n }\n\n private setupVoiceEvents(): void {\n const {\n onVoiceInputFile,\n onVoiceInputChunk,\n onVoiceInputCommit,\n onVoiceOutputDelta,\n onVoiceOutputCommit,\n onVoiceOutputFile,\n onVoiceOutputTranscriptDelta,\n onVoiceOutputTranscriptFull,\n } = this.hooks;\n\n const prefix = this.prefixEvent;\n\n if (onVoiceInputFile) {\n this.socket.on(prefix('voice:input_file'), onVoiceInputFile);\n }\n\n if (onVoiceInputChunk) {\n this.socket.on(prefix('voice:input_chunk'), onVoiceInputChunk);\n }\n\n if (onVoiceInputCommit) {\n this.socket.on(prefix('voice:input_commit'), onVoiceInputCommit);\n }\n\n if (onVoiceOutputDelta) {\n this.socket.on(prefix('voice:output_delta'), onVoiceOutputDelta);\n }\n\n if (onVoiceOutputCommit) {\n this.socket.on(prefix('voice:output_commit'), onVoiceOutputCommit);\n }\n\n if (onVoiceOutputFile) {\n this.socket.on(prefix('voice:output_file'), onVoiceOutputFile);\n }\n\n if (onVoiceOutputTranscriptDelta) {\n this.socket.on(\n prefix('voice:output_transcript_delta'),\n onVoiceOutputTranscriptDelta\n );\n }\n\n if (onVoiceOutputTranscriptFull) {\n this.socket.on(\n prefix('voice:output_transcript_full'),\n onVoiceOutputTranscriptFull\n );\n }\n }\n\n private setupChatEvents(_socket: Socket): void {\n // TODO: Implement chat event handler\n }\n\n private setupTranscriptEvents(_socket: Socket): void {\n // TODO: Implement transcript event handlers\n }\n\n private prefixEvent(event: string): string {\n return this.prefix ? `${this.prefix}:${event}` : event;\n }\n}\n","import { BaseMessage, AIMessage, ToolMessage } from '@langchain/core/messages';\nimport { Effect, pipe } from 'effect';\nimport {\n MessageFilter,\n MessageFilterType,\n typeOnFilter,\n} from './message-filter';\nimport { FormatType, typeOnFormatter } from './formatter';\n\n/**\n * # Transform Messages\n * In order to manage the context size often you want to slice messages or only pass certain types of messages.\n * This class is a helper to do that.\n *\n * ## Example\n * ```ts\n * const messages = [\n * new HumanMessage('Hello, how are you?'),\n * new AIMessage('I am good, thank you!'),\n * ];\n *\n * const transformedMessages = TransformMessages.from(messages).filter(HumanAndAI).last(10).format(FormatType.Concise);\n *\n * ```\n */\n\nclass TransformMessages {\n private effect: Effect.Effect<Array<BaseMessage>, never, never>;\n\n private constructor(effect: Effect.Effect<Array<BaseMessage>, never, never>) {\n this.effect = effect;\n }\n\n /**\n * Create a new TransformMessages from an array of messages.\n */\n static from(messages: Array<BaseMessage>): TransformMessages {\n return new TransformMessages(Effect.succeed(messages));\n }\n\n /**\n * Filter messages based on a predicate function\n */\n filter(\n predicate: MessageFilter | MessageFilterType,\n tags?: Array<string>\n ): TransformMessages {\n let finalPredicate: MessageFilter;\n if (typeof predicate === 'string') {\n finalPredicate = typeOnFilter[predicate];\n } else {\n finalPredicate = predicate;\n }\n\n return new TransformMessages(\n pipe(\n this.effect,\n Effect.map((messages) =>\n messages.filter((message) => finalPredicate(message, tags))\n )\n )\n );\n }\n\n /**\n * Take only the last n messages, but safely.\n * Tool calls should not be separated from the last human message.\n * Ensures all tool call conversations in the last n messages are complete.\n */\n safelyTakeLast(\n n: number,\n pruneAfterNOvershootingMessages: number = 0\n ): TransformMessages {\n return new TransformMessages(\n pipe(\n this.effect,\n Effect.map((messages) => {\n const total = messages.length;\n if (n <= 0 || total === 0) return [];\n\n // Start with the last n messages\n const start = Math.max(0, total - n);\n const end = total;\n const lastSlice = messages.slice(start, end);\n\n // due to the fact that the calling AI message needs to be adjecent to the succeeding tool call message\n // we just need to check the last n messages for tool call ids\n\n // Check the first message if it is a tool call message\n // if it is iterate backwards until we find the AI message\n if (\n lastSlice[0] instanceof ToolMessage &&\n lastSlice[0].tool_call_id\n ) {\n let messagesToInclude: Array<BaseMessage> = [];\n const remainingMessages = messages.slice(0, start);\n for (let i = remainingMessages.length - 1; i >= 0; i--) {\n const msg = remainingMessages[i];\n if (\n pruneAfterNOvershootingMessages > 0 &&\n messagesToInclude.length - 1 >= pruneAfterNOvershootingMessages\n ) {\n messagesToInclude = [];\n // Return the slice but remove all the tool call messages that are at the beginning of the slice\n const filteredSlice: Array<BaseMessage> = [];\n let foundFirstNonToolMessage = false;\n for (let i = 0; i < lastSlice.length; i++) {\n const msg = lastSlice[i];\n if (msg instanceof ToolMessage) {\n if (foundFirstNonToolMessage) {\n filteredSlice.push(msg);\n }\n } else {\n foundFirstNonToolMessage = true;\n filteredSlice.push(msg);\n }\n }\n return filteredSlice;\n }\n if (msg instanceof AIMessage && Array.isArray(msg.tool_calls)) {\n messagesToInclude.push(msg);\n break;\n } else if (msg instanceof ToolMessage) {\n messagesToInclude.push(msg);\n } else {\n // This should not happen messages invalid\n throw new Error(\n 'Messages array invalid no adjacent AI message found'\n );\n }\n }\n return [...messagesToInclude.reverse(), ...lastSlice];\n } else {\n return lastSlice;\n }\n })\n )\n );\n }\n\n /**\n * Take only the last n messages\n */\n last(n: number): TransformMessages {\n return new TransformMessages(\n pipe(\n this.effect,\n Effect.map((messages) => messages.slice(-n))\n )\n );\n }\n\n /**\n * Take only the first n messages\n */\n first(n: number): TransformMessages {\n return new TransformMessages(\n pipe(\n this.effect,\n Effect.map((messages) => messages.slice(0, n))\n )\n );\n }\n\n /**\n * Skip the first n messages\n */\n skip(n: number): TransformMessages {\n return new TransformMessages(\n pipe(\n this.effect,\n Effect.map((messages) => messages.slice(n))\n )\n );\n }\n\n /**\n * Reverse the order of messages\n */\n reverse(): TransformMessages {\n return new TransformMessages(\n pipe(\n this.effect,\n Effect.map((messages) => [...messages].reverse())\n )\n );\n }\n\n /**\n * Map over messages with a transformation function\n */\n map<T extends BaseMessage>(\n fn: (message: BaseMessage) => T\n ): TransformMessages {\n return new TransformMessages(\n pipe(\n this.effect,\n Effect.map((messages) => messages.map(fn))\n )\n );\n }\n\n /**\n * Format messages according to the specified format type\n */\n format(formatType: FormatType): string {\n const result = Effect.runSync(\n pipe(\n this.effect,\n Effect.map((messages) => {\n if (formatType === FormatType.JSON) {\n return JSON.stringify(messages, null, 2);\n }\n const formatter = typeOnFormatter[formatType];\n return formatter(messages);\n })\n )\n );\n return result;\n }\n\n // Sink methods\n\n /**\n * Convert to array - runs the effect and returns the result\n return pipe(\n this.effect,\n Effect.map((messages) => {\n if (formatType === FormatType.JSON) {\n return JSON.stringify(messages, null, 2);\n }\n\n const formatter = typeOnFormatter[formatType];\n return formatter(messages);\n })\n );\n }\n\n // Sink methods\n\n /**\n * Convert to array - runs the effect and returns the result\n */\n toArray(): Array<BaseMessage> {\n return Effect.runSync(this.effect);\n }\n\n /**\n * Convert to string - runs the effect and returns JSON string\n */\n toString(): string {\n const result = Effect.runSync(\n pipe(\n this.effect,\n Effect.map((messages) => JSON.stringify(messages, null, 2))\n )\n );\n return result;\n }\n\n /**\n * Get the count of messages\n */\n count(): number {\n const result = Effect.runSync(\n pipe(\n this.effect,\n Effect.map((messages) => messages.length)\n )\n );\n return result;\n }\n}\n\nexport { TransformMessages };\n","import { BaseMessage, HumanMessage, AIMessage } from '@langchain/core/messages';\n\n// Type for message filters\nexport type MessageFilter = (\n message: BaseMessage,\n tags?: Array<string>\n) => boolean;\n// Predefined filters\nconst humanAndAI: MessageFilter = (message) =>\n message instanceof HumanMessage || message instanceof AIMessage;\nconst humanOnly: MessageFilter = (message) => message instanceof HumanMessage;\nconst aiOnly: MessageFilter = (message) => message instanceof AIMessage;\n\nconst includingTags: MessageFilter = (message, tags) => {\n if (tags) {\n return tags.some((tag) =>\n Array.isArray(message.additional_kwargs?.tags)\n ? message.additional_kwargs?.tags.includes(tag)\n : false\n );\n }\n return true;\n};\n\nconst excludingTags: MessageFilter = (message, tags) => {\n if (tags) {\n return !tags.some((tag) =>\n Array.isArray(message.additional_kwargs?.tags)\n ? message.additional_kwargs?.tags.includes(tag)\n : false\n );\n }\n return true;\n};\n\nexport enum MessageFilterType {\n HumanAndAI = 'HumanAndAI',\n HumanOnly = 'HumanOnly',\n AIOnly = 'AIOnly',\n IncludingTags = 'IncludingTags',\n ExcludingTags = 'ExcludingTags',\n}\nexport const typeOnFilter = {\n [MessageFilterType.HumanAndAI]: humanAndAI,\n [MessageFilterType.HumanOnly]: humanOnly,\n [MessageFilterType.AIOnly]: aiOnly,\n [MessageFilterType.IncludingTags]: includingTags,\n [MessageFilterType.ExcludingTags]: excludingTags,\n};\n","import { AIMessage, BaseMessage } from '@langchain/core/messages';\n\n// Format types\nexport enum FormatType {\n Concise = 'concise',\n Verbose = 'verbose',\n RedactAi = 'redact-ai',\n RedactHuman = 'redact-human',\n JSON = 'json',\n}\n\n/**\n * Formats messages in a concise markdown format with alternating AI and Human prefixes.\n *\n * ### Example\n * ```markdown\n * AI: Hello, how are you?\n * Human: I am good, thank you!\n * AI: What is your name?\n * Human: My name is John.\n * AI: What is your favorite color?\n * Human: My favorite color is blue.\n * AI: What is your favorite food?\n * Human: My favorite food is pizza.\n * ```\n */\nfunction concise(messages: Array<BaseMessage>): string {\n return messages\n .map((message) => {\n const prefix = message instanceof AIMessage ? 'AI' : 'Human';\n return `${prefix}: ${message.content}`;\n })\n .join('\\n');\n}\n\n/**\n * Formats messages in a verbose markdown format with alternating AI and Human prefixes.\n *\n * ### Example\n * ```markdown\n * AI:\n * Hello, how are you?\n * -------------------\n * Human:\n * I am good, thank you!\n * -------------------\n * AI:\n * What is your name?\n * -------------------\n * Human:\n * My name is John.\n * ```\n */\nfunction verbose(messages: Array<BaseMessage>): string {\n return messages\n .map((message) => {\n const prefix = message instanceof AIMessage ? 'AI' : 'Human';\n return `${prefix}:\\n${message.content}`;\n })\n .join('\\n-------------------\\n');\n}\n\n/**\n * Formats messages in a concise markdown format, redacting AI messages with [...]\n *\n * ### Example\n * ```markdown\n * AI: [...]\n * Human: Hello, how are you?\n * AI: [...]\n * Human: I am good, thank you!\n * AI: [...]\n * Human: What is your name?\n * AI: [...]\n * Human: My name is John.\n * AI: [...]\n * ```\n */\nfunction redactAi(messages: Array<BaseMessage>): string {\n return messages\n .map((message) => {\n const prefix = message instanceof AIMessage ? 'AI' : 'Human';\n const content = message instanceof AIMessage ? '[...]' : message.content;\n return `${prefix}: ${content}`;\n })\n .join('\\n');\n}\n\n/**\n * Formats messages in a concise markdown format, redacting Human messages with [...]\n *\n * ### Example\n * ```markdown\n * AI: Hello, how are you?\n * Human: [...]\n * AI: What is your name?\n * Human: [...]\n * AI: What is your favorite color?\n * Human: [...]\n * AI: What is your favorite food?\n * Human: [...]\n * ```\n */\nfunction redactHuman(messages: Array<BaseMessage>): string {\n return messages\n .map((message) => {\n const prefix = message instanceof AIMessage ? 'AI' : 'Human';\n const content = message instanceof AIMessage ? '[...]' : message.content;\n return `${prefix}: ${content}`;\n })\n .join('\\n');\n}\nconst typeOnFormatter = {\n [FormatType.Concise]: concise,\n [FormatType.Verbose]: verbose,\n [FormatType.RedactAi]: redactAi,\n [FormatType.RedactHuman]: redactHuman,\n};\n\nexport { typeOnFormatter };\n","import { Effect, Scope } from 'effect';\nimport type { Schema as S } from 'effect';\nimport type { AgentFactory } from '../agent-factory';\nimport type { AgentNetworkEventDef } from './agent-network-event';\nimport { ChannelName, ConfiguredChannel, Sink } from './channel';\nimport { createEventPlane, run } from './event-plane';\nimport type { Envelope, EventPlane } from './event-plane';\nimport { expose } from '../io/expose';\nimport type { ExposeOptions, ExposedAPI } from '../io/types';\nimport type { AgentNetworkStore } from './stores/agent-network-store';\nimport { createInMemoryNetworkStore } from './stores/inmemory-network-store';\n\n/* ─── Helper Types ─── */\n\ntype EventDef = AgentNetworkEventDef<string, S.Schema.Any>;\n\n/** Structural interface for any Agent – avoids variance issues with private fields. */\nexport interface AnyAgent {\n getId(): string;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n invoke(options?: any): Promise<void>;\n /** Event names this agent listens to. Empty = listen to all. */\n getListensTo?(): readonly string[];\n}\n\n/* ─── Agent Binding (returned by registerAgent) ─── */\n\nexport type AgentBinding = {\n subscribe(channel: ConfiguredChannel): AgentBinding;\n publishTo(channel: ConfiguredChannel): AgentBinding;\n};\n\n/* ─── Spawner Builder ─── */\n\nexport type SpawnFn = (\n agent: AnyAgent,\n bindings?: { subscribe?: string[]; publishTo?: string[] },\n) => void;\n\nexport type SpawnCallbackContext<\n TRegistry extends Record<string, AgentFactory> = Record<string, AgentFactory>,\n> = {\n kind: keyof TRegistry & string;\n factory: TRegistry[keyof TRegistry & string];\n payload: {\n id: string;\n params: Record<string, unknown>;\n subscribe?: string[];\n publishTo?: string[];\n };\n spawn: SpawnFn;\n};\n\nexport type SpawnerBuilder<\n TRegistry extends Record<string, AgentFactory> = Record<string, AgentFactory>,\n> = {\n listen(\n channel: ConfiguredChannel,\n event: EventDef,\n ): SpawnerBuilder<TRegistry>;\n registry<R extends Record<string, AgentFactory>>(reg: R): SpawnerBuilder<R>;\n defaultBinding(\n fn: (ctx: { kind: string }) => {\n subscribe: string[];\n publishTo: string[];\n },\n ): SpawnerBuilder<TRegistry>;\n onSpawn(\n fn: (ctx: SpawnCallbackContext<TRegistry>) => AnyAgent,\n ): SpawnerBuilder<TRegistry>;\n};\n\n/* ─── Setup Context ─── */\n\nexport type SetupContext = {\n mainChannel: (name: string) => ConfiguredChannel;\n createChannel: (name: string) => ConfiguredChannel;\n sink: typeof Sink;\n registerAgent: (agent: AnyAgent) => AgentBinding;\n spawner: (factory: typeof AgentFactory) => SpawnerBuilder;\n};\n\n/* ─── Internal Registration Records ─── */\n\ntype AgentRegistration = {\n agent: AnyAgent;\n subscribedTo: ConfiguredChannel[];\n publishesTo: ConfiguredChannel[];\n};\n\ntype SpawnerRegistration = {\n factoryClass: typeof AgentFactory;\n listenChannel?: ConfiguredChannel;\n listenEvent?: EventDef;\n registry: Record<string, AgentFactory>;\n defaultBindingFn?: (ctx: { kind: string }) => {\n subscribe: string[];\n publishTo: string[];\n };\n onSpawnFn?: (\n ctx: SpawnCallbackContext<Record<string, AgentFactory>>,\n ) => AnyAgent;\n};\n\n/* ─── AgentNetwork ─── */\n\nexport class AgentNetwork {\n private _mainChannel: ConfiguredChannel | undefined;\n private channels: Map<ChannelName, ConfiguredChannel> = new Map();\n private agentRegistrations: Map<string, AgentRegistration> = new Map();\n private spawnerRegistrations: SpawnerRegistration[] = [];\n private _store: AgentNetworkStore<Envelope>;\n\n private constructor() {\n this._store = createInMemoryNetworkStore<Envelope>();\n }\n\n /* ─── Public Static Factory ─── */\n\n static setup(callback: (ctx: SetupContext) => void): AgentNetwork {\n const network = new AgentNetwork();\n\n const ctx: SetupContext = {\n mainChannel: (name: string) => {\n const channel = network.addChannel(name);\n network.setMainChannel(channel);\n return channel;\n },\n createChannel: (name: string) => network.addChannel(name),\n sink: Sink,\n registerAgent: (agent) => network.registerAgentInternal(agent),\n spawner: (factory) => network.createSpawnerInternal(factory),\n };\n\n callback(ctx);\n\n return network;\n }\n\n /* ─── Internal Builders ─── */\n\n private addChannel(name: string): ConfiguredChannel {\n const channelName = ChannelName(name);\n const channel = new ConfiguredChannel(channelName);\n this.channels.set(channelName, channel);\n return channel;\n }\n\n private setMainChannel(channel: ConfiguredChannel): void {\n this._mainChannel = channel;\n }\n\n private registerAgentInternal(agent: AnyAgent): AgentBinding {\n const registration: AgentRegistration = {\n agent,\n subscribedTo: [],\n publishesTo: [],\n };\n this.agentRegistrations.set(agent.getId(), registration);\n\n const binding: AgentBinding = {\n subscribe(channel: ConfiguredChannel) {\n registration.subscribedTo.push(channel);\n return binding;\n },\n publishTo(channel: ConfiguredChannel) {\n registration.publishesTo.push(channel);\n return binding;\n },\n };\n\n return binding;\n }\n\n private createSpawnerInternal(\n factoryClass: typeof AgentFactory,\n ): SpawnerBuilder {\n const reg: SpawnerRegistration = {\n factoryClass,\n registry: {},\n };\n\n this.spawnerRegistrations.push(reg);\n\n const builder: SpawnerBuilder = {\n listen(channel: ConfiguredChannel, event: EventDef) {\n reg.listenChannel = channel;\n reg.listenEvent = event;\n return builder;\n },\n registry(registry: Record<string, AgentFactory>) {\n reg.registry = registry;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n return builder as SpawnerBuilder<any>;\n },\n defaultBinding(\n fn: (ctx: { kind: string }) => {\n subscribe: string[];\n publishTo: string[];\n },\n ) {\n reg.defaultBindingFn = fn;\n return builder;\n },\n onSpawn(\n fn: (\n ctx: SpawnCallbackContext<Record<string, AgentFactory>>,\n ) => AnyAgent,\n ) {\n reg.onSpawnFn = fn;\n return builder;\n },\n };\n\n return builder;\n }\n\n /* ─── Accessors ─── */\n\n getChannels(): Map<string, ConfiguredChannel> {\n return this.channels;\n }\n\n getMainChannel(): ConfiguredChannel | undefined {\n return this._mainChannel;\n }\n\n getAgentRegistrations(): Map<string, AgentRegistration> {\n return this.agentRegistrations;\n }\n\n getSpawnerRegistrations(): ReadonlyArray<SpawnerRegistration> {\n return this.spawnerRegistrations;\n }\n\n /** Store defined at network setup time. Shared across all event planes created for this network. */\n getStore(): AgentNetworkStore<Envelope> {\n return this._store;\n }\n\n /**\n * Expose the network as a streamable API (e.g. SSE). Returns an ExposedAPI\n * that adapters (NextEndpoint, ExpressEndpoint) consume to produce streamed\n * responses.\n *\n * @example\n * const api = network.expose({ protocol: \"sse\", auth, select });\n * export const GET = NextEndpoint.from(api, { requestToContextId, requestToRunId }).handler();\n */\n expose(options: ExposeOptions): ExposedAPI {\n return expose(this, options);\n }\n\n /**\n * Starts the event plane: creates one PubSub per channel and runs subscriber\n * loops for each (agent, channel) pair. Agents subscribed to a channel are\n * invoked concurrently when events are published to that channel.\n *\n * Returns the EventPlane for publishing. Use `Effect.scoped` so the run is\n * interrupted when the scope ends.\n */\n run(capacity?: number): Effect.Effect<EventPlane, never, Scope.Scope> {\n return this.runScoped(this, capacity);\n }\n\n private runScoped(\n network: AgentNetwork,\n capacity?: number,\n ): Effect.Effect<EventPlane, never, Scope.Scope> {\n return Effect.gen(function* () {\n const plane = yield* createEventPlane({\n network,\n capacity,\n store: network.getStore(),\n });\n yield* Effect.fork(run(network, plane));\n return plane;\n });\n }\n}\n","import { Brand } from 'effect';\n\n/** Regex: lowercase alphanumeric segments separated by hyphens (e.g. my-channel-name) */\nconst KEBAB_CASE_REGEX = /^[a-z0-9]+(-[a-z0-9]+)*$/;\n\n/**\n * Branded type for channel names. Enforces kebab-case at runtime via refinement.\n *\n * **Branded types** add a nominal marker so TypeScript treats `ChannelName` as\n * distinct from plain `string`, preventing accidental substitution (e.g. passing\n * a raw string where a validated channel name is expected).\n *\n * **Refinement** validates at runtime that the value matches kebab-case before\n * the brand is applied. Use `ChannelName(value)` to create a validated instance.\n */\nexport type ChannelName = string & Brand.Brand<'ChannelName'>;\n\nexport const ChannelName = Brand.refined<ChannelName>(\n (s) => typeof s === 'string' && KEBAB_CASE_REGEX.test(s),\n (s) => Brand.error(`Expected kebab-case (e.g. my-channel-name), got: ${s}`),\n);\n","import { type Schema as S } from 'effect';\nimport type { AgentNetworkEventDef } from './agent-network-event';\nimport { ChannelName } from '../identifiers/channel-name';\n\nexport { ChannelName } from '../identifiers/channel-name';\n\n/* ─── Sink ─── */\n\nexport type SinkDef = {\n readonly _tag: 'SinkDef';\n readonly type: string;\n readonly config: unknown;\n};\n\nexport const Sink = {\n kafka(config: { topic: string }): SinkDef {\n return { _tag: 'SinkDef', type: 'kafka', config };\n },\n httpStream(): SinkDef {\n return { _tag: 'SinkDef', type: 'http-stream', config: {} };\n },\n};\n\nexport function isHttpStreamSink(sink: SinkDef): boolean {\n return sink.type === 'http-stream';\n}\n\n/* ─── Channel Definitions ─── */\n\ntype EventDef = AgentNetworkEventDef<string, S.Schema.Any>;\n\nexport type ChannelDef = {\n readonly _tag: 'ChannelDef';\n readonly name: ChannelName;\n};\n\n/**\n * A channel configured via the builder pattern inside `AgentNetwork.setup()`.\n * Supports `.events()`, `.sink()`, and `.sinks()` chaining.\n */\nexport class ConfiguredChannel {\n readonly _tag = 'ConfiguredChannel' as const;\n readonly name: ChannelName;\n private _events: ReadonlyArray<EventDef> = [];\n private _sinks: ReadonlyArray<SinkDef> = [];\n\n constructor(name: ChannelName) {\n this.name = name;\n }\n\n events(events: ReadonlyArray<EventDef>): this {\n this._events = [...events];\n return this;\n }\n\n sink(sink: SinkDef): this {\n this._sinks = [...this._sinks, sink];\n return this;\n }\n\n sinks(sinks: ReadonlyArray<SinkDef>): this {\n this._sinks = [...sinks];\n return this;\n }\n\n getEvents(): ReadonlyArray<EventDef> {\n return this._events;\n }\n\n getSinks(): ReadonlyArray<SinkDef> {\n return this._sinks;\n }\n}\n\nexport const Channel = {\n of(name: ChannelName): ChannelDef {\n return {\n _tag: 'ChannelDef' as const,\n name,\n };\n },\n};\n","import { Cause, Effect, Fiber, PubSub, Queue, Scope } from 'effect';\nimport type { AgentNetwork, AnyAgent } from './agent-network';\nimport type {\n ContextEvents,\n EventMeta,\n RunEvents,\n} from './agent-network-event';\nimport type { ChannelName, ConfiguredChannel } from './channel';\nimport type { AgentNetworkStore } from './stores/agent-network-store';\nimport { createInMemoryNetworkStore } from './stores/inmemory-network-store';\n\n/* ─── Envelope ─── */\n\nexport type Envelope = {\n name: string;\n meta: EventMeta;\n payload: unknown;\n};\n\n/* ─── EventPlane ─── */\n\nexport type EventPlane = {\n readonly publish: (\n channel: ChannelName,\n envelope: Envelope,\n ) => Effect.Effect<boolean>;\n readonly publishToChannels: (\n channels: readonly ConfiguredChannel[],\n envelope: Envelope,\n ) => Effect.Effect<boolean>;\n readonly subscribe: (\n channel: ChannelName,\n ) => Effect.Effect<Queue.Dequeue<Envelope>, never, Scope.Scope>;\n readonly getRunEvents: (runId: string, contextId: string) => RunEvents;\n readonly getContextEvents: (contextId: string) => ContextEvents;\n readonly shutdown: Effect.Effect<void>;\n};\n\n/* ─── Create EventPlane ─── */\n\nconst DEFAULT_CAPACITY = 16;\n\ntype CreateEventPlaneOptions = {\n network: AgentNetwork;\n capacity?: number;\n store?: AgentNetworkStore<Envelope>;\n};\n\n/**\n * Creates an EventPlane from an AgentNetwork. One PubSub per channel with\n * bounded back-pressure. Use `Effect.scoped` when running to ensure proper\n * cleanup.\n */\nexport const createEventPlane = (\n options: CreateEventPlaneOptions,\n): Effect.Effect<EventPlane> =>\n Effect.gen(function* () {\n const {\n network,\n capacity = DEFAULT_CAPACITY,\n store = createInMemoryNetworkStore<Envelope>(),\n } = options;\n\n const channels = network.getChannels();\n const pubsubs = new Map<ChannelName, PubSub.PubSub<Envelope>>();\n\n for (const channel of channels.values()) {\n const pubsub = yield* PubSub.bounded<Envelope>(capacity);\n pubsubs.set(channel.name, pubsub);\n }\n\n const getPubsub = (channel: ChannelName): PubSub.PubSub<Envelope> => {\n const p = pubsubs.get(channel);\n if (!p) throw new Error(`Channel not found: ${channel}`);\n return p;\n };\n\n const recordEvent = (envelope: Envelope): void => {\n const { contextId, runId } = envelope.meta;\n store.storeEvent(contextId, runId, envelope);\n };\n\n const publishToPubSub = (\n channel: ChannelName,\n envelope: Envelope,\n ): Effect.Effect<boolean> => PubSub.publish(getPubsub(channel), envelope);\n\n const publish = (\n channel: ChannelName,\n envelope: Envelope,\n ): Effect.Effect<boolean> =>\n Effect.sync(() => recordEvent(envelope)).pipe(\n Effect.flatMap(() => publishToPubSub(channel, envelope)),\n Effect.withSpan('event.publish', {\n attributes: {\n 'event.name': envelope.name,\n 'event.payload': payloadForSpan(envelope.payload),\n channel,\n runId: envelope.meta.runId,\n contextId: envelope.meta.contextId,\n },\n }),\n );\n\n const publishToChannels = (\n targetChannels: readonly ConfiguredChannel[],\n envelope: Envelope,\n ): Effect.Effect<boolean> =>\n Effect.sync(() => recordEvent(envelope)).pipe(\n Effect.flatMap(() =>\n Effect.all(\n targetChannels.map((c) => publishToPubSub(c.name, envelope)),\n { concurrency: 'unbounded' },\n ),\n ),\n Effect.map((results) => results.every(Boolean)),\n Effect.withSpan('event.publish', {\n attributes: {\n 'event.name': envelope.name,\n 'event.payload': payloadForSpan(envelope.payload),\n runId: envelope.meta.runId,\n contextId: envelope.meta.contextId,\n },\n }),\n );\n\n const subscribe = (\n channel: ChannelName,\n ): Effect.Effect<Queue.Dequeue<Envelope>, never, Scope.Scope> =>\n PubSub.subscribe(getPubsub(channel));\n\n const getRunEvents = (runId: string, contextId: string): RunEvents => {\n return store.getEvents(contextId, runId).slice();\n };\n\n const getContextEvents = (contextId: string): ContextEvents => {\n const byRun = store.getContextEvents(contextId);\n const map = new Map<string, readonly Envelope[]>();\n const all: Envelope[] = [];\n for (const [runId, events] of byRun) {\n const readonlyEvents = events.slice();\n map.set(runId, readonlyEvents);\n all.push(...readonlyEvents);\n }\n return {\n all,\n byRun: (runId: string) => map.get(runId) ?? [],\n map,\n };\n };\n\n const shutdown = Effect.all([...pubsubs.values()].map(PubSub.shutdown), {\n concurrency: 'unbounded',\n }).pipe(Effect.asVoid);\n\n return {\n publish,\n publishToChannels,\n subscribe,\n getRunEvents,\n getContextEvents,\n shutdown,\n };\n });\n\n/** Serialize payload for span attributes; truncate if too long */\nfunction payloadForSpan(payload: unknown, maxLen = 500): string {\n try {\n const s = JSON.stringify(payload);\n return s.length > maxLen ? `${s.slice(0, maxLen)}...` : s;\n } catch {\n return String(payload);\n }\n}\n\n/* ─── Run Subscriber Loop ─── */\n\n/**\n * Runs a single agent's subscription loop on one channel. Takes messages from\n * the dequeue, invokes the agent with the envelope as triggerEvent when the\n * event name matches the agent's listensTo, and wires emit to publish to the\n * agent's output channels.\n */\ntype EmitQueue = Queue.Queue<{\n channels: readonly ConfiguredChannel[];\n envelope: Envelope;\n}>;\n\nexport const runSubscriber = (\n agent: AnyAgent,\n publishesTo: readonly ConfiguredChannel[],\n dequeue: Queue.Dequeue<Envelope>,\n plane: EventPlane,\n emitQueue?: EmitQueue,\n channelName?: ChannelName,\n): Effect.Effect<Fiber.RuntimeFiber<void, never>> =>\n Effect.gen(function* () {\n const listensTo = agent.getListensTo?.() ?? [];\n const agentId = agent.getId();\n\n const processOne = (): Effect.Effect<void, never, never> =>\n Effect.gen(function* () {\n const envelope = yield* Queue.take(dequeue);\n if (listensTo.length > 0 && !listensTo.includes(envelope.name)) {\n return;\n }\n const runEvents = plane.getRunEvents(\n envelope.meta.runId,\n envelope.meta.contextId,\n );\n const contextEvents = plane.getContextEvents(envelope.meta.contextId);\n yield* Effect.withSpan('agent.listen', {\n attributes: {\n agentId,\n 'event.name': envelope.name,\n 'event.payload': payloadForSpan(envelope.payload),\n ...(channelName !== undefined && { channel: channelName }),\n },\n })(\n Effect.withSpan('agent.invoke', {\n attributes: {\n agentId,\n 'event.name': envelope.name,\n 'event.payload': payloadForSpan(envelope.payload),\n },\n })(\n Effect.tryPromise({\n try: () =>\n agent.invoke({\n triggerEvent: envelope,\n emit: (userEvent: { name: string; payload: unknown }) => {\n const fullEnvelope: Envelope = {\n name: userEvent.name,\n meta: envelope.meta,\n payload: userEvent.payload,\n };\n if (emitQueue) {\n Effect.runPromise(\n Queue.offer(emitQueue, {\n channels: publishesTo,\n envelope: fullEnvelope,\n }),\n ).catch(() => {});\n } else {\n Effect.runFork(\n plane.publishToChannels(publishesTo, fullEnvelope),\n );\n }\n },\n runEvents,\n contextEvents,\n }),\n catch: (e) => e,\n }),\n ),\n );\n }).pipe(\n Effect.catchAllCause((cause) =>\n Cause.isInterrupted(cause)\n ? Effect.void\n : Effect.sync(() => {\n console.error(`Agent ${agent.getId()} failed:`, cause);\n }).pipe(Effect.asVoid),\n ),\n );\n\n const loop = (): Effect.Effect<void, never, never> =>\n processOne().pipe(Effect.flatMap(() => loop()));\n\n return yield* Effect.fork(loop());\n });\n\n/* ─── Run Network ─── */\n\nexport type RunOptions = {\n /** When provided, agent emits are queued and published by a drain fiber in the same Effect context. Use when run is forked from expose without a shared plane. */\n emitQueue?: EmitQueue;\n};\n\n/**\n * Runs the event plane: starts a subscriber loop for each (agent, channel)\n * pair. Runs until the scope ends (e.g. on interrupt). Use Effect.scoped\n * to ensure subscriptions are properly cleaned up.\n */\nexport const run = (\n network: AgentNetwork,\n plane: EventPlane,\n options?: RunOptions,\n): Effect.Effect<void, never, Scope.Scope> =>\n Effect.gen(function* () {\n const registrations = network.getAgentRegistrations();\n const emitQueue = options?.emitQueue;\n\n for (const reg of registrations.values()) {\n for (const channel of reg.subscribedTo) {\n const dequeue = yield* plane.subscribe(channel.name);\n yield* runSubscriber(\n reg.agent,\n reg.publishesTo,\n dequeue,\n plane,\n emitQueue,\n channel.name,\n );\n }\n }\n\n yield* Effect.never;\n });\n","/**\n * Type-safe no-operation stubs for use as default handlers.\n *\n * `noop` and `asyncNoop` are assignable to any callback that expects\n * additional parameters — TypeScript allows a function with fewer\n * parameters to substitute for one expecting more.\n *\n * @example\n * ```ts\n * type LogicFn = (ctx: { params: Config; emit: Emitter }) => Promise<void>;\n * const defaultLogic: LogicFn = asyncNoop;\n * ```\n */\n\n/** Synchronous no-op — safe default for any `(...) => void` handler. */\nexport const noop = (): void => {};\n\n/** Asynchronous no-op — safe default for any `(...) => Promise<void>` handler. */\nexport const asyncNoop = async (): Promise<void> => {};\n\n/** Synchronous no-op that returns a given value — for handlers that must return `R`. */\nexport const noopOf =\n <R>(value: R): (() => R) =>\n () =>\n value;\n\n/** Asynchronous no-op that resolves to a given value — for handlers that must return `Promise<R>`. */\nexport const asyncNoopOf =\n <R>(value: R): (() => Promise<R>) =>\n async () =>\n value;\n","import { asyncNoop } from '../../../helper/types/noop';\nimport type { AgentNetworkStore } from './agent-network-store';\n\n/**\n * In-memory implementation of AgentNetworkStore. Events are stored in a\n * nested map: contextId -> runId -> events.\n */\nexport const createInMemoryNetworkStore = <T>(): AgentNetworkStore<T> => {\n const store = new Map<string, Map<string, T[]>>();\n\n return {\n storeEvent: (contextId: string, runId: string, event: T): void => {\n let byRun = store.get(contextId);\n if (!byRun) {\n byRun = new Map();\n store.set(contextId, byRun);\n }\n let events = byRun.get(runId);\n if (!events) {\n events = [];\n byRun.set(runId, events);\n }\n events.push(event);\n },\n\n getEvents: (contextId: string, runId: string): T[] => {\n const events = store.get(contextId)?.get(runId);\n return events ? [...events] : [];\n },\n\n getContextEvents: (contextId: string): Map<string, T[]> => {\n const byRun = store.get(contextId);\n const result = new Map<string, T[]>();\n if (byRun) {\n for (const [runId, events] of byRun) {\n result.set(runId, [...events]);\n }\n }\n return result;\n },\n\n getFullStore: (): Map<string, Map<string, T[]>> => {\n const result = new Map<string, Map<string, T[]>>();\n for (const [contextId, byRun] of store) {\n const contextMap = new Map<string, T[]>();\n for (const [runId, events] of byRun) {\n contextMap.set(runId, [...events]);\n }\n result.set(contextId, contextMap);\n }\n return result;\n },\n\n persist: (): Promise<void> => asyncNoop(),\n load: (): Promise<void> => asyncNoop(),\n };\n};\n","import { Effect, Queue } from 'effect';\nimport type { AgentNetwork } from '../agent-network/agent-network';\nimport type { ConfiguredChannel } from '../agent-network/channel';\nimport { createEventPlane, run } from '../agent-network/event-plane';\nimport type { Envelope } from '../agent-network/event-plane';\nimport { ChannelName, isHttpStreamSink } from '../agent-network/channel';\nimport type {\n ExposeOptions,\n ExposeRequest,\n ExposedAPI,\n ExposedStream,\n StreamFactory,\n} from './types';\n\n/** Extract JSON payload from ExposeRequest. POST with JSON body, or Express req.body, else {}. */\nasync function extractPayload(req: ExposeRequest): Promise<unknown> {\n const webRequest = req.request as Request | undefined;\n if (webRequest?.method === 'POST') {\n const ct = webRequest.headers?.get?.('content-type') ?? '';\n if (ct.includes('application/json')) {\n try {\n return await webRequest.json();\n } catch {\n return {};\n }\n }\n }\n const expressReq = req.req as { body?: unknown } | undefined;\n if (expressReq?.body != null) {\n return expressReq.body;\n }\n return {};\n}\n\n/** Resolve which channel(s) to subscribe to from select options */\nfunction resolveChannels(\n network: AgentNetwork,\n select?: ExposeOptions['select'],\n): ChannelName[] {\n const channels = network.getChannels();\n if (select?.channels) {\n const ch = select.channels;\n const arr = Array.isArray(ch) ? ch : [ch];\n return arr.map((c) => ChannelName(c as string));\n }\n // Prefer channels with http-stream sink (explicitly marked for frontend)\n const httpStreamChannels = [...channels.values()]\n .filter((ch) => ch.getSinks().some(isHttpStreamSink))\n .map((ch) => ch.name);\n if (httpStreamChannels.length > 0) return httpStreamChannels;\n // Fallback: prefer \"client\", else first channel\n const client = channels.get('client' as ChannelName);\n if (client) return [client.name];\n const first = channels.values().next().value;\n return first ? [first.name] : [];\n}\n\n/** Create async iterable from Queue.Dequeue, respecting AbortSignal */\nfunction streamFromDequeue(\n take: () => Promise<Envelope>,\n signal?: AbortSignal | null,\n eventFilter?: string[],\n): ExposedStream {\n const shouldInclude = (e: Envelope): boolean =>\n !eventFilter?.length || eventFilter.includes(e.name);\n\n return {\n async *[Symbol.asyncIterator](): AsyncIterableIterator<Envelope> {\n while (!signal?.aborted) {\n const takePromise = take();\n const abortPromise = signal\n ? new Promise<never>((_, reject) => {\n signal.addEventListener(\n 'abort',\n () => reject(new DOMException('Aborted', 'AbortError')),\n { once: true },\n );\n })\n : new Promise<never>(() => {});\n\n let envelope: Envelope;\n try {\n envelope = await Promise.race([takePromise, abortPromise]);\n } catch (e) {\n if (e instanceof DOMException && e.name === 'AbortError') break;\n throw e;\n }\n\n if (shouldInclude(envelope)) yield envelope;\n }\n },\n };\n}\n\n/**\n * Expose the agent network as a streamable API. Returns an ExposedAPI that\n * adapters (NextEndpoint, ExpressEndpoint) consume to produce SSE responses.\n *\n * @example\n * const api = agentNetwork.expose({ protocol: \"sse\", auth, select });\n * export const GET = NextEndpoint.from(api, { requestToContextId, requestToRunId }).handler();\n */\nexport function expose(\n network: AgentNetwork,\n options: ExposeOptions,\n): ExposedAPI {\n const {\n auth,\n select,\n plane: providedPlane,\n onRequest,\n triggerEvents,\n tracingLayer,\n } = options;\n const triggerEventDef = triggerEvents?.[0];\n const triggerEventName = triggerEventDef?.name ?? 'request';\n const channels = resolveChannels(network, select);\n const eventFilter = select?.events;\n const mainChannel = network.getMainChannel();\n\n if (channels.length === 0) {\n throw new Error('expose: no channels to subscribe to');\n }\n\n const createStream = (async (\n req: ExposeRequest,\n consumer?: (stream: ExposedStream) => Promise<unknown>,\n ) => {\n const payload = await extractPayload(req);\n const signal = req.request?.signal;\n\n const program = Effect.gen(function* () {\n const plane =\n providedPlane ??\n (yield* createEventPlane({ network, store: network.getStore() }));\n if (!providedPlane) {\n const emitQueue = yield* Queue.unbounded<{\n channels: readonly ConfiguredChannel[];\n envelope: Envelope;\n }>();\n yield* Effect.fork(\n Effect.forever(\n Queue.take(emitQueue).pipe(\n Effect.flatMap(({ channels: chs, envelope }) =>\n plane.publishToChannels(chs, envelope),\n ),\n ),\n ),\n );\n yield* Effect.fork(run(network, plane, { emitQueue }));\n // Allow run() to subscribe agents before we publish (PubSub does not buffer for future subscribers)\n yield* Effect.sleep('10 millis');\n }\n\n const targetChannel = mainChannel?.name ?? channels[0]!;\n let runId = req.runId ?? crypto.randomUUID();\n let contextId = req.contextId ?? crypto.randomUUID();\n\n const setRunId = (id: string): void => {\n runId = id;\n };\n const setContextId = (id: string): void => {\n contextId = id;\n };\n\n const emitStartEvent = (opts: {\n contextId: string;\n runId: string;\n event: { name: string; payload: unknown };\n }): void => {\n const meta = {\n runId: opts.runId,\n contextId: opts.contextId,\n };\n const envelope: Envelope = {\n name: opts.event.name,\n meta,\n payload: opts.event.payload,\n };\n Effect.runPromise(plane.publish(targetChannel, envelope)).catch(\n () => {},\n );\n };\n\n // Subscribe to first channel before emitting (so we don't miss agent output)\n const dequeue = yield* plane.subscribe(channels[0]!);\n\n if (onRequest) {\n yield* Effect.tryPromise(() =>\n Promise.resolve(\n onRequest({\n setRunId,\n setContextId,\n emitStartEvent,\n req,\n payload,\n }),\n ),\n );\n } else if (!providedPlane) {\n const envelope: Envelope = {\n name: triggerEventName,\n meta: { runId, contextId },\n payload,\n };\n yield* plane.publish(targetChannel, envelope);\n yield* Effect.sleep('10 millis');\n }\n const take = (): Promise<Envelope> =>\n Effect.runPromise(Queue.take(dequeue)) as Promise<Envelope>;\n\n const stream = streamFromDequeue(take, signal ?? undefined, eventFilter);\n if (consumer) {\n return yield* Effect.tryPromise(() => consumer(stream));\n }\n return stream;\n });\n\n const runnable = tracingLayer\n ? program.pipe(Effect.provide(tracingLayer), Effect.scoped)\n : program.pipe(Effect.scoped);\n return Effect.runPromise(runnable);\n }) as StreamFactory;\n\n return {\n protocol: 'sse',\n createStream: (async (\n req: ExposeRequest,\n consumer?: (stream: ExposedStream) => Promise<unknown>,\n ) => {\n if (auth) {\n const result = await auth(req);\n if (!result.allowed) {\n throw new ExposeAuthError(\n result.message ?? 'Unauthorized',\n result.status ?? 401,\n );\n }\n }\n return consumer ? createStream(req, consumer) : createStream(req);\n }) as StreamFactory,\n };\n}\n\n/** Thrown when auth denies the request */\nexport class ExposeAuthError extends Error {\n constructor(\n message: string,\n public readonly status: number = 401,\n ) {\n super(message);\n this.name = 'ExposeAuthError';\n }\n}\n","import { Effect, Schema as S } from 'effect';\nimport type { ParseError } from 'effect/ParseResult';\n\n/** Standard meta carried by every event */\nexport const EventMetaSchema = S.Struct({\n runId: S.String,\n contextId: S.String,\n correlationId: S.optional(S.String),\n causationId: S.optional(S.String),\n ts: S.optional(S.Number),\n});\n\nexport type EventMeta = S.Schema.Type<typeof EventMetaSchema>;\n\n/** Envelope-like shape for events (avoids circular dep with event-plane) */\nexport type EnvelopeLike = { name: string; meta: EventMeta; payload: unknown };\nexport type RunEvents = readonly EnvelopeLike[];\n\nexport type ContextEvents = {\n /** All events in the context across all runs */\n readonly all: readonly EnvelopeLike[];\n /** Get events for a specific run */\n byRun(runId: string): readonly EnvelopeLike[];\n /** Map of runId -> events */\n readonly map: ReadonlyMap<string, readonly EnvelopeLike[]>;\n};\n\n// Re-export Schema from effect for convenience\nexport { Schema as S } from 'effect';\n\nexport type AgentNetworkEventDef<\n EventName extends string,\n PayloadSchema extends S.Schema.Any,\n> = {\n readonly _tag: 'AgentNetworkEventDef';\n readonly name: EventName;\n readonly payload: PayloadSchema;\n\n /** Decode unknown payload -> typed payload (Effect) */\n readonly decodePayload: (\n u: unknown,\n ) => Effect.Effect<S.Schema.Type<PayloadSchema>, ParseError>;\n\n /** Decode the full envelope (meta + payload) */\n readonly decode: (\n u: unknown,\n ) => Effect.Effect<\n { name: EventName; meta: EventMeta; payload: S.Schema.Type<PayloadSchema> },\n ParseError\n >;\n\n /**\n * Create an unbound event (name + payload only) for emit. Validates payload via schema.\n * Meta is injected by the runtime when the event is emitted.\n */\n readonly make: (payload: unknown) => {\n name: EventName;\n payload: S.Schema.Type<PayloadSchema>;\n };\n\n /**\n * Create a full envelope (meta + payload) for tests or manual trigger events.\n * Sync, throws on validation error.\n */\n readonly makeBound: (\n meta: unknown,\n payload: unknown,\n ) => {\n name: EventName;\n meta: EventMeta;\n payload: S.Schema.Type<PayloadSchema>;\n };\n\n /**\n * Effect version of make. Use when composing in Effect pipelines.\n */\n readonly makeEffect: (\n payload: unknown,\n ) => Effect.Effect<\n { name: EventName; payload: S.Schema.Type<PayloadSchema> },\n ParseError\n >;\n\n /**\n * Effect version of makeBound. Use when composing in Effect pipelines.\n */\n readonly makeBoundEffect: (\n meta: unknown,\n payload: unknown,\n ) => Effect.Effect<\n { name: EventName; meta: EventMeta; payload: S.Schema.Type<PayloadSchema> },\n ParseError\n >;\n\n /**\n * Type guard: returns true if `u` is a valid event of this type.\n */\n readonly is: (u: unknown) => u is {\n name: EventName;\n meta: EventMeta;\n payload: S.Schema.Type<PayloadSchema>;\n };\n};\n\ntype Envelope<EventName extends string, Meta, Payload> = {\n name: EventName;\n meta: Meta;\n payload: Payload;\n};\n\nexport const AgentNetworkEvent = {\n of<const EventName extends string, PS extends S.Schema.Any>(\n name: EventName,\n payload: PS,\n ): AgentNetworkEventDef<EventName, PS> {\n const decodePayload = S.decodeUnknown(payload);\n const envelopeSchema = S.Struct({\n name: S.Literal(name),\n meta: EventMetaSchema,\n payload,\n });\n const decodeEnvelope = S.decodeUnknown(envelopeSchema);\n\n const make = (\n payload: unknown,\n ): { name: EventName; payload: S.Schema.Type<PS> } => {\n const decoded = Effect.runSync(\n decodePayload(payload) as unknown as Effect.Effect<\n S.Schema.Type<PS>,\n ParseError\n >,\n );\n return { name, payload: decoded };\n };\n\n const makeBound = (\n meta: unknown,\n payload: unknown,\n ): Envelope<EventName, EventMeta, S.Schema.Type<PS>> =>\n Effect.runSync(\n decodeEnvelope({ name, meta, payload }) as unknown as Effect.Effect<\n Envelope<EventName, EventMeta, S.Schema.Type<PS>>,\n ParseError\n >,\n );\n\n const makeEffect = (\n payload: unknown,\n ): Effect.Effect<\n { name: EventName; payload: S.Schema.Type<PS> },\n ParseError\n > =>\n (\n decodePayload(payload) as unknown as Effect.Effect<\n S.Schema.Type<PS>,\n ParseError\n >\n ).pipe(Effect.map((p) => ({ name, payload: p })));\n\n const makeBoundEffect = (\n meta: unknown,\n payload: unknown,\n ): Effect.Effect<\n Envelope<EventName, EventMeta, S.Schema.Type<PS>>,\n ParseError\n > =>\n decodeEnvelope({ name, meta, payload }) as unknown as Effect.Effect<\n Envelope<EventName, EventMeta, S.Schema.Type<PS>>,\n ParseError\n >;\n\n const is = S.is(envelopeSchema) as unknown as (\n u: unknown,\n ) => u is Envelope<EventName, EventMeta, S.Schema.Type<PS>>;\n\n return {\n _tag: 'AgentNetworkEventDef' as const,\n name,\n payload,\n decodePayload: decodePayload as unknown as AgentNetworkEventDef<\n EventName,\n PS\n >['decodePayload'],\n decode: decodeEnvelope as unknown as AgentNetworkEventDef<\n EventName,\n PS\n >['decode'],\n make,\n makeBound,\n makeEffect,\n makeBoundEffect,\n is,\n };\n },\n};\n","import { randomUUID } from 'crypto';\nimport type {\n ContextEvents,\n RunEvents,\n} from './agent-network/agent-network-event';\n\ntype LogicFn<TParams, TTriggerEvent, TEmitEvent> = (ctx: {\n params: TParams;\n triggerEvent: TTriggerEvent;\n emit: (event: TEmitEvent) => void;\n runEvents: RunEvents;\n contextEvents: ContextEvents;\n}) => Promise<void>;\n\nexport class Agent<TParams, TTriggerEvent = never, TEmitEvent = never> {\n #params: TParams;\n #logic: LogicFn<TParams, TTriggerEvent, TEmitEvent>;\n #id: string;\n #listensTo: readonly string[];\n\n constructor(\n logic: LogicFn<TParams, TTriggerEvent, TEmitEvent>,\n params: TParams,\n listensTo?: readonly string[],\n ) {\n this.#logic = logic;\n this.#params = params;\n this.#id = `agent-${randomUUID()}`;\n this.#listensTo = listensTo ?? [];\n }\n\n getListensTo(): readonly string[] {\n return this.#listensTo;\n }\n\n async invoke(options?: {\n triggerEvent?: TTriggerEvent;\n emit?: (event: TEmitEvent) => void;\n runEvents?: RunEvents;\n contextEvents?: ContextEvents;\n }): Promise<void> {\n const { triggerEvent, emit, runEvents, contextEvents } = options ?? {};\n\n const emitFn =\n emit ??\n ((_event: TEmitEvent): void => {\n // no-op – will be wired by the network at runtime\n });\n\n await this.#logic({\n params: this.#params,\n triggerEvent: triggerEvent ?? (undefined as TTriggerEvent),\n emit: emitFn,\n runEvents: runEvents ?? [],\n contextEvents: contextEvents ?? {\n all: [],\n byRun: () => [],\n map: new Map(),\n },\n });\n }\n\n getId(): string {\n return this.#id;\n }\n}\n","import { Schema as S } from 'effect';\nimport { Agent } from './agent';\nimport {\n AgentNetworkEventDef,\n type ContextEvents,\n type EventMeta,\n type RunEvents,\n} from './agent-network/agent-network-event';\nimport { BaseSchemaDefintion } from './types';\n\ntype EventDef = AgentNetworkEventDef<string, S.Schema.Any>;\n\n/** Extracts the envelope type (name, meta, payload) from an event definition */\nexport type EventEnvelope<E extends EventDef> =\n E extends AgentNetworkEventDef<infer N, infer PS>\n ? { name: N; meta: EventMeta; payload: S.Schema.Type<PS> }\n : never;\n\n/** What the user passes to emit() – no meta required */\nexport type EmitPayload<E extends EventDef> =\n E extends AgentNetworkEventDef<infer N, infer PS>\n ? { name: N; payload: S.Schema.Type<PS> }\n : never;\n\n/** Internal logic function */\ntype LogicFn<TParams, TTriggerEvent, TEmitEvent> = (ctx: {\n params: TParams;\n triggerEvent: TTriggerEvent;\n emit: (event: TEmitEvent) => void;\n runEvents: RunEvents;\n contextEvents: ContextEvents;\n}) => Promise<void>;\n\ntype ConstructorParams<\n TParams,\n TListensTo extends EventDef,\n TEmits extends EventDef,\n> = {\n logic?: LogicFn<TParams, EventEnvelope<TListensTo>, EmitPayload<TEmits>>;\n paramsSchema?: BaseSchemaDefintion;\n listensTo?: ReadonlyArray<TListensTo>;\n emits?: ReadonlyArray<TEmits>;\n};\n\nexport class AgentFactory<\n TParams = unknown,\n TListensTo extends EventDef = never,\n TEmits extends EventDef = never,\n> {\n private _listensTo: ReadonlyArray<TListensTo>;\n private _emits: ReadonlyArray<TEmits>;\n private _logic:\n | LogicFn<TParams, EventEnvelope<TListensTo>, EmitPayload<TEmits>>\n | undefined;\n private _paramsSchema: BaseSchemaDefintion | undefined;\n\n private constructor({\n logic,\n paramsSchema,\n listensTo = [],\n emits = [],\n }: ConstructorParams<TParams, TListensTo, TEmits>) {\n this._logic = logic;\n this._paramsSchema = paramsSchema;\n this._listensTo = listensTo;\n this._emits = emits;\n }\n\n private getConstructorState(): ConstructorParams<\n TParams,\n TListensTo,\n TEmits\n > {\n return {\n logic: this._logic,\n paramsSchema: this._paramsSchema,\n listensTo: this._listensTo,\n emits: this._emits,\n };\n }\n\n /** Union of all event definitions this agent listens to */\n getListensTo(): ReadonlyArray<TListensTo> {\n return this._listensTo;\n }\n\n /** Union of all event definitions this agent can emit */\n getEmits(): ReadonlyArray<TEmits> {\n return this._emits;\n }\n\n getLogic():\n | LogicFn<TParams, EventEnvelope<TListensTo>, EmitPayload<TEmits>>\n | undefined {\n return this._logic;\n }\n\n static run(): AgentFactory<unknown, never, never> {\n return new AgentFactory<unknown, never, never>({});\n }\n\n params<TSchema extends BaseSchemaDefintion>(\n params: TSchema,\n ): AgentFactory<TSchema['Type'], TListensTo, TEmits> {\n const { logic, ...rest } = this.getConstructorState();\n\n return new AgentFactory({\n ...rest,\n logic: logic as LogicFn<\n TSchema['Type'],\n EventEnvelope<TListensTo>,\n EmitPayload<TEmits>\n >,\n paramsSchema: params,\n });\n }\n\n listensTo<E extends EventDef>(\n events: Array<E>,\n ): AgentFactory<TParams, TListensTo | E, TEmits> {\n return new AgentFactory<TParams, TListensTo | E, TEmits>({\n ...(this.getConstructorState() as unknown as ConstructorParams<\n TParams,\n TListensTo | E,\n TEmits\n >),\n listensTo: [...this._listensTo, ...events] as ReadonlyArray<\n TListensTo | E\n >,\n });\n }\n\n emits<E extends EventDef>(\n events: Array<E>,\n ): AgentFactory<TParams, TListensTo, TEmits | E> {\n return new AgentFactory<TParams, TListensTo, TEmits | E>({\n ...(this.getConstructorState() as unknown as ConstructorParams<\n TParams,\n TListensTo,\n TEmits | E\n >),\n emits: [...this._emits, ...events] as ReadonlyArray<TEmits | E>,\n });\n }\n\n logic(\n fn: LogicFn<TParams, EventEnvelope<TListensTo>, EmitPayload<TEmits>>,\n ): AgentFactory<TParams, TListensTo, TEmits> {\n return new AgentFactory<TParams, TListensTo, TEmits>({\n ...this.getConstructorState(),\n logic: fn,\n });\n }\n\n produce(\n params: TParams,\n ): Agent<TParams, EventEnvelope<TListensTo>, EmitPayload<TEmits>> {\n const listensTo = this._listensTo.map((e) => e.name);\n return new Agent<TParams, EventEnvelope<TListensTo>, EmitPayload<TEmits>>(\n this._logic!,\n params,\n listensTo,\n );\n }\n}\n","import type { Envelope } from '../../agent-network/event-plane';\n\n/** Format a single SSE message (event + data) */\nexport function formatSSE(envelope: Envelope): string {\n const data = JSON.stringify(envelope);\n return `event: ${envelope.name}\\ndata: ${data}\\n\\n`;\n}\n\n/** Create a ReadableStream that encodes envelopes as SSE */\nexport function toSSEStream(\n source: AsyncIterable<Envelope>,\n signal?: AbortSignal | null,\n): ReadableStream<Uint8Array> {\n const encoder = new TextEncoder();\n\n return new ReadableStream<Uint8Array>({\n async start(controller): Promise<void> {\n const onAbort = (): void => controller.close();\n signal?.addEventListener('abort', onAbort, { once: true });\n\n try {\n for await (const envelope of source) {\n if (signal?.aborted) break;\n controller.enqueue(encoder.encode(formatSSE(envelope)));\n }\n } finally {\n signal?.removeEventListener('abort', onAbort);\n controller.close();\n }\n },\n });\n}\n","import type { ExposedAPI } from '../types';\nimport { ExposeAuthError } from '../expose';\nimport { formatSSE } from '../protocols/sse';\n\n/** Next.js App Router GET/POST handler signature */\nexport type NextGetHandler = (request: Request) => Promise<Response>;\n\n/** Options for NextEndpoint.from() - required to define how request maps to contextId and runId */\nexport type NextEndpointOptions = {\n requestToContextId: (request: Request) => string;\n requestToRunId: (request: Request) => string;\n};\n\n/**\n * Adapter for Next.js App Router. Maps an ExposedAPI to a route handler\n * that streams events as SSE. Use for both GET and POST; POST with JSON body\n * is recommended for passing the start event payload.\n *\n * @example\n * const api = agentNetwork.expose({ protocol: \"sse\", auth, select });\n * const handler = NextEndpoint.from(api, {\n * requestToContextId: (req) => req.headers.get('x-correlation-id') ?? crypto.randomUUID(),\n * requestToRunId: () => crypto.randomUUID(),\n * }).handler();\n * export const GET = handler;\n * export const POST = handler;\n */\nexport const NextEndpoint = {\n from(api: ExposedAPI, options: NextEndpointOptions): {\n handler(): NextGetHandler;\n } {\n if (api.protocol !== 'sse') {\n throw new Error(`NextEndpoint: unsupported protocol \"${api.protocol}\"`);\n }\n\n const { requestToContextId, requestToRunId } = options;\n\n return {\n handler(): NextGetHandler {\n return async (request: Request) => {\n const req = {\n request,\n contextId: requestToContextId(request),\n runId: requestToRunId(request),\n };\n\n try {\n const encoder = new TextEncoder();\n const { readable, writable } =\n new TransformStream<Uint8Array>();\n\n // Signal that the consumer callback has been entered (auth passed, stream ready)\n let consumerStarted!: () => void;\n const started = new Promise<void>((resolve) => {\n consumerStarted = resolve;\n });\n\n const streamDone = api.createStream(req, async (stream) => {\n consumerStarted();\n const writer = writable.getWriter();\n try {\n for await (const envelope of stream) {\n if (request.signal?.aborted) break;\n await writer.write(encoder.encode(formatSSE(envelope)));\n }\n } finally {\n await writer.close();\n }\n });\n\n // Race: consumer starts (auth passed) vs. createStream rejects (auth failed)\n await Promise.race([started, streamDone]);\n\n // Auth passed. Stream is being written in the background.\n streamDone.catch(() => {}); // prevent unhandled rejection\n\n return new Response(readable, {\n headers: {\n 'Content-Type': 'text/event-stream',\n 'Cache-Control': 'no-cache',\n Connection: 'keep-alive',\n },\n });\n } catch (e) {\n if (e instanceof ExposeAuthError) {\n return new Response(e.message, { status: e.status });\n }\n throw e;\n }\n };\n },\n };\n },\n};\n","import type { ExposedAPI } from '../types';\nimport { ExposeAuthError } from '../expose';\nimport { formatSSE } from '../protocols/sse';\n\n/** Minimal Express-like request (compatible with express.Request) */\nexport type ExpressRequest = {\n on(event: 'close', fn: () => void): void;\n};\n\n/** Options for ExpressEndpoint.from() - required to define how request maps to contextId and runId */\nexport type ExpressEndpointOptions = {\n requestToContextId: (req: ExpressRequest) => string;\n requestToRunId: (req: ExpressRequest) => string;\n};\n\n/** Minimal Express-like response (compatible with express.Response) */\nexport type ExpressResponse = {\n setHeader(name: string, value: string | number): void;\n flushHeaders?(): void;\n write(chunk: Uint8Array): void;\n flush?(): void;\n end(): void;\n status(code: number): ExpressResponse;\n send(body: string): void;\n};\n\n/** Express route handler signature */\nexport type ExpressHandler = (\n req: ExpressRequest,\n res: ExpressResponse,\n) => void | Promise<void>;\n\n/**\n * Adapter for Express. Maps an ExposedAPI to an Express route handler\n * that streams events as SSE.\n *\n * @example\n * const api = agentNetwork.expose({ protocol: \"sse\", auth, select });\n * app.get(\"/events\", ExpressEndpoint.from(api, {\n * requestToContextId: (req) => req.headers?.['x-correlation-id'] ?? crypto.randomUUID(),\n * requestToRunId: () => crypto.randomUUID(),\n * }).handler());\n */\nexport const ExpressEndpoint = {\n from(api: ExposedAPI, options: ExpressEndpointOptions): {\n handler(): ExpressHandler;\n } {\n if (api.protocol !== 'sse') {\n throw new Error(\n `ExpressEndpoint: unsupported protocol \"${api.protocol}\"`,\n );\n }\n\n const { requestToContextId, requestToRunId } = options;\n\n return {\n handler(): ExpressHandler {\n return async (req: ExpressRequest, res: ExpressResponse) => {\n const controller = new AbortController();\n req.on('close', () => controller.abort());\n\n const exposeReq = {\n request: { signal: controller.signal } as Request,\n req,\n res,\n contextId: requestToContextId(req),\n runId: requestToRunId(req),\n };\n\n try {\n const encoder = new TextEncoder();\n await api.createStream(exposeReq, async (stream) => {\n // Set SSE headers only after auth has passed\n res.setHeader('Content-Type', 'text/event-stream');\n res.setHeader('Cache-Control', 'no-cache');\n res.setHeader('Connection', 'keep-alive');\n res.flushHeaders?.();\n\n try {\n for await (const envelope of stream) {\n if (controller.signal.aborted) break;\n res.write(encoder.encode(formatSSE(envelope)));\n res.flush?.();\n }\n } finally {\n res.end();\n }\n });\n } catch (e) {\n if (e instanceof ExposeAuthError) {\n res.status(e.status).send(e.message);\n return;\n }\n throw e;\n }\n };\n },\n };\n },\n};\n","import { Context, Exit, Layer, Option, Tracer } from 'effect';\n\nconst randomHexString = (length: number): string => {\n const chars = 'abcdef0123456789';\n let result = '';\n for (let i = 0; i < length; i++) {\n result += chars.charAt(Math.floor(Math.random() * chars.length));\n }\n return result;\n};\n\n/** Span that logs to console when ended */\nclass ConsoleSpan implements Tracer.Span {\n readonly _tag = 'Span' as const;\n readonly spanId: string;\n readonly traceId: string;\n readonly sampled = true;\n status: Tracer.SpanStatus;\n attributes: Map<string, unknown> = new Map();\n links: Tracer.SpanLink[] = [];\n\n constructor(\n readonly name: string,\n readonly parent: Option.Option<Tracer.AnySpan>,\n readonly context: Context.Context<never>,\n links: Iterable<Tracer.SpanLink>,\n readonly startTime: bigint,\n readonly kind: Tracer.SpanKind,\n private readonly depth: number,\n ) {\n this.traceId =\n parent._tag === 'Some' ? parent.value.traceId : randomHexString(32);\n this.spanId = randomHexString(16);\n this.links = Array.from(links);\n this.status = { _tag: 'Started', startTime };\n }\n\n end(endTime: bigint, exit: Exit.Exit<unknown, unknown>): void {\n if (this.status._tag === 'Ended') return;\n const startTime = this.status.startTime;\n const durationNs = endTime - startTime;\n const durationMs = Number(durationNs) / 1_000_000;\n const indent = ' '.repeat(this.depth);\n const attrs = Object.fromEntries(this.attributes);\n const status = Exit.isSuccess(exit) ? 'ok' : 'error';\n // eslint-disable-next-line no-console\n console.log(\n `${indent}[trace] ${this.name} ${durationMs.toFixed(2)}ms (${status})`,\n Object.keys(attrs).length > 0 ? attrs : '',\n );\n this.status = { _tag: 'Ended', startTime, endTime, exit };\n }\n\n attribute(key: string, value: unknown): void {\n this.attributes.set(key, value);\n }\n\n event(\n _name: string,\n _startTime: bigint,\n _attributes?: Record<string, unknown>,\n ): void {\n // no-op for console tracer\n }\n\n addLinks(links: ReadonlyArray<Tracer.SpanLink>): void {\n this.links.push(...links);\n }\n}\n\nfunction getDepth(parent: Option.Option<Tracer.AnySpan>): number {\n if (parent._tag === 'None') return 0;\n const p = parent.value;\n if (p._tag === 'ExternalSpan') return 0;\n return 1 + getDepth((p as Tracer.Span).parent);\n}\n\n/**\n * A Tracer that logs spans to console when they end. No optional dependencies\n * required. Use `consoleTracerLayer` when running your program to enable.\n *\n * @example\n * ```ts\n * import { Effect } from 'effect';\n * import { AgentNetwork, consoleTracerLayer } from '@m4trix/core/matrix';\n *\n * const network = AgentNetwork.setup(({ ... }) => { ... });\n * const program = network.run().pipe(\n * Effect.provide(consoleTracerLayer),\n * Effect.scoped\n * );\n * Effect.runPromise(program);\n * ```\n */\nexport const consoleTracer: Tracer.Tracer = Tracer.make({\n span: (name, parent, context, links, startTime, kind) =>\n new ConsoleSpan(\n name,\n parent,\n context,\n links,\n startTime,\n kind,\n getDepth(parent),\n ),\n context: (f) => f(),\n});\n\n/**\n * Layer that provides the console tracer. Pipe your program with\n * `Effect.provide(consoleTracerLayer)` before running to see spans in stdout.\n */\nexport const consoleTracerLayer: Layer.Layer<never> = Layer.setTracer(\n consoleTracer,\n);\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/stream/Pump.ts","../src/stream/utility/pipe-transformers/response.ts","../src/stream/utility/rechunker/ensure-full-words.ts","../src/api/socket-handler/SocketIoFactory.ts","../src/helper/transform-messages/TransformMessages.ts","../src/helper/transform-messages/message-filter.ts","../src/helper/transform-messages/formatter.ts","../src/matrix/agent-network/agent-network.ts","../src/matrix/identifiers/channel-name.ts","../src/matrix/agent-network/channel.ts","../src/matrix/agent-network/event-plane.ts","../src/helper/types/noop.ts","../src/matrix/agent-network/stores/inmemory-network-store.ts","../src/matrix/io/expose.ts","../src/matrix/agent-network/agent-network-event.ts","../src/matrix/agent.ts","../src/matrix/agent-factory.ts","../src/matrix/skill.ts","../src/matrix/io/protocols/sse.ts","../src/matrix/io/adapters/next-endpoint.ts","../src/matrix/io/adapters/express-endpoint.ts","../src/matrix/console-tracer.ts"],"names":["out","window","AIMessage","i","msg","Effect","Queue","payload","Brand","S"],"mappings":"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","sourcesContent":["/**\n * StreamChunk is the base interface for all streams.\n * It can hold voice and text chunks.\n *\n * @template T The type of data contained in the chunk\n */\nexport interface StreamChunk<T> {\n sequence: number;\n data: T;\n done: boolean;\n}\n\n/**\n * MessageStream represents an asynchronous iterable stream of chunks.\n * Used as the core stream representation throughout the Pump library.\n *\n * @template T The type of data contained in the chunks of the stream\n */\nexport type MessageStream<T> = AsyncIterable<StreamChunk<T>>;\n\n/**\n * Represents any source that can be converted to a stream.\n * This includes AsyncIterable and ReadableStream sources.\n *\n * @template T The type of data contained in the source\n */\nexport type Source<T> =\n | AsyncIterable<T>\n | ReadableStream<T>\n | NodeJS.ReadableStream;\n\n/**\n * A transformer for stream data that also provides a response.\n * Used primarily to transform and consume stream data while producing a response object.\n *\n * @template T The type of data being transformed\n * @template R The type of the response (defaults to Response)\n */\nexport type StreamTransformer<T, R = Response> = {\n transform(data: T): T;\n close(): void;\n response: R;\n};\n\n/**\n * Pump is an asynchronous stream processing pipeline with fluent operators.\n * It provides a comprehensive set of operations for transforming, filtering, batching,\n * combining, and consuming stream data.\n *\n * The Pump class follows a builder pattern where each operation returns a new Pump instance,\n * allowing for chaining of operations to build complex stream processing pipelines.\n *\n * @template T The type of data contained in the stream\n */\nexport class Pump<T> {\n constructor(private readonly src: MessageStream<T>) {}\n\n /**\n * Wrap an existing AsyncIterable or Readable stream into a Pump\n *\n * @template U The type of data in the source stream\n * @param source The source stream to convert to a Pump (AsyncIterable, ReadableStream, or NodeJS.ReadableStream)\n * @returns A new Pump instance that wraps the source\n */\n static from<U>(source: Source<U>): Pump<U> {\n async function* gen(): AsyncGenerator<StreamChunk<U>> {\n let seq = 0;\n\n // Type guard functions to narrow the type\n function isAsyncIterable(obj: Source<U>): obj is AsyncIterable<U> {\n return Symbol.asyncIterator in obj;\n }\n\n function isWebReadableStream(obj: Source<U>): obj is ReadableStream {\n return 'getReader' in obj && typeof obj.getReader === 'function';\n }\n\n function isNodeReadableStream(\n obj: Source<U>\n ): obj is NodeJS.ReadableStream {\n return (\n 'pipe' in obj &&\n 'on' in obj &&\n typeof obj.pipe === 'function' &&\n typeof obj.on === 'function'\n );\n }\n\n if (isAsyncIterable(source)) {\n // Handle AsyncIterable\n const iterator = source[Symbol.asyncIterator]();\n try {\n while (true) {\n const result = await iterator.next();\n if (result.done) break;\n yield {\n sequence: seq++,\n data: result.value,\n done: false,\n };\n }\n } finally {\n // No need to clean up AsyncIterator\n }\n } else if (isWebReadableStream(source)) {\n // Handle Web API ReadableStream\n const reader = source.getReader();\n try {\n while (true) {\n const result = await reader.read();\n if (result.done) break;\n yield {\n sequence: seq++,\n data: result.value as U,\n done: false,\n };\n }\n } finally {\n reader.releaseLock();\n }\n } else if (isNodeReadableStream(source)) {\n // Handle Node.js ReadableStream\n try {\n // Convert Node stream to an AsyncIterable\n for await (const chunk of source) {\n yield {\n sequence: seq++,\n data: chunk as U,\n done: false,\n };\n }\n } catch (error) {\n console.error('Error reading from Node.js stream:', error);\n throw error;\n }\n }\n\n // final done signal\n yield { sequence: seq, data: undefined as unknown as U, done: true };\n }\n return new Pump<U>(gen()) as Pump<U>;\n }\n\n /**\n * Sync or async map over the data portion of each chunk\n *\n * @template U The output type after transformation\n * @param fn The mapping function that transforms each chunk\n * @returns A new Pump instance with the transformed data\n */\n map<U>(fn: (data: T) => U | Promise<U>): Pump<U> {\n async function* gen(this: Pump<T>): AsyncGenerator<StreamChunk<U>> {\n for await (const { sequence, data, done } of this.src) {\n if (done) {\n const out = data !== undefined ? await fn(data) : undefined;\n yield { sequence, data: out as unknown as U, done };\n break;\n }\n\n const out = await fn(data);\n yield { sequence, data: out, done };\n }\n }\n return new Pump<U>(gen.call(this));\n }\n\n /**\n * Stateful map allows processing stream chunks with a persistent context object.\n *\n * The context is initialized when the first chunk arrives and can be updated with each chunk.\n * This is useful for maintaining state across the stream processing.\n *\n * If you plan to use sockets you should rather opt for asyncStatefulMap.\n *\n * The pipe closes only after all processing is complete, including any final operations in onClose.\n *\n * TODO: Un-tested\n *\n * @param handlers Object containing callback functions for stream processing\n * @param handlers.onFirstChunk Function called when the first chunk arrives, initializes the context\n * @param handlers.onChunk Function called for each subsequent chunk, updates the context\n * @param handlers.onClose Optional function called when the stream closes, allows final processing\n * @returns A new Pump instance with transformed data\n */\n statefulMap<Context, U = T>(handlers: {\n onFirstChunk(\n chunk: T,\n yieldData: (data: U) => void\n ): Context | Promise<Context>;\n onChunk(\n chunk: T,\n context: Context,\n yieldData: (data: U) => void\n ): Context | Promise<Context>;\n onClose?(\n lastChunk: T | undefined,\n context: Context,\n yieldData: (data: U) => void\n ): void | Promise<void>;\n }): Pump<U> {\n const { src } = this;\n\n const gen = async function* (): AsyncGenerator<StreamChunk<U>> {\n let context: Context | undefined;\n let initialized = false;\n let lastChunk: T | undefined;\n let seq = 0;\n\n const queue: U[] = [];\n const yieldData = (data: U): void => {\n queue.push(data);\n };\n\n // <- here ->\n\n for await (const { data, done } of src) {\n if (done) {\n if (context && handlers.onClose) {\n await handlers.onClose(lastChunk, context, yieldData);\n }\n\n while (queue.length > 0) {\n yield { sequence: seq++, data: queue.shift()!, done: false };\n }\n\n yield {\n sequence: seq++,\n data: undefined as unknown as U,\n done: true,\n };\n break;\n }\n if (!initialized) {\n context = await handlers.onFirstChunk(data, yieldData);\n initialized = true;\n } else if (context) {\n context = await handlers.onChunk(data, context, yieldData);\n }\n\n lastChunk = data;\n\n while (queue.length > 0) {\n yield { sequence: seq++, data: queue.shift()!, done: false };\n }\n }\n };\n\n return new Pump<U>(gen());\n }\n\n /**\n * Async map means that each incoming chunk is causing an async operation that when it completes\n * should yield a new chunk.\n * The pipe closes only after you unlock the pipe by using the unlockCloseEvent callback.\n *\n * Stateful refers to the fact that you can create your own small context object that is passed in the subsequent callbacks.\n * This allows you to keep track of things like a socket connection.\n *\n * Why is this nice? Well if you use things like a socket the pipe might have received the close event,\n * before you got any or all of your socket responses. Sockets don't fit into the standard promise pattern,\n * which makes it harder to wait for them.\n *\n * TODO: Un-tested\n *\n * @param handlers Object containing callback functions for stream processing\n * @param handlers.onFirstChunk Function called when the first chunk arrives, initializes the context\n * @param handlers.onChunk Function called for each subsequent chunk, updates the context\n * @param handlers.onClose Optional function called when the stream closes, allows final processing\n * @returns A new Pump instance with transformed data\n */\n asyncStatefulMap<Context, U = T>(handlers: {\n onFirstChunk(\n chunk: T,\n yieldData: (data: U) => void,\n unlockCloseEvent: () => void\n ): Context | Promise<Context>;\n onChunk(\n chunk: T,\n context: Context,\n yieldData: (data: U) => void,\n unlockCloseEvent: () => void\n ): Context | Promise<Context>;\n onClose?(\n lastChunk: T | undefined,\n context: Context,\n yieldData: (data: U) => void,\n unlockCloseEvent: () => void\n ): void | Promise<void>;\n }): Pump<U> {\n const { src } = this;\n\n const gen = async function* (): AsyncGenerator<StreamChunk<U>> {\n let context: Context | undefined;\n let initialized = false;\n let lastChunk: T | undefined;\n let seq = 0;\n let lockedCloseEvent = true;\n\n const queue: U[] = [];\n const yieldData = (data: U): void => {\n queue.push(data);\n };\n const unlockCloseEvent = (): void => {\n lockedCloseEvent = false;\n };\n\n for await (const { data, done } of src) {\n if (done) {\n if (context && handlers.onClose) {\n await handlers.onClose(\n lastChunk,\n context,\n yieldData,\n unlockCloseEvent\n );\n }\n\n const timestamp = Date.now();\n // wait until the pipe is unlocked\n while (lockedCloseEvent && Date.now() - timestamp < 10_000) {\n // First emit all data in the queue\n while (queue.length > 0) {\n yield { sequence: seq++, data: queue.shift()!, done: false };\n }\n // put on top of event loop / call stack\n await new Promise((resolve) => setTimeout(resolve, 5));\n }\n\n // First emit all data in the queue\n while (queue.length > 0) {\n yield { sequence: seq++, data: queue.shift()!, done: false };\n }\n\n yield {\n sequence: seq++,\n data: undefined as unknown as U,\n done: true,\n };\n break;\n }\n if (!initialized) {\n context = await handlers.onFirstChunk(\n data,\n yieldData,\n unlockCloseEvent\n );\n initialized = true;\n } else if (context) {\n context = await handlers.onChunk(\n data,\n context,\n yieldData,\n unlockCloseEvent\n );\n }\n\n lastChunk = data;\n\n while (queue.length > 0) {\n yield { sequence: seq++, data: queue.shift()!, done: false };\n }\n }\n };\n\n return new Pump<U>(gen());\n }\n\n /**\n * Filter items based on a predicate\n *\n * @param predicate A function that determines whether to keep each chunk\n * @returns A new Pump instance containing only chunks that passed the predicate\n */\n filter(predicate: (data: T) => boolean | Promise<boolean>): Pump<T> {\n async function* gen(this: Pump<T>): AsyncGenerator<StreamChunk<T>> {\n for await (const { sequence, data, done } of this.src) {\n if (done) {\n yield { sequence, data, done: true };\n break;\n }\n\n const keep = await predicate(data);\n if (keep) {\n yield { sequence, data, done: false };\n }\n }\n }\n return new Pump<T>(gen.call(this));\n }\n\n /**\n * Bundles (accumulates) chunks together based on a condition rather than a fixed size.\n *\n * This is useful when you need to group chunks dynamically based on their content or other criteria.\n *\n * Example: Bundling text chunks with a maximum character limit\n *\n * Input chunks: [\"Hello\", \" this\", \" is\", \" a few\", \" chunks\", \" of text\"]\n * With max size of 10 characters:\n * - First bundle: [\"Hello\", \" this\"] (10 chars)\n * - Second bundle: [\" is\", \" a few\"] (8 chars)\n * - Third bundle: [\" chunks\", \" of text\"] (13 chars)\n *\n * @param closeBundleCondition - Function that determines when to close the current bundle\n * Returns true when the current bundle should be emitted\n * Parameters:\n * - chunk: The current chunk being processed\n * - accumulatedChunks: Array of chunks in the current bundle\n *\n * @returns A pump that emits arrays of bundled items\n */\n bundle(\n closeBundleCondition: (\n chunk: T,\n accumulatedChunks: Array<T>\n ) => boolean | Promise<boolean>\n ): Pump<Array<T>> {\n async function* gen(this: Pump<T>): AsyncGenerator<StreamChunk<Array<T>>> {\n let buffer: Array<T> = [];\n let lastSequence = 0;\n\n for await (const { sequence, data, done } of this.src) {\n lastSequence = sequence;\n\n if (done) {\n // Emit any remaining items in the buffer when the stream ends\n if (buffer.length > 0) {\n yield { sequence, data: [...buffer], done: false };\n }\n // Emit the termination signal\n yield {\n sequence: lastSequence,\n data: undefined as unknown as Array<T>,\n done: true,\n };\n break;\n }\n\n const shouldClose = await closeBundleCondition(data, buffer);\n buffer.push(data);\n\n if (shouldClose) {\n yield {\n sequence: lastSequence,\n data: [...buffer],\n done: false,\n };\n buffer = [];\n }\n }\n }\n return new Pump<Array<T>>(gen.call(this));\n }\n\n /**\n * Tap into each chunk without altering it\n *\n * @param fn A function that receives each chunk but doesn't affect the stream\n * @returns The same pump instance with unmodified data\n */\n onChunk(fn: (chunk: T) => void | Promise<void>): Pump<T> {\n async function* gen(this: Pump<T>): AsyncGenerator<StreamChunk<T>> {\n for await (const chunk of this.src) {\n if (chunk.data === undefined && chunk.done) {\n // Yield early since we don't need to tap into a closing signal (unless it contains data)\n yield chunk;\n }\n\n await fn(chunk.data);\n yield chunk;\n }\n }\n return new Pump<T>(gen.call(this));\n }\n\n /**\n * Collect all chunks in the stream and run a callback when the stream is done.\n * The callback receives an array of all chunks that passed through.\n *\n * This is useful for analytics, logging, or processing the complete stream history\n * after all chunks have been received.\n *\n * @param fn - Callback function that receives the array of all chunks when the stream is complete\n * @returns The same pump, for chaining\n */\n onClose(fn: (history: T[]) => void | Promise<void>): Pump<T> {\n async function* gen(this: Pump<T>): AsyncGenerator<StreamChunk<T>> {\n const history: T[] = [];\n\n for await (const chunk of this.src) {\n // Add non-done chunks to history\n if (chunk.data !== undefined) {\n history.push(chunk.data);\n }\n\n // If we've reached the end, run the callback\n if (chunk.done) {\n await fn(history);\n }\n\n // Pass through the chunk unchanged\n yield chunk;\n }\n }\n return new Pump<T>(gen.call(this));\n }\n\n /**\n * Batch `n` chunks into arrays before emitting\n *\n * @param n The number of chunks to batch together\n * @returns A new Pump instance that emits arrays of batched chunks\n */\n batch(n: number): Pump<Array<T>> {\n async function* gen(this: Pump<T>): AsyncGenerator<StreamChunk<Array<T>>> {\n let buffer: StreamChunk<T>[] = [];\n\n for await (const chunk of this.src) {\n if (chunk.done) {\n // Termination signal edge case handling\n if (chunk.data === undefined) {\n // Flush the rest\n yield {\n sequence: buffer[0].sequence,\n data: buffer.map((c) => c.data),\n done: false,\n };\n\n // and then emit the termination signal\n yield {\n sequence: chunk.sequence,\n data: undefined as unknown as Array<T>,\n done: true,\n };\n buffer = [];\n } else {\n // in that case the termination signal contains data\n // so we need to emit this as a closing singal with the rest of the buffer\n buffer.push(chunk);\n yield {\n sequence: buffer[0].sequence,\n data: buffer.map((c) => c.data),\n done: true,\n };\n }\n\n break;\n }\n\n // Normal case\n\n buffer.push(chunk);\n\n if (buffer.length === n) {\n yield {\n sequence: buffer[0].sequence,\n data: buffer.map((c) => c.data),\n done: chunk.done,\n };\n buffer = [];\n }\n }\n }\n return new Pump<Array<T>>(gen.call(this));\n }\n\n /**\n * If you want to prevent chunk starvation, you can buffer the chunks.\n * Chunks will not be bundled into arrays or object but kept as is,\n * but the pipeline will not progress at that segment until the buffer is filled up.\n * Once a buffer is filled up it will drain and never buffer again.\n *\n * @param n The number of chunks to buffer before processing continues\n * @returns A new Pump instance with buffering behavior\n */\n buffer(n: number): Pump<T> {\n async function* gen(this: Pump<T>): AsyncGenerator<StreamChunk<T>> {\n let buffer: StreamChunk<T>[] = [];\n let bufferFilled = false;\n\n for await (const chunk of this.src) {\n if (!bufferFilled) {\n if (!chunk.done) {\n buffer.push(chunk);\n }\n\n // If buffer is filled or we've reached the end of the stream\n if (buffer.length >= n || chunk.done) {\n bufferFilled = true;\n // Yield all buffered chunks\n for (const bufferedChunk of buffer) {\n yield bufferedChunk;\n }\n if (chunk.done) {\n yield {\n sequence: chunk.sequence,\n data: undefined as unknown as T,\n done: true,\n };\n break;\n }\n buffer = [];\n }\n } else {\n // After buffer is filled, just pass chunks through\n yield chunk;\n }\n }\n\n // Yield any remaining chunks in the buffer\n for (const bufferedChunk of buffer) {\n yield bufferedChunk;\n }\n }\n return new Pump<T>(gen.call(this));\n }\n\n /**\n * Rechunk the stream: transform one chunk into zero, one, or many output chunks.\n * The handler function receives the current buffer of chunks, a push function to emit new chunks,\n * and a flag indicating if this is the last chunk in the stream.\n *\n * @param handler Function that transforms chunks and pushes new ones\n * @returns A new Pump instance with rechunked data\n */\n rechunk(\n handler: (params: {\n buffer: T[];\n push: (chunk: T) => void;\n lastChunk: boolean;\n setBuffer: (buffer: T[]) => void;\n }) => void | Promise<void>\n ): Pump<T> {\n async function* gen(this: Pump<T>): AsyncGenerator<StreamChunk<T>> {\n let buffer: Array<T> = [];\n let seq = 0;\n const pending: Array<T> = [];\n\n const push = (chunk: T): void => {\n pending.push(chunk);\n };\n\n for await (const { data, done } of this.src) {\n if (!done) {\n if (data !== undefined) {\n buffer.push(data);\n }\n await handler({\n buffer,\n push,\n lastChunk: false,\n setBuffer: (b: T[]) => {\n buffer = b;\n },\n });\n } else {\n await handler({\n buffer,\n push,\n lastChunk: true,\n setBuffer: (b: T[]) => {\n buffer = b;\n },\n });\n }\n\n while (pending.length > 0) {\n const out = pending.shift()!;\n yield { sequence: seq++, data: out, done: false };\n }\n\n if (done) {\n break;\n }\n }\n\n yield { sequence: seq, data: undefined as unknown as T, done: true };\n }\n\n return new Pump<T>(gen.call(this));\n }\n\n /**\n * Emit sliding windows of the last `size` items with step `step`.\n * Each window is an array [current, previous1, ..., previous(size-1)].\n * Optionally, map each window through a function.\n *\n * | Step | Window | Resulting Window |\n * |------|--------|------------------|\n * | 1 | ▪︎▪︎[▪︎▫︎▫︎] | ▪︎▫︎▫︎ |\n * | 2 | ▪︎[▪︎▪︎▫︎] | ▪︎▪︎▫︎ |\n * | 3 | [▪︎▪︎▪︎] | ▪︎▪︎▪︎ |\n * | 4 | [▫︎▪︎▪︎] | ▫︎▪︎▪︎ |\n * | 5 | [▫︎▫︎▪︎] | ▫︎▫︎▪ |\n *\n * @param size The size of each window\n * @param step The number of items to move between windows\n * @returns A Pump that emits arrays representing sliding windows\n */\n slidingWindow(size: number, step: number): Pump<Array<T | undefined>>;\n /**\n * Emit sliding windows of the last `size` items with step `step`,\n * and map each window using the provided function.\n *\n * @template N The size type parameter (extends number)\n * @template U The output type after window transformation\n * @param size The size of each window\n * @param step The number of items to move between windows\n * @param fn A function to transform each window\n * @returns A Pump that emits transformed sliding windows\n */\n slidingWindow<N extends number, U>(\n size: N,\n step: number,\n fn: (window: Array<T | undefined>) => U | Promise<U>\n ): Pump<U>;\n slidingWindow<U>(\n size: number,\n step: number,\n fn?: (window: Array<T | undefined>) => U | Promise<U>\n ): Pump<Array<T | undefined>> | Pump<U> {\n async function* gen(\n this: Pump<T>\n ): AsyncGenerator<StreamChunk<Array<T | undefined>>> {\n const history: Array<T> = [];\n let offset = 0;\n let lastSeq = 0;\n\n function buildWindow(\n _offset: number,\n _size: number,\n _history: Array<T>\n ): Array<T | undefined> {\n const window: Array<T | undefined> = Array(_size).fill(undefined);\n let windowIndex = 0;\n\n for (let i = _offset; i > _offset - _size; i -= step) {\n if (i >= history.length) {\n windowIndex++;\n // we can skip this since we are filling the blank spots with undefined\n continue;\n }\n\n if (i < 0) {\n break;\n }\n\n window[windowIndex] = _history[i]; // the window follows the analoy so its filled reversed from the graphic\n windowIndex++;\n }\n\n return window;\n }\n\n for await (const { sequence, data, done } of this.src) {\n if (done) {\n // if we are done that means we are not receiving any more signals to push the window\n // so we have to emit the last window steps\n // [▪︎▪︎▫︎]\n // [▪︎▫︎▫︎]\n for (let i = 0; i < size - 1; i++) {\n const window = buildWindow(offset + i, size, history);\n yield { sequence: lastSeq, data: window, done: false };\n }\n\n if (data === undefined) {\n // final done signal\n yield {\n sequence: lastSeq,\n data: undefined as unknown as Array<T>,\n done: true,\n };\n } else {\n // final done signal\n yield {\n sequence: lastSeq,\n data: [\n history[history.length - 2] ?? undefined,\n history[history.length - 3] ?? undefined,\n history[history.length - 1],\n ],\n done: true,\n };\n }\n break;\n }\n\n lastSeq = sequence;\n history.push(data);\n\n // the rolling window goes from the oldest to the newest and pushes it self\n // with a step length. The analogy of the pipe shifts the window from right to left\n // but the array appends to the end. So in this implementation we are shifting from left to right.\n\n // lets calculate the window indexes\n // [▫︎▫︎▪︎]▪︎▪︎\n // [▫︎▪︎▪︎]▪︎\n // [▪︎▪︎▪︎]\n // [▪︎▪︎▫︎] <- this case is handled above\n // [▪︎▫︎▫︎] <- this case is handled above\n const window = buildWindow(offset, size, history);\n\n yield { sequence, data: window, done: false };\n offset++;\n }\n }\n const base = new Pump<Array<T | undefined>>(gen.call(this));\n // If fn is provided, map over the window, otherwise return the window as is\n return fn\n ? base.map(fn as (window: Array<T | undefined>) => U)\n : (base as Pump<Array<T | undefined>>);\n }\n\n /**\n * Sequentially flatten inner stream sources emitted by the pipeline.\n * Works with any Source type (AsyncIterable or ReadableStream).\n * This method is only available when the current Pump contains Source elements.\n *\n * @template U The type of data in the inner streams\n * @template F The type of inner stream source (extends Source<U>)\n * @returns A Pump instance with flattened stream data\n */\n sequenceStreams<U, F extends Source<U>>(this: Pump<F>): Pump<U> {\n async function* gen(this: Pump<F>): AsyncGenerator<StreamChunk<U>> {\n let seq = 0;\n\n for await (const { data: innerSource, done: outerDone } of this.src) {\n if (outerDone) break;\n\n // Convert the inner source to a pump first\n const innerPump = Pump.from(innerSource as unknown as Source<U>);\n\n // Then extract all items from it\n for await (const { data, done } of innerPump.src) {\n if (done) break;\n yield { sequence: seq++, data: data as U, done: false };\n }\n }\n\n yield { sequence: seq, data: undefined as unknown as U, done: true };\n }\n return new Pump<U>(gen.call(this));\n }\n\n /**\n * Fork the stream: two independent Pump<T> consumers\n * Both resulting Pumps will receive the same data, allowing for divergent processing paths.\n *\n * @returns An array containing two independent Pump instances with the same source data\n */\n fork(): [Pump<T>, Pump<T>] {\n const buffers: StreamChunk<T>[][] = [[], []];\n let done = false;\n const srcIter = this.src[Symbol.asyncIterator]();\n\n async function fill(): Promise<void> {\n const { value, done: streamDone } = await srcIter.next();\n if (streamDone) {\n done = true;\n return;\n }\n buffers.forEach((q) => q.push(value));\n if (value.done) done = true;\n }\n\n function makeStream(buf: StreamChunk<T>[]): MessageStream<T> {\n return {\n [Symbol.asyncIterator](): AsyncIterator<StreamChunk<T>> {\n return {\n async next(): Promise<IteratorResult<StreamChunk<T>>> {\n while (buf.length === 0 && !done) {\n await fill();\n }\n if (buf.length === 0)\n return {\n done: true,\n value: undefined as unknown as StreamChunk<T>,\n };\n return { done: false, value: buf.shift()! };\n },\n };\n },\n };\n }\n\n return [new Pump(makeStream(buffers[0])), new Pump(makeStream(buffers[1]))];\n }\n\n /**\n * Drain the pipeline, consuming all chunks.\n * Returns a Promise that resolves when all chunks have been consumed.\n *\n * @returns A Promise that resolves when all chunks have been consumed\n */\n drain(): Promise<void> {\n return (async (): Promise<void> => {\n for await (const { done } of this.src) {\n if (done) break;\n }\n })();\n }\n\n /**\n * Drain the pipeline to a StreamTransformer.\n * Applies transform() to each data chunk, then closes the transformer,\n * and returns its response (which can be of any type defined by the transformer).\n *\n * Example with httpStreamResponse:\n * ```\n * const { transform, response, close } = httpStreamResponse(options);\n * return Pump.from(messageStream).drainTo({ transform, close, response });\n * ```\n *\n * @template U The type of data expected by the transformer (extends T)\n * @template R The response type produced by the transformer\n * @param transformer The StreamTransformer to drain to\n * @returns The response from the transformer\n */\n drainTo<U extends T, R>(transformer: StreamTransformer<U, R>): R {\n (async (): Promise<void> => {\n for await (const { data, done } of this.src) {\n if (done) break;\n transformer.transform(data as unknown as U);\n }\n transformer.close();\n })();\n return transformer.response;\n }\n}\n\n// ----------------------------------------------------------\n// Example usage in Next.js App Router (e.g. app/api/stream/route.ts)\n//\n// import { NextRequest } from 'next/server';\n// import { Pump } from '@m4trix/core/stream';\n// import { /*...*/ } from '@/lib';\n\n// export async function POST(req: NextRequest) {\n// // Process the incoming audio request\n// const formData = await req.formData();\n// const transcript = await transcribeFormData(formData);\n// const agentStream = await getAgentResponse(transcript);\n\n// // Process and return the stream\n// return await Pump.from(agentStream)\n// .filter(shouldChunkBeStreamed)\n// .map(messageToText)\n// .bundle(intoChunksOfMinLength(40))\n// .map((text) => text.join(\"\")) // convert array of strings to string\n// .rechunk(ensureFullWords)\n// .rechunk(fixBrokenWords)\n// .onClose(handleCompletedAgentResponse)\n// .slidingWindow(10, 1)\n// .filter(filterOutIrrelevantWindows)\n// .buffer(5)\n// .map(textToSpeech)\n// .sequenceStreams()\n// .drainTo(httpStreamResponse());\n// }\n","import { StreamTransformer } from '../..';\n\nexport interface HttpStreamOptions<T> {\n /** HTTP ResponseInit (status, headers, etc.) */\n init?: ResponseInit;\n /** Encode each chunk of type T into bytes or string */\n encoder?: (data: T) => Uint8Array | string;\n}\n\n/**\n * Create a streaming HTTP response transformer.\n * Returns an object with:\n * - transform: function to write each chunk into the response\n * - response: the Fetch API Response ready to return\n * - close: function to close the stream when done\n *\n * Usage in a Next.js route:\n * ```\n * // With the new drainTo API:\n * const transformer = httpStreamResponse(options);\n * return Pump.from(messageStream).drainTo(transformer);\n *\n * // Or with manual control:\n * const { transform, response, close } = httpStreamResponse(options);\n * await Pump.from(messageStream).map(transform).drain();\n * close();\n * return response;\n * ```\n */\nexport function httpStreamResponse<T>(\n options: HttpStreamOptions<T> = {}\n): StreamTransformer<T, Response> {\n const { init, encoder } = options;\n const encodeFn =\n encoder ??\n ((d: T): Uint8Array | string => {\n if (d instanceof Uint8Array) return d;\n if (typeof d === 'string') return d;\n return JSON.stringify(d);\n });\n\n // Create a transform stream of Uint8Array\n const { readable, writable } = new TransformStream<Uint8Array>();\n const writer = writable.getWriter();\n const response = new Response(readable, init);\n\n const transform = (chunk: T): T => {\n const encoded = encodeFn(chunk);\n const bytes =\n typeof encoded === 'string' ? new TextEncoder().encode(encoded) : encoded;\n writer.write(bytes);\n return chunk;\n };\n\n const close = (): void => {\n writer.close();\n };\n\n return { transform, response, close };\n}\n","/**\n * A helper to be used with Pump.rechunk that ensures full word chunks.\n * Aggregates incoming chunks and emits only when a full word boundary is reached.\n */\nexport async function ensureFullWords({\n buffer,\n push,\n lastChunk,\n}: {\n buffer: string[];\n push: (chunk: string) => void;\n lastChunk: boolean;\n}): Promise<void> {\n const combined = buffer.join('');\n const lastBoundary = Math.max(\n combined.lastIndexOf(' '),\n combined.lastIndexOf('\\n'),\n combined.lastIndexOf('\\t')\n );\n\n if (lastBoundary !== -1 || lastChunk) {\n const emitPart =\n lastBoundary !== -1 ? combined.slice(0, lastBoundary + 1) : combined;\n const leftoverPart =\n lastBoundary !== -1 ? combined.slice(lastBoundary + 1) : '';\n\n if (emitPart.trim().length > 0) {\n push(emitPart);\n }\n\n buffer.length = 0;\n if (leftoverPart.length > 0) {\n buffer.push(leftoverPart);\n }\n }\n}\n","import { Socket } from 'socket.io';\nimport { Hooks, SetupSocketHandlersParams } from './socket-factory-types';\n\nexport class SocketIoFactory {\n private socket: Socket;\n private prefix: string;\n private hooks: Hooks<Socket>;\n\n private constructor(socket: Socket, prefix: string, hooks: Hooks<Socket>) {\n this.socket = socket;\n this.prefix = prefix;\n this.hooks = hooks;\n }\n\n static setupSocketHandlers({\n enableVoiceEvents,\n enableChatEvents,\n enableTranscriptEvents,\n prefix = '',\n socket,\n hooks,\n }: SetupSocketHandlersParams<\n Socket,\n {\n socket: Socket;\n }\n >): void {\n // Adapter will override the hooks\n\n const factory = new SocketIoFactory(socket, prefix, hooks!);\n if (enableVoiceEvents) {\n factory.setupVoiceEvents();\n }\n\n if (enableChatEvents) {\n factory.setupChatEvents(socket);\n }\n\n if (enableTranscriptEvents) {\n factory.setupTranscriptEvents(socket);\n }\n }\n\n private setupVoiceEvents(): void {\n const {\n onVoiceInputFile,\n onVoiceInputChunk,\n onVoiceInputCommit,\n onVoiceOutputDelta,\n onVoiceOutputCommit,\n onVoiceOutputFile,\n onVoiceOutputTranscriptDelta,\n onVoiceOutputTranscriptFull,\n } = this.hooks;\n\n const prefix = this.prefixEvent;\n\n if (onVoiceInputFile) {\n this.socket.on(prefix('voice:input_file'), onVoiceInputFile);\n }\n\n if (onVoiceInputChunk) {\n this.socket.on(prefix('voice:input_chunk'), onVoiceInputChunk);\n }\n\n if (onVoiceInputCommit) {\n this.socket.on(prefix('voice:input_commit'), onVoiceInputCommit);\n }\n\n if (onVoiceOutputDelta) {\n this.socket.on(prefix('voice:output_delta'), onVoiceOutputDelta);\n }\n\n if (onVoiceOutputCommit) {\n this.socket.on(prefix('voice:output_commit'), onVoiceOutputCommit);\n }\n\n if (onVoiceOutputFile) {\n this.socket.on(prefix('voice:output_file'), onVoiceOutputFile);\n }\n\n if (onVoiceOutputTranscriptDelta) {\n this.socket.on(\n prefix('voice:output_transcript_delta'),\n onVoiceOutputTranscriptDelta\n );\n }\n\n if (onVoiceOutputTranscriptFull) {\n this.socket.on(\n prefix('voice:output_transcript_full'),\n onVoiceOutputTranscriptFull\n );\n }\n }\n\n private setupChatEvents(_socket: Socket): void {\n // TODO: Implement chat event handler\n }\n\n private setupTranscriptEvents(_socket: Socket): void {\n // TODO: Implement transcript event handlers\n }\n\n private prefixEvent(event: string): string {\n return this.prefix ? `${this.prefix}:${event}` : event;\n }\n}\n","import { BaseMessage, AIMessage, ToolMessage } from '@langchain/core/messages';\nimport { Effect, pipe } from 'effect';\nimport {\n MessageFilter,\n MessageFilterType,\n typeOnFilter,\n} from './message-filter';\nimport { FormatType, typeOnFormatter } from './formatter';\n\n/**\n * # Transform Messages\n * In order to manage the context size often you want to slice messages or only pass certain types of messages.\n * This class is a helper to do that.\n *\n * ## Example\n * ```ts\n * const messages = [\n * new HumanMessage('Hello, how are you?'),\n * new AIMessage('I am good, thank you!'),\n * ];\n *\n * const transformedMessages = TransformMessages.from(messages).filter(HumanAndAI).last(10).format(FormatType.Concise);\n *\n * ```\n */\n\nclass TransformMessages {\n private effect: Effect.Effect<Array<BaseMessage>, never, never>;\n\n private constructor(effect: Effect.Effect<Array<BaseMessage>, never, never>) {\n this.effect = effect;\n }\n\n /**\n * Create a new TransformMessages from an array of messages.\n */\n static from(messages: Array<BaseMessage>): TransformMessages {\n return new TransformMessages(Effect.succeed(messages));\n }\n\n /**\n * Filter messages based on a predicate function\n */\n filter(\n predicate: MessageFilter | MessageFilterType,\n tags?: Array<string>\n ): TransformMessages {\n let finalPredicate: MessageFilter;\n if (typeof predicate === 'string') {\n finalPredicate = typeOnFilter[predicate];\n } else {\n finalPredicate = predicate;\n }\n\n return new TransformMessages(\n pipe(\n this.effect,\n Effect.map((messages) =>\n messages.filter((message) => finalPredicate(message, tags))\n )\n )\n );\n }\n\n /**\n * Take only the last n messages, but safely.\n * Tool calls should not be separated from the last human message.\n * Ensures all tool call conversations in the last n messages are complete.\n */\n safelyTakeLast(\n n: number,\n pruneAfterNOvershootingMessages: number = 0\n ): TransformMessages {\n return new TransformMessages(\n pipe(\n this.effect,\n Effect.map((messages) => {\n const total = messages.length;\n if (n <= 0 || total === 0) return [];\n\n // Start with the last n messages\n const start = Math.max(0, total - n);\n const end = total;\n const lastSlice = messages.slice(start, end);\n\n // due to the fact that the calling AI message needs to be adjecent to the succeeding tool call message\n // we just need to check the last n messages for tool call ids\n\n // Check the first message if it is a tool call message\n // if it is iterate backwards until we find the AI message\n if (\n lastSlice[0] instanceof ToolMessage &&\n lastSlice[0].tool_call_id\n ) {\n let messagesToInclude: Array<BaseMessage> = [];\n const remainingMessages = messages.slice(0, start);\n for (let i = remainingMessages.length - 1; i >= 0; i--) {\n const msg = remainingMessages[i];\n if (\n pruneAfterNOvershootingMessages > 0 &&\n messagesToInclude.length - 1 >= pruneAfterNOvershootingMessages\n ) {\n messagesToInclude = [];\n // Return the slice but remove all the tool call messages that are at the beginning of the slice\n const filteredSlice: Array<BaseMessage> = [];\n let foundFirstNonToolMessage = false;\n for (let i = 0; i < lastSlice.length; i++) {\n const msg = lastSlice[i];\n if (msg instanceof ToolMessage) {\n if (foundFirstNonToolMessage) {\n filteredSlice.push(msg);\n }\n } else {\n foundFirstNonToolMessage = true;\n filteredSlice.push(msg);\n }\n }\n return filteredSlice;\n }\n if (msg instanceof AIMessage && Array.isArray(msg.tool_calls)) {\n messagesToInclude.push(msg);\n break;\n } else if (msg instanceof ToolMessage) {\n messagesToInclude.push(msg);\n } else {\n // This should not happen messages invalid\n throw new Error(\n 'Messages array invalid no adjacent AI message found'\n );\n }\n }\n return [...messagesToInclude.reverse(), ...lastSlice];\n } else {\n return lastSlice;\n }\n })\n )\n );\n }\n\n /**\n * Take only the last n messages\n */\n last(n: number): TransformMessages {\n return new TransformMessages(\n pipe(\n this.effect,\n Effect.map((messages) => messages.slice(-n))\n )\n );\n }\n\n /**\n * Take only the first n messages\n */\n first(n: number): TransformMessages {\n return new TransformMessages(\n pipe(\n this.effect,\n Effect.map((messages) => messages.slice(0, n))\n )\n );\n }\n\n /**\n * Skip the first n messages\n */\n skip(n: number): TransformMessages {\n return new TransformMessages(\n pipe(\n this.effect,\n Effect.map((messages) => messages.slice(n))\n )\n );\n }\n\n /**\n * Reverse the order of messages\n */\n reverse(): TransformMessages {\n return new TransformMessages(\n pipe(\n this.effect,\n Effect.map((messages) => [...messages].reverse())\n )\n );\n }\n\n /**\n * Map over messages with a transformation function\n */\n map<T extends BaseMessage>(\n fn: (message: BaseMessage) => T\n ): TransformMessages {\n return new TransformMessages(\n pipe(\n this.effect,\n Effect.map((messages) => messages.map(fn))\n )\n );\n }\n\n /**\n * Format messages according to the specified format type\n */\n format(formatType: FormatType): string {\n const result = Effect.runSync(\n pipe(\n this.effect,\n Effect.map((messages) => {\n if (formatType === FormatType.JSON) {\n return JSON.stringify(messages, null, 2);\n }\n const formatter = typeOnFormatter[formatType];\n return formatter(messages);\n })\n )\n );\n return result;\n }\n\n // Sink methods\n\n /**\n * Convert to array - runs the effect and returns the result\n return pipe(\n this.effect,\n Effect.map((messages) => {\n if (formatType === FormatType.JSON) {\n return JSON.stringify(messages, null, 2);\n }\n\n const formatter = typeOnFormatter[formatType];\n return formatter(messages);\n })\n );\n }\n\n // Sink methods\n\n /**\n * Convert to array - runs the effect and returns the result\n */\n toArray(): Array<BaseMessage> {\n return Effect.runSync(this.effect);\n }\n\n /**\n * Convert to string - runs the effect and returns JSON string\n */\n toString(): string {\n const result = Effect.runSync(\n pipe(\n this.effect,\n Effect.map((messages) => JSON.stringify(messages, null, 2))\n )\n );\n return result;\n }\n\n /**\n * Get the count of messages\n */\n count(): number {\n const result = Effect.runSync(\n pipe(\n this.effect,\n Effect.map((messages) => messages.length)\n )\n );\n return result;\n }\n}\n\nexport { TransformMessages };\n","import { BaseMessage, HumanMessage, AIMessage } from '@langchain/core/messages';\n\n// Type for message filters\nexport type MessageFilter = (\n message: BaseMessage,\n tags?: Array<string>\n) => boolean;\n// Predefined filters\nconst humanAndAI: MessageFilter = (message) =>\n message instanceof HumanMessage || message instanceof AIMessage;\nconst humanOnly: MessageFilter = (message) => message instanceof HumanMessage;\nconst aiOnly: MessageFilter = (message) => message instanceof AIMessage;\n\nconst includingTags: MessageFilter = (message, tags) => {\n if (tags) {\n return tags.some((tag) =>\n Array.isArray(message.additional_kwargs?.tags)\n ? message.additional_kwargs?.tags.includes(tag)\n : false\n );\n }\n return true;\n};\n\nconst excludingTags: MessageFilter = (message, tags) => {\n if (tags) {\n return !tags.some((tag) =>\n Array.isArray(message.additional_kwargs?.tags)\n ? message.additional_kwargs?.tags.includes(tag)\n : false\n );\n }\n return true;\n};\n\nexport enum MessageFilterType {\n HumanAndAI = 'HumanAndAI',\n HumanOnly = 'HumanOnly',\n AIOnly = 'AIOnly',\n IncludingTags = 'IncludingTags',\n ExcludingTags = 'ExcludingTags',\n}\nexport const typeOnFilter = {\n [MessageFilterType.HumanAndAI]: humanAndAI,\n [MessageFilterType.HumanOnly]: humanOnly,\n [MessageFilterType.AIOnly]: aiOnly,\n [MessageFilterType.IncludingTags]: includingTags,\n [MessageFilterType.ExcludingTags]: excludingTags,\n};\n","import { AIMessage, BaseMessage } from '@langchain/core/messages';\n\n// Format types\nexport enum FormatType {\n Concise = 'concise',\n Verbose = 'verbose',\n RedactAi = 'redact-ai',\n RedactHuman = 'redact-human',\n JSON = 'json',\n}\n\n/**\n * Formats messages in a concise markdown format with alternating AI and Human prefixes.\n *\n * ### Example\n * ```markdown\n * AI: Hello, how are you?\n * Human: I am good, thank you!\n * AI: What is your name?\n * Human: My name is John.\n * AI: What is your favorite color?\n * Human: My favorite color is blue.\n * AI: What is your favorite food?\n * Human: My favorite food is pizza.\n * ```\n */\nfunction concise(messages: Array<BaseMessage>): string {\n return messages\n .map((message) => {\n const prefix = message instanceof AIMessage ? 'AI' : 'Human';\n return `${prefix}: ${message.content}`;\n })\n .join('\\n');\n}\n\n/**\n * Formats messages in a verbose markdown format with alternating AI and Human prefixes.\n *\n * ### Example\n * ```markdown\n * AI:\n * Hello, how are you?\n * -------------------\n * Human:\n * I am good, thank you!\n * -------------------\n * AI:\n * What is your name?\n * -------------------\n * Human:\n * My name is John.\n * ```\n */\nfunction verbose(messages: Array<BaseMessage>): string {\n return messages\n .map((message) => {\n const prefix = message instanceof AIMessage ? 'AI' : 'Human';\n return `${prefix}:\\n${message.content}`;\n })\n .join('\\n-------------------\\n');\n}\n\n/**\n * Formats messages in a concise markdown format, redacting AI messages with [...]\n *\n * ### Example\n * ```markdown\n * AI: [...]\n * Human: Hello, how are you?\n * AI: [...]\n * Human: I am good, thank you!\n * AI: [...]\n * Human: What is your name?\n * AI: [...]\n * Human: My name is John.\n * AI: [...]\n * ```\n */\nfunction redactAi(messages: Array<BaseMessage>): string {\n return messages\n .map((message) => {\n const prefix = message instanceof AIMessage ? 'AI' : 'Human';\n const content = message instanceof AIMessage ? '[...]' : message.content;\n return `${prefix}: ${content}`;\n })\n .join('\\n');\n}\n\n/**\n * Formats messages in a concise markdown format, redacting Human messages with [...]\n *\n * ### Example\n * ```markdown\n * AI: Hello, how are you?\n * Human: [...]\n * AI: What is your name?\n * Human: [...]\n * AI: What is your favorite color?\n * Human: [...]\n * AI: What is your favorite food?\n * Human: [...]\n * ```\n */\nfunction redactHuman(messages: Array<BaseMessage>): string {\n return messages\n .map((message) => {\n const prefix = message instanceof AIMessage ? 'AI' : 'Human';\n const content = message instanceof AIMessage ? '[...]' : message.content;\n return `${prefix}: ${content}`;\n })\n .join('\\n');\n}\nconst typeOnFormatter = {\n [FormatType.Concise]: concise,\n [FormatType.Verbose]: verbose,\n [FormatType.RedactAi]: redactAi,\n [FormatType.RedactHuman]: redactHuman,\n};\n\nexport { typeOnFormatter };\n","import { Effect, Scope } from 'effect';\nimport type { Schema as S } from 'effect';\nimport type { AgentFactory } from '../agent-factory';\nimport type { AgentNetworkEventDef } from './agent-network-event';\nimport { ChannelName, ConfiguredChannel, Sink } from './channel';\nimport { createEventPlane, run } from './event-plane';\nimport type { Envelope, EventPlane } from './event-plane';\nimport { expose } from '../io/expose';\nimport type { ExposeOptions, ExposedAPI } from '../io/types';\nimport type { AgentNetworkStore } from './stores/agent-network-store';\nimport { createInMemoryNetworkStore } from './stores/inmemory-network-store';\n\n/* ─── Helper Types ─── */\n\ntype EventDef = AgentNetworkEventDef<string, S.Schema.Any>;\n\n/** Structural interface for any Agent – avoids variance issues with private fields. */\nexport interface AnyAgent {\n getId(): string;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n invoke(options?: any): Promise<void>;\n /** Event names this agent listens to. Empty = listen to all. */\n getListensTo?(): readonly string[];\n}\n\n/* ─── Agent Binding (returned by registerAgent) ─── */\n\nexport type AgentBinding = {\n subscribe(channel: ConfiguredChannel): AgentBinding;\n publishTo(channel: ConfiguredChannel): AgentBinding;\n};\n\n/* ─── Spawner Builder ─── */\n\nexport type SpawnFn = (\n agent: AnyAgent,\n bindings?: { subscribe?: string[]; publishTo?: string[] },\n) => void;\n\nexport type SpawnCallbackContext<\n TRegistry extends Record<string, AgentFactory> = Record<string, AgentFactory>,\n> = {\n kind: keyof TRegistry & string;\n factory: TRegistry[keyof TRegistry & string];\n payload: {\n id: string;\n params: Record<string, unknown>;\n subscribe?: string[];\n publishTo?: string[];\n };\n spawn: SpawnFn;\n};\n\nexport type SpawnerBuilder<\n TRegistry extends Record<string, AgentFactory> = Record<string, AgentFactory>,\n> = {\n listen(\n channel: ConfiguredChannel,\n event: EventDef,\n ): SpawnerBuilder<TRegistry>;\n registry<R extends Record<string, AgentFactory>>(reg: R): SpawnerBuilder<R>;\n defaultBinding(\n fn: (ctx: { kind: string }) => {\n subscribe: string[];\n publishTo: string[];\n },\n ): SpawnerBuilder<TRegistry>;\n onSpawn(\n fn: (ctx: SpawnCallbackContext<TRegistry>) => AnyAgent,\n ): SpawnerBuilder<TRegistry>;\n};\n\n/* ─── Setup Context ─── */\n\nexport type SetupContext = {\n mainChannel: (name: string) => ConfiguredChannel;\n createChannel: (name: string) => ConfiguredChannel;\n sink: typeof Sink;\n registerAgent: (agent: AnyAgent) => AgentBinding;\n spawner: (factory: typeof AgentFactory) => SpawnerBuilder;\n};\n\n/* ─── Internal Registration Records ─── */\n\ntype AgentRegistration = {\n agent: AnyAgent;\n subscribedTo: ConfiguredChannel[];\n publishesTo: ConfiguredChannel[];\n};\n\ntype SpawnerRegistration = {\n factoryClass: typeof AgentFactory;\n listenChannel?: ConfiguredChannel;\n listenEvent?: EventDef;\n registry: Record<string, AgentFactory>;\n defaultBindingFn?: (ctx: { kind: string }) => {\n subscribe: string[];\n publishTo: string[];\n };\n onSpawnFn?: (\n ctx: SpawnCallbackContext<Record<string, AgentFactory>>,\n ) => AnyAgent;\n};\n\n/* ─── AgentNetwork ─── */\n\nexport class AgentNetwork {\n private _mainChannel: ConfiguredChannel | undefined;\n private channels: Map<ChannelName, ConfiguredChannel> = new Map();\n private agentRegistrations: Map<string, AgentRegistration> = new Map();\n private spawnerRegistrations: SpawnerRegistration[] = [];\n private _store: AgentNetworkStore<Envelope>;\n\n private constructor() {\n this._store = createInMemoryNetworkStore<Envelope>();\n }\n\n /* ─── Public Static Factory ─── */\n\n static setup(callback: (ctx: SetupContext) => void): AgentNetwork {\n const network = new AgentNetwork();\n\n const ctx: SetupContext = {\n mainChannel: (name: string) => {\n const channel = network.addChannel(name);\n network.setMainChannel(channel);\n return channel;\n },\n createChannel: (name: string) => network.addChannel(name),\n sink: Sink,\n registerAgent: (agent) => network.registerAgentInternal(agent),\n spawner: (factory) => network.createSpawnerInternal(factory),\n };\n\n callback(ctx);\n\n return network;\n }\n\n /* ─── Internal Builders ─── */\n\n private addChannel(name: string): ConfiguredChannel {\n const channelName = ChannelName(name);\n const channel = new ConfiguredChannel(channelName);\n this.channels.set(channelName, channel);\n return channel;\n }\n\n private setMainChannel(channel: ConfiguredChannel): void {\n this._mainChannel = channel;\n }\n\n private registerAgentInternal(agent: AnyAgent): AgentBinding {\n const registration: AgentRegistration = {\n agent,\n subscribedTo: [],\n publishesTo: [],\n };\n this.agentRegistrations.set(agent.getId(), registration);\n\n const binding: AgentBinding = {\n subscribe(channel: ConfiguredChannel) {\n registration.subscribedTo.push(channel);\n return binding;\n },\n publishTo(channel: ConfiguredChannel) {\n registration.publishesTo.push(channel);\n return binding;\n },\n };\n\n return binding;\n }\n\n private createSpawnerInternal(\n factoryClass: typeof AgentFactory,\n ): SpawnerBuilder {\n const reg: SpawnerRegistration = {\n factoryClass,\n registry: {},\n };\n\n this.spawnerRegistrations.push(reg);\n\n const builder: SpawnerBuilder = {\n listen(channel: ConfiguredChannel, event: EventDef) {\n reg.listenChannel = channel;\n reg.listenEvent = event;\n return builder;\n },\n registry(registry: Record<string, AgentFactory>) {\n reg.registry = registry;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n return builder as SpawnerBuilder<any>;\n },\n defaultBinding(\n fn: (ctx: { kind: string }) => {\n subscribe: string[];\n publishTo: string[];\n },\n ) {\n reg.defaultBindingFn = fn;\n return builder;\n },\n onSpawn(\n fn: (\n ctx: SpawnCallbackContext<Record<string, AgentFactory>>,\n ) => AnyAgent,\n ) {\n reg.onSpawnFn = fn;\n return builder;\n },\n };\n\n return builder;\n }\n\n /* ─── Accessors ─── */\n\n getChannels(): Map<string, ConfiguredChannel> {\n return this.channels;\n }\n\n getMainChannel(): ConfiguredChannel | undefined {\n return this._mainChannel;\n }\n\n getAgentRegistrations(): Map<string, AgentRegistration> {\n return this.agentRegistrations;\n }\n\n getSpawnerRegistrations(): ReadonlyArray<SpawnerRegistration> {\n return this.spawnerRegistrations;\n }\n\n /** Store defined at network setup time. Shared across all event planes created for this network. */\n getStore(): AgentNetworkStore<Envelope> {\n return this._store;\n }\n\n /**\n * Expose the network as a streamable API (e.g. SSE). Returns an ExposedAPI\n * that adapters (NextEndpoint, ExpressEndpoint) consume to produce streamed\n * responses.\n *\n * @example\n * const api = network.expose({ protocol: \"sse\", auth, select });\n * export const GET = NextEndpoint.from(api, { requestToContextId, requestToRunId }).handler();\n */\n expose(options: ExposeOptions): ExposedAPI {\n return expose(this, options);\n }\n\n /**\n * Starts the event plane: creates one PubSub per channel and runs subscriber\n * loops for each (agent, channel) pair. Agents subscribed to a channel are\n * invoked concurrently when events are published to that channel.\n *\n * Returns the EventPlane for publishing. Use `Effect.scoped` so the run is\n * interrupted when the scope ends.\n */\n run(capacity?: number): Effect.Effect<EventPlane, never, Scope.Scope> {\n return this.runScoped(this, capacity);\n }\n\n private runScoped(\n network: AgentNetwork,\n capacity?: number,\n ): Effect.Effect<EventPlane, never, Scope.Scope> {\n return Effect.gen(function* () {\n const plane = yield* createEventPlane({\n network,\n capacity,\n store: network.getStore(),\n });\n yield* Effect.fork(run(network, plane));\n return plane;\n });\n }\n}\n","import { Brand } from 'effect';\n\n/** Regex: lowercase alphanumeric segments separated by hyphens (e.g. my-channel-name) */\nconst KEBAB_CASE_REGEX = /^[a-z0-9]+(-[a-z0-9]+)*$/;\n\n/**\n * Branded type for channel names. Enforces kebab-case at runtime via refinement.\n *\n * **Branded types** add a nominal marker so TypeScript treats `ChannelName` as\n * distinct from plain `string`, preventing accidental substitution (e.g. passing\n * a raw string where a validated channel name is expected).\n *\n * **Refinement** validates at runtime that the value matches kebab-case before\n * the brand is applied. Use `ChannelName(value)` to create a validated instance.\n */\nexport type ChannelName = string & Brand.Brand<'ChannelName'>;\n\nexport const ChannelName = Brand.refined<ChannelName>(\n (s) => typeof s === 'string' && KEBAB_CASE_REGEX.test(s),\n (s) => Brand.error(`Expected kebab-case (e.g. my-channel-name), got: ${s}`),\n);\n","import { type Schema as S } from 'effect';\nimport type { AgentNetworkEventDef } from './agent-network-event';\nimport { ChannelName } from '../identifiers/channel-name';\n\nexport { ChannelName } from '../identifiers/channel-name';\n\n/* ─── Sink ─── */\n\nexport type SinkDef = {\n readonly _tag: 'SinkDef';\n readonly type: string;\n readonly config: unknown;\n};\n\nexport const Sink = {\n kafka(config: { topic: string }): SinkDef {\n return { _tag: 'SinkDef', type: 'kafka', config };\n },\n httpStream(): SinkDef {\n return { _tag: 'SinkDef', type: 'http-stream', config: {} };\n },\n};\n\nexport function isHttpStreamSink(sink: SinkDef): boolean {\n return sink.type === 'http-stream';\n}\n\n/* ─── Channel Definitions ─── */\n\ntype EventDef = AgentNetworkEventDef<string, S.Schema.Any>;\n\nexport type ChannelDef = {\n readonly _tag: 'ChannelDef';\n readonly name: ChannelName;\n};\n\n/**\n * A channel configured via the builder pattern inside `AgentNetwork.setup()`.\n * Supports `.events()`, `.sink()`, and `.sinks()` chaining.\n */\nexport class ConfiguredChannel {\n readonly _tag = 'ConfiguredChannel' as const;\n readonly name: ChannelName;\n private _events: ReadonlyArray<EventDef> = [];\n private _sinks: ReadonlyArray<SinkDef> = [];\n\n constructor(name: ChannelName) {\n this.name = name;\n }\n\n events(events: ReadonlyArray<EventDef>): this {\n this._events = [...events];\n return this;\n }\n\n sink(sink: SinkDef): this {\n this._sinks = [...this._sinks, sink];\n return this;\n }\n\n sinks(sinks: ReadonlyArray<SinkDef>): this {\n this._sinks = [...sinks];\n return this;\n }\n\n getEvents(): ReadonlyArray<EventDef> {\n return this._events;\n }\n\n getSinks(): ReadonlyArray<SinkDef> {\n return this._sinks;\n }\n}\n\nexport const Channel = {\n of(name: ChannelName): ChannelDef {\n return {\n _tag: 'ChannelDef' as const,\n name,\n };\n },\n};\n","import { Cause, Effect, Fiber, PubSub, Queue, Scope } from 'effect';\nimport type { AgentNetwork, AnyAgent } from './agent-network';\nimport type {\n ContextEvents,\n EventMeta,\n RunEvents,\n} from './agent-network-event';\nimport type { ChannelName, ConfiguredChannel } from './channel';\nimport type { AgentNetworkStore } from './stores/agent-network-store';\nimport { createInMemoryNetworkStore } from './stores/inmemory-network-store';\n\n/* ─── Envelope ─── */\n\nexport type Envelope = {\n name: string;\n meta: EventMeta;\n payload: unknown;\n};\n\n/* ─── EventPlane ─── */\n\nexport type EventPlane = {\n readonly publish: (\n channel: ChannelName,\n envelope: Envelope,\n ) => Effect.Effect<boolean>;\n readonly publishToChannels: (\n channels: readonly ConfiguredChannel[],\n envelope: Envelope,\n ) => Effect.Effect<boolean>;\n readonly subscribe: (\n channel: ChannelName,\n ) => Effect.Effect<Queue.Dequeue<Envelope>, never, Scope.Scope>;\n readonly getRunEvents: (runId: string, contextId: string) => RunEvents;\n readonly getContextEvents: (contextId: string) => ContextEvents;\n readonly shutdown: Effect.Effect<void>;\n};\n\n/* ─── Create EventPlane ─── */\n\nconst DEFAULT_CAPACITY = 16;\n\ntype CreateEventPlaneOptions = {\n network: AgentNetwork;\n capacity?: number;\n store?: AgentNetworkStore<Envelope>;\n};\n\n/**\n * Creates an EventPlane from an AgentNetwork. One PubSub per channel with\n * bounded back-pressure. Use `Effect.scoped` when running to ensure proper\n * cleanup.\n */\nexport const createEventPlane = (\n options: CreateEventPlaneOptions,\n): Effect.Effect<EventPlane> =>\n Effect.gen(function* () {\n const {\n network,\n capacity = DEFAULT_CAPACITY,\n store = createInMemoryNetworkStore<Envelope>(),\n } = options;\n\n const channels = network.getChannels();\n const pubsubs = new Map<ChannelName, PubSub.PubSub<Envelope>>();\n\n for (const channel of channels.values()) {\n const pubsub = yield* PubSub.bounded<Envelope>(capacity);\n pubsubs.set(channel.name, pubsub);\n }\n\n const getPubsub = (channel: ChannelName): PubSub.PubSub<Envelope> => {\n const p = pubsubs.get(channel);\n if (!p) throw new Error(`Channel not found: ${channel}`);\n return p;\n };\n\n const recordEvent = (envelope: Envelope): void => {\n const { contextId, runId } = envelope.meta;\n store.storeEvent(contextId, runId, envelope);\n };\n\n const publishToPubSub = (\n channel: ChannelName,\n envelope: Envelope,\n ): Effect.Effect<boolean> => PubSub.publish(getPubsub(channel), envelope);\n\n const publish = (\n channel: ChannelName,\n envelope: Envelope,\n ): Effect.Effect<boolean> =>\n Effect.sync(() => recordEvent(envelope)).pipe(\n Effect.flatMap(() => publishToPubSub(channel, envelope)),\n Effect.withSpan('event.publish', {\n attributes: {\n 'event.name': envelope.name,\n 'event.payload': payloadForSpan(envelope.payload),\n channel,\n runId: envelope.meta.runId,\n contextId: envelope.meta.contextId,\n },\n }),\n );\n\n const publishToChannels = (\n targetChannels: readonly ConfiguredChannel[],\n envelope: Envelope,\n ): Effect.Effect<boolean> =>\n Effect.sync(() => recordEvent(envelope)).pipe(\n Effect.flatMap(() =>\n Effect.all(\n targetChannels.map((c) => publishToPubSub(c.name, envelope)),\n { concurrency: 'unbounded' },\n ),\n ),\n Effect.map((results: readonly boolean[]) => results.every(Boolean)),\n Effect.withSpan('event.publish', {\n attributes: {\n 'event.name': envelope.name,\n 'event.payload': payloadForSpan(envelope.payload),\n runId: envelope.meta.runId,\n contextId: envelope.meta.contextId,\n },\n }),\n );\n\n const subscribe = (\n channel: ChannelName,\n ): Effect.Effect<Queue.Dequeue<Envelope>, never, Scope.Scope> =>\n PubSub.subscribe(getPubsub(channel));\n\n const getRunEvents = (runId: string, contextId: string): RunEvents => {\n return store.getEvents(contextId, runId).slice();\n };\n\n const getContextEvents = (contextId: string): ContextEvents => {\n const byRun = store.getContextEvents(contextId);\n const map = new Map<string, readonly Envelope[]>();\n const all: Envelope[] = [];\n for (const [runId, events] of byRun) {\n const readonlyEvents = events.slice();\n map.set(runId, readonlyEvents);\n all.push(...readonlyEvents);\n }\n return {\n all,\n byRun: (runId: string) => map.get(runId) ?? [],\n map,\n };\n };\n\n const shutdown = Effect.all([...pubsubs.values()].map(PubSub.shutdown), {\n concurrency: 'unbounded',\n }).pipe(Effect.asVoid);\n\n return {\n publish,\n publishToChannels,\n subscribe,\n getRunEvents,\n getContextEvents,\n shutdown,\n };\n });\n\n/** Serialize payload for span attributes; truncate if too long */\nfunction payloadForSpan(payload: unknown, maxLen = 500): string {\n try {\n const s = JSON.stringify(payload);\n return s.length > maxLen ? `${s.slice(0, maxLen)}...` : s;\n } catch {\n return String(payload);\n }\n}\n\n/* ─── Run Subscriber Loop ─── */\n\n/**\n * Runs a single agent's subscription loop on one channel. Takes messages from\n * the dequeue, invokes the agent with the envelope as triggerEvent when the\n * event name matches the agent's listensTo, and wires emit to publish to the\n * agent's output channels.\n */\ntype EmitQueue = Queue.Queue<{\n channels: readonly ConfiguredChannel[];\n envelope: Envelope;\n}>;\n\nexport const runSubscriber = (\n agent: AnyAgent,\n publishesTo: readonly ConfiguredChannel[],\n dequeue: Queue.Dequeue<Envelope>,\n plane: EventPlane,\n emitQueue?: EmitQueue,\n channelName?: ChannelName,\n): Effect.Effect<Fiber.RuntimeFiber<void, never>> =>\n Effect.gen(function* () {\n const listensTo = agent.getListensTo?.() ?? [];\n const agentId = agent.getId();\n\n const processOne = (): Effect.Effect<void, never, never> =>\n Effect.gen(function* () {\n const envelope = yield* Queue.take(dequeue);\n if (listensTo.length > 0 && !listensTo.includes(envelope.name)) {\n return;\n }\n const runEvents = plane.getRunEvents(\n envelope.meta.runId,\n envelope.meta.contextId,\n );\n const contextEvents = plane.getContextEvents(envelope.meta.contextId);\n yield* Effect.withSpan('agent.listen', {\n attributes: {\n agentId,\n 'event.name': envelope.name,\n 'event.payload': payloadForSpan(envelope.payload),\n ...(channelName !== undefined && { channel: channelName }),\n },\n })(\n Effect.withSpan('agent.invoke', {\n attributes: {\n agentId,\n 'event.name': envelope.name,\n 'event.payload': payloadForSpan(envelope.payload),\n },\n })(\n Effect.tryPromise({\n try: () =>\n agent.invoke({\n triggerEvent: envelope,\n emit: (userEvent: { name: string; payload: unknown }) => {\n const fullEnvelope: Envelope = {\n name: userEvent.name,\n meta: envelope.meta,\n payload: userEvent.payload,\n };\n if (emitQueue) {\n Effect.runPromise(\n Queue.offer(emitQueue, {\n channels: publishesTo,\n envelope: fullEnvelope,\n }),\n ).catch(() => {});\n } else {\n Effect.runFork(\n plane.publishToChannels(publishesTo, fullEnvelope),\n );\n }\n },\n runEvents,\n contextEvents,\n }),\n catch: (e: unknown) => e,\n }),\n ),\n );\n }).pipe(\n Effect.catchAllCause((cause: Cause.Cause<unknown>) =>\n Cause.isInterrupted(cause)\n ? Effect.void\n : Effect.sync(() => {\n console.error(`Agent ${agent.getId()} failed:`, cause);\n }).pipe(Effect.asVoid),\n ),\n );\n\n const loop = (): Effect.Effect<void, never, never> =>\n processOne().pipe(Effect.flatMap(() => loop()));\n\n return yield* Effect.fork(loop());\n });\n\n/* ─── Run Network ─── */\n\nexport type RunOptions = {\n /** When provided, agent emits are queued and published by a drain fiber in the same Effect context. Use when run is forked from expose without a shared plane. */\n emitQueue?: EmitQueue;\n};\n\n/**\n * Runs the event plane: starts a subscriber loop for each (agent, channel)\n * pair. Runs until the scope ends (e.g. on interrupt). Use Effect.scoped\n * to ensure subscriptions are properly cleaned up.\n */\nexport const run = (\n network: AgentNetwork,\n plane: EventPlane,\n options?: RunOptions,\n): Effect.Effect<void, never, Scope.Scope> =>\n Effect.gen(function* () {\n const registrations = network.getAgentRegistrations();\n const emitQueue = options?.emitQueue;\n\n for (const reg of registrations.values()) {\n for (const channel of reg.subscribedTo) {\n const dequeue = yield* plane.subscribe(channel.name);\n yield* runSubscriber(\n reg.agent,\n reg.publishesTo,\n dequeue,\n plane,\n emitQueue,\n channel.name,\n );\n }\n }\n\n yield* Effect.never;\n });\n","/**\n * Type-safe no-operation stubs for use as default handlers.\n *\n * `noop` and `asyncNoop` are assignable to any callback that expects\n * additional parameters — TypeScript allows a function with fewer\n * parameters to substitute for one expecting more.\n *\n * @example\n * ```ts\n * type LogicFn = (ctx: { params: Config; emit: Emitter }) => Promise<void>;\n * const defaultLogic: LogicFn = asyncNoop;\n * ```\n */\n\n/** Synchronous no-op — safe default for any `(...) => void` handler. */\nexport const noop = (): void => {};\n\n/** Asynchronous no-op — safe default for any `(...) => Promise<void>` handler. */\nexport const asyncNoop = async (): Promise<void> => {};\n\n/** Synchronous no-op that returns a given value — for handlers that must return `R`. */\nexport const noopOf =\n <R>(value: R): (() => R) =>\n () =>\n value;\n\n/** Asynchronous no-op that resolves to a given value — for handlers that must return `Promise<R>`. */\nexport const asyncNoopOf =\n <R>(value: R): (() => Promise<R>) =>\n async () =>\n value;\n","import { asyncNoop } from '../../../helper/types/noop';\nimport type { AgentNetworkStore } from './agent-network-store';\n\n/**\n * In-memory implementation of AgentNetworkStore. Events are stored in a\n * nested map: contextId -> runId -> events.\n */\nexport const createInMemoryNetworkStore = <T>(): AgentNetworkStore<T> => {\n const store = new Map<string, Map<string, T[]>>();\n\n return {\n storeEvent: (contextId: string, runId: string, event: T): void => {\n let byRun = store.get(contextId);\n if (!byRun) {\n byRun = new Map();\n store.set(contextId, byRun);\n }\n let events = byRun.get(runId);\n if (!events) {\n events = [];\n byRun.set(runId, events);\n }\n events.push(event);\n },\n\n getEvents: (contextId: string, runId: string): T[] => {\n const events = store.get(contextId)?.get(runId);\n return events ? [...events] : [];\n },\n\n getContextEvents: (contextId: string): Map<string, T[]> => {\n const byRun = store.get(contextId);\n const result = new Map<string, T[]>();\n if (byRun) {\n for (const [runId, events] of byRun) {\n result.set(runId, [...events]);\n }\n }\n return result;\n },\n\n getFullStore: (): Map<string, Map<string, T[]>> => {\n const result = new Map<string, Map<string, T[]>>();\n for (const [contextId, byRun] of store) {\n const contextMap = new Map<string, T[]>();\n for (const [runId, events] of byRun) {\n contextMap.set(runId, [...events]);\n }\n result.set(contextId, contextMap);\n }\n return result;\n },\n\n persist: (): Promise<void> => asyncNoop(),\n load: (): Promise<void> => asyncNoop(),\n };\n};\n","import { Effect, Queue } from 'effect';\nimport type { AgentNetwork } from '../agent-network/agent-network';\nimport type { ConfiguredChannel } from '../agent-network/channel';\nimport { createEventPlane, run } from '../agent-network/event-plane';\nimport type { Envelope } from '../agent-network/event-plane';\nimport { ChannelName, isHttpStreamSink } from '../agent-network/channel';\nimport type {\n ExposeOptions,\n ExposeRequest,\n ExposedAPI,\n ExposedStream,\n StreamFactory,\n} from './types';\n\n/** Extract JSON payload from ExposeRequest. POST with JSON body, or Express req.body, else {}. */\nasync function extractPayload(req: ExposeRequest): Promise<unknown> {\n const webRequest = req.request as Request | undefined;\n if (webRequest?.method === 'POST') {\n const ct = webRequest.headers?.get?.('content-type') ?? '';\n if (ct.includes('application/json')) {\n try {\n return await webRequest.json();\n } catch {\n return {};\n }\n }\n }\n const expressReq = req.req as { body?: unknown } | undefined;\n if (expressReq?.body != null) {\n return expressReq.body;\n }\n return {};\n}\n\n/** Resolve which channel(s) to subscribe to from select options */\nfunction resolveChannels(\n network: AgentNetwork,\n select?: ExposeOptions['select'],\n): ChannelName[] {\n const channels = network.getChannels();\n if (select?.channels) {\n const ch = select.channels;\n const arr = Array.isArray(ch) ? ch : [ch];\n return arr.map((c) => ChannelName(c as string));\n }\n // Prefer channels with http-stream sink (explicitly marked for frontend)\n const httpStreamChannels = [...channels.values()]\n .filter((ch) => ch.getSinks().some(isHttpStreamSink))\n .map((ch) => ch.name);\n if (httpStreamChannels.length > 0) return httpStreamChannels;\n // Fallback: prefer \"client\", else first channel\n const client = channels.get('client' as ChannelName);\n if (client) return [client.name];\n const first = channels.values().next().value;\n return first ? [first.name] : [];\n}\n\n/** Create async iterable from Queue.Dequeue, respecting AbortSignal */\nfunction streamFromDequeue(\n take: () => Promise<Envelope>,\n signal?: AbortSignal | null,\n eventFilter?: string[],\n): ExposedStream {\n const shouldInclude = (e: Envelope): boolean =>\n !eventFilter?.length || eventFilter.includes(e.name);\n\n return {\n async *[Symbol.asyncIterator](): AsyncIterableIterator<Envelope> {\n while (!signal?.aborted) {\n const takePromise = take();\n const abortPromise = signal\n ? new Promise<never>((_, reject) => {\n signal.addEventListener(\n 'abort',\n () => reject(new DOMException('Aborted', 'AbortError')),\n { once: true },\n );\n })\n : new Promise<never>(() => {});\n\n let envelope: Envelope;\n try {\n envelope = await Promise.race([takePromise, abortPromise]);\n } catch (e) {\n if (e instanceof DOMException && e.name === 'AbortError') break;\n throw e;\n }\n\n if (shouldInclude(envelope)) yield envelope;\n }\n },\n };\n}\n\n/**\n * Expose the agent network as a streamable API. Returns an ExposedAPI that\n * adapters (NextEndpoint, ExpressEndpoint) consume to produce SSE responses.\n *\n * @example\n * const api = agentNetwork.expose({ protocol: \"sse\", auth, select });\n * export const GET = NextEndpoint.from(api, { requestToContextId, requestToRunId }).handler();\n */\nexport function expose(\n network: AgentNetwork,\n options: ExposeOptions,\n): ExposedAPI {\n const {\n auth,\n select,\n plane: providedPlane,\n onRequest,\n triggerEvents,\n tracingLayer,\n } = options;\n const triggerEventDef = triggerEvents?.[0];\n const triggerEventName = triggerEventDef?.name ?? 'request';\n const channels = resolveChannels(network, select);\n const eventFilter = select?.events;\n const mainChannel = network.getMainChannel();\n\n if (channels.length === 0) {\n throw new Error('expose: no channels to subscribe to');\n }\n\n const createStream = (async (\n req: ExposeRequest,\n consumer?: (stream: ExposedStream) => Promise<unknown>,\n ) => {\n const payload = await extractPayload(req);\n const signal = req.request?.signal;\n\n const program = Effect.gen(function* () {\n const plane =\n providedPlane ??\n (yield* createEventPlane({ network, store: network.getStore() }));\n if (!providedPlane) {\n const emitQueue = yield* Queue.unbounded<{\n channels: readonly ConfiguredChannel[];\n envelope: Envelope;\n }>();\n yield* Effect.fork(\n Effect.forever(\n Queue.take(emitQueue).pipe(\n Effect.flatMap(({ channels: chs, envelope }) =>\n plane.publishToChannels(chs, envelope),\n ),\n ),\n ),\n );\n yield* Effect.fork(run(network, plane, { emitQueue }));\n // Allow run() to subscribe agents before we publish (PubSub does not buffer for future subscribers)\n yield* Effect.sleep('10 millis');\n }\n\n const targetChannel = mainChannel?.name ?? channels[0]!;\n let runId = req.runId ?? crypto.randomUUID();\n let contextId = req.contextId ?? crypto.randomUUID();\n\n const setRunId = (id: string): void => {\n runId = id;\n };\n const setContextId = (id: string): void => {\n contextId = id;\n };\n\n const emitStartEvent = (opts: {\n contextId: string;\n runId: string;\n event: { name: string; payload: unknown };\n }): void => {\n const meta = {\n runId: opts.runId,\n contextId: opts.contextId,\n };\n const envelope: Envelope = {\n name: opts.event.name,\n meta,\n payload: opts.event.payload,\n };\n Effect.runPromise(plane.publish(targetChannel, envelope)).catch(\n () => {},\n );\n };\n\n // Subscribe to first channel before emitting (so we don't miss agent output)\n const dequeue = yield* plane.subscribe(channels[0]!);\n\n if (onRequest) {\n yield* Effect.tryPromise(() =>\n Promise.resolve(\n onRequest({\n setRunId,\n setContextId,\n emitStartEvent,\n req,\n payload,\n }),\n ),\n );\n } else if (!providedPlane) {\n const envelope: Envelope = {\n name: triggerEventName,\n meta: { runId, contextId },\n payload,\n };\n yield* plane.publish(targetChannel, envelope);\n yield* Effect.sleep('10 millis');\n }\n const take = (): Promise<Envelope> =>\n Effect.runPromise(Queue.take(dequeue)) as Promise<Envelope>;\n\n const stream = streamFromDequeue(take, signal ?? undefined, eventFilter);\n if (consumer) {\n return yield* Effect.tryPromise(() => consumer(stream));\n }\n return stream;\n });\n\n const runnable = tracingLayer\n ? program.pipe(Effect.provide(tracingLayer), Effect.scoped)\n : program.pipe(Effect.scoped);\n return Effect.runPromise(runnable);\n }) as StreamFactory;\n\n return {\n protocol: 'sse',\n createStream: (async (\n req: ExposeRequest,\n consumer?: (stream: ExposedStream) => Promise<unknown>,\n ) => {\n if (auth) {\n const result = await auth(req);\n if (!result.allowed) {\n throw new ExposeAuthError(\n result.message ?? 'Unauthorized',\n result.status ?? 401,\n );\n }\n }\n return consumer ? createStream(req, consumer) : createStream(req);\n }) as StreamFactory,\n };\n}\n\n/** Thrown when auth denies the request */\nexport class ExposeAuthError extends Error {\n constructor(\n message: string,\n public readonly status: number = 401,\n ) {\n super(message);\n this.name = 'ExposeAuthError';\n }\n}\n","import { Effect, Schema as S } from 'effect';\nimport type { ParseError } from 'effect/ParseResult';\n\n/** Standard meta carried by every event */\nexport const EventMetaSchema = S.Struct({\n runId: S.String,\n contextId: S.String,\n correlationId: S.optional(S.String),\n causationId: S.optional(S.String),\n ts: S.optional(S.Number),\n});\n\nexport type EventMeta = S.Schema.Type<typeof EventMetaSchema>;\n\n/** Envelope-like shape for events (avoids circular dep with event-plane) */\nexport type EnvelopeLike = { name: string; meta: EventMeta; payload: unknown };\nexport type RunEvents = readonly EnvelopeLike[];\n\nexport type ContextEvents = {\n /** All events in the context across all runs */\n readonly all: readonly EnvelopeLike[];\n /** Get events for a specific run */\n byRun(runId: string): readonly EnvelopeLike[];\n /** Map of runId -> events */\n readonly map: ReadonlyMap<string, readonly EnvelopeLike[]>;\n};\n\n// Re-export Schema from effect for convenience\nexport { Schema as S } from 'effect';\n\nexport type AgentNetworkEventDef<\n EventName extends string,\n PayloadSchema extends S.Schema.Any,\n> = {\n readonly _tag: 'AgentNetworkEventDef';\n readonly name: EventName;\n readonly payload: PayloadSchema;\n\n /** Decode unknown payload -> typed payload (Effect) */\n readonly decodePayload: (\n u: unknown,\n ) => Effect.Effect<S.Schema.Type<PayloadSchema>, ParseError>;\n\n /** Decode the full envelope (meta + payload) */\n readonly decode: (\n u: unknown,\n ) => Effect.Effect<\n { name: EventName; meta: EventMeta; payload: S.Schema.Type<PayloadSchema> },\n ParseError\n >;\n\n /**\n * Create an unbound event (name + payload only) for emit. Validates payload via schema.\n * Meta is injected by the runtime when the event is emitted.\n */\n readonly make: (payload: unknown) => {\n name: EventName;\n payload: S.Schema.Type<PayloadSchema>;\n };\n\n /**\n * Create a full envelope (meta + payload) for tests or manual trigger events.\n * Sync, throws on validation error.\n */\n readonly makeBound: (\n meta: unknown,\n payload: unknown,\n ) => {\n name: EventName;\n meta: EventMeta;\n payload: S.Schema.Type<PayloadSchema>;\n };\n\n /**\n * Effect version of make. Use when composing in Effect pipelines.\n */\n readonly makeEffect: (\n payload: unknown,\n ) => Effect.Effect<\n { name: EventName; payload: S.Schema.Type<PayloadSchema> },\n ParseError\n >;\n\n /**\n * Effect version of makeBound. Use when composing in Effect pipelines.\n */\n readonly makeBoundEffect: (\n meta: unknown,\n payload: unknown,\n ) => Effect.Effect<\n { name: EventName; meta: EventMeta; payload: S.Schema.Type<PayloadSchema> },\n ParseError\n >;\n\n /**\n * Type guard: returns true if `u` is a valid event of this type.\n */\n readonly is: (u: unknown) => u is {\n name: EventName;\n meta: EventMeta;\n payload: S.Schema.Type<PayloadSchema>;\n };\n};\n\ntype Envelope<EventName extends string, Meta, Payload> = {\n name: EventName;\n meta: Meta;\n payload: Payload;\n};\n\nexport const AgentNetworkEvent = {\n of<const EventName extends string, PS extends S.Schema.Any>(\n name: EventName,\n payload: PS,\n ): AgentNetworkEventDef<EventName, PS> {\n const decodePayload = S.decodeUnknown(payload);\n const envelopeSchema = S.Struct({\n name: S.Literal(name),\n meta: EventMetaSchema,\n payload,\n });\n const decodeEnvelope = S.decodeUnknown(envelopeSchema);\n\n const make = (\n payload: unknown,\n ): { name: EventName; payload: S.Schema.Type<PS> } => {\n const decoded = Effect.runSync(\n decodePayload(payload) as unknown as Effect.Effect<\n S.Schema.Type<PS>,\n ParseError\n >,\n );\n return { name, payload: decoded };\n };\n\n const makeBound = (\n meta: unknown,\n payload: unknown,\n ): Envelope<EventName, EventMeta, S.Schema.Type<PS>> =>\n Effect.runSync(\n decodeEnvelope({ name, meta, payload }) as unknown as Effect.Effect<\n Envelope<EventName, EventMeta, S.Schema.Type<PS>>,\n ParseError\n >,\n );\n\n const makeEffect = (\n payload: unknown,\n ): Effect.Effect<\n { name: EventName; payload: S.Schema.Type<PS> },\n ParseError\n > =>\n (\n decodePayload(payload) as unknown as Effect.Effect<\n S.Schema.Type<PS>,\n ParseError\n >\n ).pipe(Effect.map((p: S.Schema.Type<PS>) => ({ name, payload: p })));\n\n const makeBoundEffect = (\n meta: unknown,\n payload: unknown,\n ): Effect.Effect<\n Envelope<EventName, EventMeta, S.Schema.Type<PS>>,\n ParseError\n > =>\n decodeEnvelope({ name, meta, payload }) as unknown as Effect.Effect<\n Envelope<EventName, EventMeta, S.Schema.Type<PS>>,\n ParseError\n >;\n\n const is = S.is(envelopeSchema) as unknown as (\n u: unknown,\n ) => u is Envelope<EventName, EventMeta, S.Schema.Type<PS>>;\n\n return {\n _tag: 'AgentNetworkEventDef' as const,\n name,\n payload,\n decodePayload: decodePayload as unknown as AgentNetworkEventDef<\n EventName,\n PS\n >['decodePayload'],\n decode: decodeEnvelope as unknown as AgentNetworkEventDef<\n EventName,\n PS\n >['decode'],\n make,\n makeBound,\n makeEffect,\n makeBoundEffect,\n is,\n };\n },\n};\n","import { randomUUID } from 'crypto';\nimport type {\n ContextEvents,\n RunEvents,\n} from './agent-network/agent-network-event';\n\ntype LogicFn<TParams, TTriggerEvent, TEmitEvent> = (ctx: {\n params: TParams;\n triggerEvent: TTriggerEvent;\n emit: (event: TEmitEvent) => void;\n runEvents: RunEvents;\n contextEvents: ContextEvents;\n}) => Promise<void>;\n\nexport class Agent<TParams, TTriggerEvent = never, TEmitEvent = never> {\n #params: TParams;\n #logic: LogicFn<TParams, TTriggerEvent, TEmitEvent>;\n #id: string;\n #listensTo: readonly string[];\n\n constructor(\n logic: LogicFn<TParams, TTriggerEvent, TEmitEvent>,\n params: TParams,\n listensTo?: readonly string[],\n ) {\n this.#logic = logic;\n this.#params = params;\n this.#id = `agent-${randomUUID()}`;\n this.#listensTo = listensTo ?? [];\n }\n\n getListensTo(): readonly string[] {\n return this.#listensTo;\n }\n\n async invoke(options?: {\n triggerEvent?: TTriggerEvent;\n emit?: (event: TEmitEvent) => void;\n runEvents?: RunEvents;\n contextEvents?: ContextEvents;\n }): Promise<void> {\n const { triggerEvent, emit, runEvents, contextEvents } = options ?? {};\n\n const emitFn =\n emit ??\n ((_event: TEmitEvent): void => {\n // no-op – will be wired by the network at runtime\n });\n\n await this.#logic({\n params: this.#params,\n triggerEvent: triggerEvent ?? (undefined as TTriggerEvent),\n emit: emitFn,\n runEvents: runEvents ?? [],\n contextEvents: contextEvents ?? {\n all: [],\n byRun: () => [],\n map: new Map(),\n },\n });\n }\n\n getId(): string {\n return this.#id;\n }\n}\n","import { Schema as S } from 'effect';\nimport { Agent } from './agent';\nimport {\n AgentNetworkEventDef,\n type ContextEvents,\n type EventMeta,\n type RunEvents,\n} from './agent-network/agent-network-event';\nimport { BaseSchemaDefintion } from './types';\n\ntype EventDef = AgentNetworkEventDef<string, S.Schema.Any>;\n\n/** Extracts the envelope type (name, meta, payload) from an event definition */\nexport type EventEnvelope<E extends EventDef> =\n E extends AgentNetworkEventDef<infer N, infer PS>\n ? { name: N; meta: EventMeta; payload: S.Schema.Type<PS> }\n : never;\n\n/** What the user passes to emit() – no meta required */\nexport type EmitPayload<E extends EventDef> =\n E extends AgentNetworkEventDef<infer N, infer PS>\n ? { name: N; payload: S.Schema.Type<PS> }\n : never;\n\n/** Internal logic function */\ntype LogicFn<TParams, TTriggerEvent, TEmitEvent> = (ctx: {\n params: TParams;\n triggerEvent: TTriggerEvent;\n emit: (event: TEmitEvent) => void;\n runEvents: RunEvents;\n contextEvents: ContextEvents;\n}) => Promise<void>;\n\ntype ConstructorParams<\n TParams,\n TListensTo extends EventDef,\n TEmits extends EventDef,\n> = {\n logic?: LogicFn<TParams, EventEnvelope<TListensTo>, EmitPayload<TEmits>>;\n paramsSchema?: BaseSchemaDefintion;\n listensTo?: ReadonlyArray<TListensTo>;\n emits?: ReadonlyArray<TEmits>;\n};\n\nexport class AgentFactory<\n TParams = unknown,\n TListensTo extends EventDef = never,\n TEmits extends EventDef = never,\n> {\n private _listensTo: ReadonlyArray<TListensTo>;\n private _emits: ReadonlyArray<TEmits>;\n private _logic:\n | LogicFn<TParams, EventEnvelope<TListensTo>, EmitPayload<TEmits>>\n | undefined;\n private _paramsSchema: BaseSchemaDefintion | undefined;\n\n private constructor({\n logic,\n paramsSchema,\n listensTo = [],\n emits = [],\n }: ConstructorParams<TParams, TListensTo, TEmits>) {\n this._logic = logic;\n this._paramsSchema = paramsSchema;\n this._listensTo = listensTo;\n this._emits = emits;\n }\n\n private getConstructorState(): ConstructorParams<\n TParams,\n TListensTo,\n TEmits\n > {\n return {\n logic: this._logic,\n paramsSchema: this._paramsSchema,\n listensTo: this._listensTo,\n emits: this._emits,\n };\n }\n\n /** Union of all event definitions this agent listens to */\n getListensTo(): ReadonlyArray<TListensTo> {\n return this._listensTo;\n }\n\n /** Union of all event definitions this agent can emit */\n getEmits(): ReadonlyArray<TEmits> {\n return this._emits;\n }\n\n getLogic():\n | LogicFn<TParams, EventEnvelope<TListensTo>, EmitPayload<TEmits>>\n | undefined {\n return this._logic;\n }\n\n static run(): AgentFactory<unknown, never, never> {\n return new AgentFactory<unknown, never, never>({});\n }\n\n params<TSchema extends BaseSchemaDefintion>(\n params: TSchema,\n ): AgentFactory<TSchema['Type'], TListensTo, TEmits> {\n const { logic, ...rest } = this.getConstructorState();\n\n return new AgentFactory({\n ...rest,\n logic: logic as LogicFn<\n TSchema['Type'],\n EventEnvelope<TListensTo>,\n EmitPayload<TEmits>\n >,\n paramsSchema: params,\n });\n }\n\n listensTo<E extends EventDef>(\n events: Array<E>,\n ): AgentFactory<TParams, TListensTo | E, TEmits> {\n return new AgentFactory<TParams, TListensTo | E, TEmits>({\n ...(this.getConstructorState() as unknown as ConstructorParams<\n TParams,\n TListensTo | E,\n TEmits\n >),\n listensTo: [...this._listensTo, ...events] as ReadonlyArray<\n TListensTo | E\n >,\n });\n }\n\n emits<E extends EventDef>(\n events: Array<E>,\n ): AgentFactory<TParams, TListensTo, TEmits | E> {\n return new AgentFactory<TParams, TListensTo, TEmits | E>({\n ...(this.getConstructorState() as unknown as ConstructorParams<\n TParams,\n TListensTo,\n TEmits | E\n >),\n emits: [...this._emits, ...events] as ReadonlyArray<TEmits | E>,\n });\n }\n\n logic(\n fn: LogicFn<TParams, EventEnvelope<TListensTo>, EmitPayload<TEmits>>,\n ): AgentFactory<TParams, TListensTo, TEmits> {\n return new AgentFactory<TParams, TListensTo, TEmits>({\n ...this.getConstructorState(),\n logic: fn,\n });\n }\n\n produce(\n params: TParams,\n ): Agent<TParams, EventEnvelope<TListensTo>, EmitPayload<TEmits>> {\n const listensTo = this._listensTo.map((e) => e.name);\n return new Agent<TParams, EventEnvelope<TListensTo>, EmitPayload<TEmits>>(\n this._logic!,\n params,\n listensTo,\n );\n }\n}\n","import { Brand, Effect, Schema as S } from 'effect';\nimport type { ParseError } from 'effect/ParseResult';\n\n/**\n * A skill is commonly used by now in the agentic ecosystem.\n * However I want to formalize this into the type world.\n * A skill should be the perfect interface.\n *\n * It can be converted into a tool to be used by an agent.\n * It should also be able to be used as a subsystem. E.g. a sub network.\n * Or even a single agent.\n *\n * In order to achieve that level of separation we should borrow a few concepts from effect.\n *\n * One of them is layers.\n *\n * A skill has dependencies. Things it needs to work.\n * We need to provide those.\n * A common example would be a database connection.\n * Or an auth user context.\n */\n\n/** Regex: camelCase (e.g. myLayerFoo) */\nconst CAMEL_CASE_REGEX = /^[a-z][a-zA-Z0-9]*$/;\n\n/**\n * Branded type for layer/dependency names. Enforces camelCase at runtime via refinement.\n * Used internally for parsing, validation, and uniqueness enforcement across layers.\n */\nexport type LayerName = string & Brand.Brand<'LayerName'>;\n\nexport const LayerName = Brand.refined<LayerName>(\n (s: unknown) => typeof s === 'string' && CAMEL_CASE_REGEX.test(s),\n (s: unknown) => Brand.error(`Expected camelCase (e.g. myLayerFoo), got: ${s}`),\n);\n\n/** Definition of a single skill dependency with a branded name and schema shape */\nexport type SkillDependencyDef<\n N extends string,\n PS extends S.Schema.Any,\n> = {\n readonly _tag: 'SkillDependencyDef';\n readonly name: LayerName;\n readonly _name: N;\n readonly shape: PS;\n readonly decode: (\n u: unknown,\n ) => Effect.Effect<S.Schema.Type<PS>, ParseError>;\n};\n\n/** Build layers object type from a tuple of dependency definitions */\ntype DependenciesToLayers<T> = T extends SkillDependencyDef<\n infer N,\n infer PS\n>\n ? { [K in N]: S.Schema.Type<PS> }\n : never;\n\ntype UnionToIntersection<U> = (\n U extends unknown ? (k: U) => void : never\n) extends (k: infer I) => void\n ? I\n : never;\n\n/** Build layers object from union of dependency types */\nexport type LayersFromDeps<\n T extends SkillDependencyDef<string, S.Schema.Any>,\n> = [T] extends [never]\n ? Record<string, never>\n : UnionToIntersection<DependenciesToLayers<T>>;\n\nexport const SkillDependency = {\n of<const N extends string, PS extends S.Schema.Any>(config: {\n name: N;\n shape: PS;\n }): SkillDependencyDef<N, PS> {\n const name = LayerName(config.name as string);\n const decode = S.decodeUnknown(config.shape);\n return {\n _tag: 'SkillDependencyDef' as const,\n name,\n _name: config.name,\n shape: config.shape,\n decode: decode as (\n u: unknown,\n ) => Effect.Effect<S.Schema.Type<PS>, ParseError>,\n };\n },\n};\n\n/** Normalize single or array of layers to readonly array */\nfunction toLayerArray<D extends SkillDependencyDef<string, S.Schema.Any>>(\n layers: [D, ...D[]] | [ReadonlyArray<D>],\n): ReadonlyArray<D> {\n if (layers.length === 1 && Array.isArray(layers[0])) {\n return layers[0];\n }\n return [...(layers as [D, ...D[]])];\n}\n\n/** Check for duplicate layer names and throw if found */\nfunction assertUniqueLayerNames<D extends SkillDependencyDef<string, S.Schema.Any>>(\n layers: ReadonlyArray<D>,\n): void {\n const seen = new Set<string>();\n for (const dep of layers) {\n const key = dep.name as string;\n if (seen.has(key)) {\n throw new Error(`Duplicate layer name: ${key}`);\n }\n seen.add(key);\n }\n}\n\n/** Minimal runtime options placeholder (logger, trace, etc. can be extended later) */\nexport type SkillRuntimeOptions = Record<string, unknown>;\n\n/** Context passed to the define callback */\nexport type SkillDefineContext<TIn, TChunk, TLayers> = {\n input: TIn;\n emit: (chunk: TChunk) => void;\n layers: TLayers;\n};\n\n/** Define function signature */\ntype DefineFn<TIn, TChunk, TDone, TLayers> = (\n ctx: SkillDefineContext<TIn, TChunk, TLayers>,\n) => TDone | Promise<TDone>;\n\n/** Final executable skill instance */\nexport type SkillInstance<TInput, TChunk, TDone, TLayers> = {\n invokeStream: (\n input: unknown,\n runtime?: { layers: TLayers } & SkillRuntimeOptions,\n ) => AsyncIterable<TChunk | { _tag: 'Done'; done: TDone }>;\n /** Input is decoded to TInput before being passed to the skill logic */\n invoke: (\n input: unknown,\n runtime?: { layers: TLayers } & SkillRuntimeOptions,\n ) => Promise<{ chunks: TChunk[]; done: TDone }>;\n} & { readonly _input?: TInput };\n\ntype ConstructorParams<\n TInput,\n TChunk,\n TDone,\n TDeps extends SkillDependencyDef<string, S.Schema.Any>,\n> = {\n inputSchema?: S.Schema<TInput>;\n chunkSchema?: S.Schema<TChunk>;\n doneSchema?: S.Schema<TDone>;\n layers: ReadonlyArray<TDeps>;\n defineFn?: DefineFn<TInput, TChunk, TDone, LayersFromDeps<TDeps>>;\n};\n\nexport class Skill<\n TInput = unknown,\n TChunk = unknown,\n TDone = unknown,\n TDeps extends SkillDependencyDef<string, S.Schema.Any> = never,\n> {\n private _inputSchema: S.Schema<TInput> | undefined;\n private _chunkSchema: S.Schema<TChunk> | undefined;\n private _doneSchema: S.Schema<TDone> | undefined;\n private _layers: ReadonlyArray<SkillDependencyDef<string, S.Schema.Any>>;\n private _defineFn:\n | DefineFn<TInput, TChunk, TDone, LayersFromDeps<TDeps>>\n | undefined;\n\n private constructor(\n params: ConstructorParams<TInput, TChunk, TDone, TDeps>,\n ) {\n this._inputSchema = params.inputSchema;\n this._chunkSchema = params.chunkSchema;\n this._doneSchema = params.doneSchema;\n this._layers = params.layers as ReadonlyArray<\n SkillDependencyDef<string, S.Schema.Any>\n >;\n this._defineFn = params.defineFn;\n }\n\n private getState(): ConstructorParams<TInput, TChunk, TDone, TDeps> {\n return {\n inputSchema: this._inputSchema,\n chunkSchema: this._chunkSchema,\n doneSchema: this._doneSchema,\n layers: this._layers as ReadonlyArray<TDeps>,\n defineFn: this._defineFn,\n };\n }\n\n static of(\n _options?: SkillRuntimeOptions,\n ): Skill<unknown, unknown, unknown, never> {\n return new Skill<unknown, unknown, unknown, never>({\n layers: [],\n });\n }\n\n input<ISchema extends S.Schema.Any>(\n schema: ISchema,\n ): Skill<S.Schema.Type<ISchema>, TChunk, TDone, TDeps> {\n return new Skill({\n ...(this.getState() as unknown as ConstructorParams<\n S.Schema.Type<ISchema>,\n TChunk,\n TDone,\n TDeps\n >),\n inputSchema: schema as unknown as S.Schema<S.Schema.Type<ISchema>>,\n });\n }\n\n chunk<CSchema extends S.Schema.Any>(\n schema: CSchema,\n ): Skill<TInput, S.Schema.Type<CSchema>, TDone, TDeps> {\n return new Skill({\n ...(this.getState() as unknown as ConstructorParams<\n TInput,\n S.Schema.Type<CSchema>,\n TDone,\n TDeps\n >),\n chunkSchema: schema as unknown as S.Schema<S.Schema.Type<CSchema>>,\n });\n }\n\n done<DSchema extends S.Schema.Any>(\n schema: DSchema,\n ): Skill<TInput, TChunk, S.Schema.Type<DSchema>, TDeps> {\n return new Skill({\n ...(this.getState() as unknown as ConstructorParams<\n TInput,\n TChunk,\n S.Schema.Type<DSchema>,\n TDeps\n >),\n doneSchema: schema as unknown as S.Schema<S.Schema.Type<DSchema>>,\n });\n }\n\n use<D extends SkillDependencyDef<string, S.Schema.Any>>(\n ...layers: [D, ...D[]] | [ReadonlyArray<D>]\n ): Skill<TInput, TChunk, TDone, TDeps | D> {\n const normalized = toLayerArray(layers);\n const allLayers = [...this._layers, ...normalized];\n assertUniqueLayerNames(allLayers);\n return new Skill({\n ...(this.getState() as unknown as ConstructorParams<\n TInput,\n TChunk,\n TDone,\n TDeps | D\n >),\n layers: allLayers as unknown as ReadonlyArray<TDeps | D>,\n }) as Skill<TInput, TChunk, TDone, TDeps | D>;\n }\n\n define(\n fn: DefineFn<TInput, TChunk, TDone, LayersFromDeps<TDeps>>,\n ): SkillInstance<TInput, TChunk, TDone, LayersFromDeps<TDeps>> {\n const state = this.getState();\n const inputSchema = state.inputSchema;\n const chunkSchema = state.chunkSchema;\n const doneSchema = state.doneSchema;\n const defineFn = fn;\n\n if (!inputSchema || !chunkSchema || !doneSchema || !defineFn) {\n throw new Error(\n 'Skill.define requires input(), chunk(), and done() to be called before define()',\n );\n }\n\n const decodeInput = S.decodeUnknown(inputSchema);\n const decodeChunk = S.decodeUnknown(chunkSchema);\n const decodeDone = S.decodeUnknown(doneSchema);\n\n const runDefine = async (\n input: TInput,\n runtime?: { layers: LayersFromDeps<TDeps> } & SkillRuntimeOptions,\n ): Promise<{ chunks: TChunk[]; done: TDone }> => {\n const layersObj =\n runtime?.layers ?? ({} as LayersFromDeps<TDeps>);\n const chunks: TChunk[] = [];\n const emit = (chunk: TChunk): void => {\n const decoded = Effect.runSync(\n decodeChunk(chunk) as Effect.Effect<TChunk, ParseError>,\n );\n chunks.push(decoded);\n };\n const done = await defineFn({\n input,\n emit,\n layers: layersObj,\n });\n const decodedDone = Effect.runSync(\n decodeDone(done) as Effect.Effect<TDone, ParseError>,\n );\n return { chunks, done: decodedDone };\n };\n\n return {\n invokeStream: async function* (\n input: unknown,\n runtime?: { layers: LayersFromDeps<TDeps> } & SkillRuntimeOptions,\n ): AsyncGenerator<\n TChunk | { _tag: 'Done'; done: TDone },\n void,\n undefined\n > {\n const decodedInput = Effect.runSync(\n decodeInput(input) as Effect.Effect<TInput, ParseError>,\n );\n const layersObj =\n runtime?.layers ?? ({} as LayersFromDeps<TDeps>);\n const chunks: TChunk[] = [];\n const emit = (chunk: TChunk): void => {\n const decoded = Effect.runSync(\n decodeChunk(chunk) as Effect.Effect<TChunk, ParseError>,\n );\n chunks.push(decoded);\n };\n const done = await defineFn({\n input: decodedInput,\n emit,\n layers: layersObj,\n });\n const decodedDone = Effect.runSync(\n decodeDone(done) as Effect.Effect<TDone, ParseError>,\n );\n for (const c of chunks) {\n yield c;\n }\n yield { _tag: 'Done' as const, done: decodedDone };\n },\n invoke: async (\n input: unknown,\n runtime?: { layers: LayersFromDeps<TDeps> } & SkillRuntimeOptions,\n ): Promise<{ chunks: TChunk[]; done: TDone }> => {\n const decodedInput = Effect.runSync(\n decodeInput(input) as Effect.Effect<TInput, ParseError>,\n );\n return runDefine(decodedInput, runtime);\n },\n };\n }\n}\n","import type { Envelope } from '../../agent-network/event-plane';\n\n/** Format a single SSE message (event + data) */\nexport function formatSSE(envelope: Envelope): string {\n const data = JSON.stringify(envelope);\n return `event: ${envelope.name}\\ndata: ${data}\\n\\n`;\n}\n\n/** Create a ReadableStream that encodes envelopes as SSE */\nexport function toSSEStream(\n source: AsyncIterable<Envelope>,\n signal?: AbortSignal | null,\n): ReadableStream<Uint8Array> {\n const encoder = new TextEncoder();\n\n return new ReadableStream<Uint8Array>({\n async start(controller): Promise<void> {\n const onAbort = (): void => controller.close();\n signal?.addEventListener('abort', onAbort, { once: true });\n\n try {\n for await (const envelope of source) {\n if (signal?.aborted) break;\n controller.enqueue(encoder.encode(formatSSE(envelope)));\n }\n } finally {\n signal?.removeEventListener('abort', onAbort);\n controller.close();\n }\n },\n });\n}\n","import type { ExposedAPI } from '../types';\nimport { ExposeAuthError } from '../expose';\nimport { formatSSE } from '../protocols/sse';\n\n/** Next.js App Router GET/POST handler signature */\nexport type NextGetHandler = (request: Request) => Promise<Response>;\n\n/** Options for NextEndpoint.from() - required to define how request maps to contextId and runId */\nexport type NextEndpointOptions = {\n requestToContextId: (request: Request) => string;\n requestToRunId: (request: Request) => string;\n};\n\n/**\n * Adapter for Next.js App Router. Maps an ExposedAPI to a route handler\n * that streams events as SSE. Use for both GET and POST; POST with JSON body\n * is recommended for passing the start event payload.\n *\n * @example\n * const api = agentNetwork.expose({ protocol: \"sse\", auth, select });\n * const handler = NextEndpoint.from(api, {\n * requestToContextId: (req) => req.headers.get('x-correlation-id') ?? crypto.randomUUID(),\n * requestToRunId: () => crypto.randomUUID(),\n * }).handler();\n * export const GET = handler;\n * export const POST = handler;\n */\nexport const NextEndpoint = {\n from(api: ExposedAPI, options: NextEndpointOptions): {\n handler(): NextGetHandler;\n } {\n if (api.protocol !== 'sse') {\n throw new Error(`NextEndpoint: unsupported protocol \"${api.protocol}\"`);\n }\n\n const { requestToContextId, requestToRunId } = options;\n\n return {\n handler(): NextGetHandler {\n return async (request: Request) => {\n const req = {\n request,\n contextId: requestToContextId(request),\n runId: requestToRunId(request),\n };\n\n try {\n const encoder = new TextEncoder();\n const { readable, writable } =\n new TransformStream<Uint8Array>();\n\n // Signal that the consumer callback has been entered (auth passed, stream ready)\n let consumerStarted!: () => void;\n const started = new Promise<void>((resolve) => {\n consumerStarted = resolve;\n });\n\n const streamDone = api.createStream(req, async (stream) => {\n consumerStarted();\n const writer = writable.getWriter();\n try {\n for await (const envelope of stream) {\n if (request.signal?.aborted) break;\n await writer.write(encoder.encode(formatSSE(envelope)));\n }\n } finally {\n await writer.close();\n }\n });\n\n // Race: consumer starts (auth passed) vs. createStream rejects (auth failed)\n await Promise.race([started, streamDone]);\n\n // Auth passed. Stream is being written in the background.\n streamDone.catch(() => {}); // prevent unhandled rejection\n\n return new Response(readable, {\n headers: {\n 'Content-Type': 'text/event-stream',\n 'Cache-Control': 'no-cache',\n Connection: 'keep-alive',\n },\n });\n } catch (e) {\n if (e instanceof ExposeAuthError) {\n return new Response(e.message, { status: e.status });\n }\n throw e;\n }\n };\n },\n };\n },\n};\n","import type { ExposedAPI } from '../types';\nimport { ExposeAuthError } from '../expose';\nimport { formatSSE } from '../protocols/sse';\n\n/** Minimal Express-like request (compatible with express.Request) */\nexport type ExpressRequest = {\n on(event: 'close', fn: () => void): void;\n};\n\n/** Options for ExpressEndpoint.from() - required to define how request maps to contextId and runId */\nexport type ExpressEndpointOptions = {\n requestToContextId: (req: ExpressRequest) => string;\n requestToRunId: (req: ExpressRequest) => string;\n};\n\n/** Minimal Express-like response (compatible with express.Response) */\nexport type ExpressResponse = {\n setHeader(name: string, value: string | number): void;\n flushHeaders?(): void;\n write(chunk: Uint8Array): void;\n flush?(): void;\n end(): void;\n status(code: number): ExpressResponse;\n send(body: string): void;\n};\n\n/** Express route handler signature */\nexport type ExpressHandler = (\n req: ExpressRequest,\n res: ExpressResponse,\n) => void | Promise<void>;\n\n/**\n * Adapter for Express. Maps an ExposedAPI to an Express route handler\n * that streams events as SSE.\n *\n * @example\n * const api = agentNetwork.expose({ protocol: \"sse\", auth, select });\n * app.get(\"/events\", ExpressEndpoint.from(api, {\n * requestToContextId: (req) => req.headers?.['x-correlation-id'] ?? crypto.randomUUID(),\n * requestToRunId: () => crypto.randomUUID(),\n * }).handler());\n */\nexport const ExpressEndpoint = {\n from(api: ExposedAPI, options: ExpressEndpointOptions): {\n handler(): ExpressHandler;\n } {\n if (api.protocol !== 'sse') {\n throw new Error(\n `ExpressEndpoint: unsupported protocol \"${api.protocol}\"`,\n );\n }\n\n const { requestToContextId, requestToRunId } = options;\n\n return {\n handler(): ExpressHandler {\n return async (req: ExpressRequest, res: ExpressResponse) => {\n const controller = new AbortController();\n req.on('close', () => controller.abort());\n\n const exposeReq = {\n request: { signal: controller.signal } as Request,\n req,\n res,\n contextId: requestToContextId(req),\n runId: requestToRunId(req),\n };\n\n try {\n const encoder = new TextEncoder();\n await api.createStream(exposeReq, async (stream) => {\n // Set SSE headers only after auth has passed\n res.setHeader('Content-Type', 'text/event-stream');\n res.setHeader('Cache-Control', 'no-cache');\n res.setHeader('Connection', 'keep-alive');\n res.flushHeaders?.();\n\n try {\n for await (const envelope of stream) {\n if (controller.signal.aborted) break;\n res.write(encoder.encode(formatSSE(envelope)));\n res.flush?.();\n }\n } finally {\n res.end();\n }\n });\n } catch (e) {\n if (e instanceof ExposeAuthError) {\n res.status(e.status).send(e.message);\n return;\n }\n throw e;\n }\n };\n },\n };\n },\n};\n","import { Context, Exit, Layer, Option, Tracer } from 'effect';\n\nconst randomHexString = (length: number): string => {\n const chars = 'abcdef0123456789';\n let result = '';\n for (let i = 0; i < length; i++) {\n result += chars.charAt(Math.floor(Math.random() * chars.length));\n }\n return result;\n};\n\n/** Span that logs to console when ended */\nclass ConsoleSpan implements Tracer.Span {\n readonly _tag = 'Span' as const;\n readonly spanId: string;\n readonly traceId: string;\n readonly sampled = true;\n status: Tracer.SpanStatus;\n attributes: Map<string, unknown> = new Map();\n links: Tracer.SpanLink[] = [];\n\n constructor(\n readonly name: string,\n readonly parent: Option.Option<Tracer.AnySpan>,\n readonly context: Context.Context<never>,\n links: Iterable<Tracer.SpanLink>,\n readonly startTime: bigint,\n readonly kind: Tracer.SpanKind,\n private readonly depth: number,\n ) {\n this.traceId =\n parent._tag === 'Some' ? parent.value.traceId : randomHexString(32);\n this.spanId = randomHexString(16);\n this.links = Array.from(links);\n this.status = { _tag: 'Started', startTime };\n }\n\n end(endTime: bigint, exit: Exit.Exit<unknown, unknown>): void {\n if (this.status._tag === 'Ended') return;\n const startTime = this.status.startTime;\n const durationNs = endTime - startTime;\n const durationMs = Number(durationNs) / 1_000_000;\n const indent = ' '.repeat(this.depth);\n const attrs = Object.fromEntries(this.attributes);\n const status = Exit.isSuccess(exit) ? 'ok' : 'error';\n // eslint-disable-next-line no-console\n console.log(\n `${indent}[trace] ${this.name} ${durationMs.toFixed(2)}ms (${status})`,\n Object.keys(attrs).length > 0 ? attrs : '',\n );\n this.status = { _tag: 'Ended', startTime, endTime, exit };\n }\n\n attribute(key: string, value: unknown): void {\n this.attributes.set(key, value);\n }\n\n event(\n _name: string,\n _startTime: bigint,\n _attributes?: Record<string, unknown>,\n ): void {\n // no-op for console tracer\n }\n\n addLinks(links: ReadonlyArray<Tracer.SpanLink>): void {\n this.links.push(...links);\n }\n}\n\nfunction getDepth(parent: Option.Option<Tracer.AnySpan>): number {\n if (parent._tag === 'None') return 0;\n const p = parent.value;\n if (p._tag === 'ExternalSpan') return 0;\n return 1 + getDepth((p as Tracer.Span).parent);\n}\n\n/**\n * A Tracer that logs spans to console when they end. No optional dependencies\n * required. Use `consoleTracerLayer` when running your program to enable.\n *\n * @example\n * ```ts\n * import { Effect } from 'effect';\n * import { AgentNetwork, consoleTracerLayer } from '@m4trix/core/matrix';\n *\n * const network = AgentNetwork.setup(({ ... }) => { ... });\n * const program = network.run().pipe(\n * Effect.provide(consoleTracerLayer),\n * Effect.scoped\n * );\n * Effect.runPromise(program);\n * ```\n */\nexport const consoleTracer: Tracer.Tracer = Tracer.make({\n span: (name, parent, context, links, startTime, kind) =>\n new ConsoleSpan(\n name,\n parent,\n context,\n links,\n startTime,\n kind,\n getDepth(parent),\n ),\n context: (f) => f(),\n});\n\n/**\n * Layer that provides the console tracer. Pipe your program with\n * `Effect.provide(consoleTracerLayer)` before running to see spans in stdout.\n */\nexport const consoleTracerLayer: Layer.Layer<never> = Layer.setTracer(\n consoleTracer,\n);\n"]}
|