gauss-ai 4.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +489 -0
- package/LICENSE +21 -0
- package/README.md +269 -0
- package/dist/a2a/index.cjs +7 -0
- package/dist/a2a/index.cjs.map +1 -0
- package/dist/a2a/index.d.cts +30 -0
- package/dist/a2a/index.d.ts +30 -0
- package/dist/a2a/index.js +7 -0
- package/dist/a2a/index.js.map +1 -0
- package/dist/agent-UIQDSYCE.js +16 -0
- package/dist/agent-UIQDSYCE.js.map +1 -0
- package/dist/agent-builder-8W3mBR-N.d.ts +1075 -0
- package/dist/agent-builder-GEMYdb1p.d.cts +1075 -0
- package/dist/agent-graph-AMQYAWNF.js +1422 -0
- package/dist/agent-graph-AMQYAWNF.js.map +1 -0
- package/dist/ai-sdk-mcp.adapter-SEN6KHNU.js +124 -0
- package/dist/ai-sdk-mcp.adapter-SEN6KHNU.js.map +1 -0
- package/dist/browser/index.js +10 -0
- package/dist/browser/index.js.map +1 -0
- package/dist/bun-runtime.adapter-MQDAJLQM.js +8 -0
- package/dist/bun-runtime.adapter-MQDAJLQM.js.map +1 -0
- package/dist/bun-runtime.adapter-XKOUXVAK.cjs +8 -0
- package/dist/bun-runtime.adapter-XKOUXVAK.cjs.map +1 -0
- package/dist/chat-A3XMRPJL.js +129 -0
- package/dist/chat-A3XMRPJL.js.map +1 -0
- package/dist/chunk-2ZRU47NC.js +91 -0
- package/dist/chunk-2ZRU47NC.js.map +1 -0
- package/dist/chunk-3LD3JTH4.cjs +18 -0
- package/dist/chunk-3LD3JTH4.cjs.map +1 -0
- package/dist/chunk-5FE5TG2W.cjs +16 -0
- package/dist/chunk-5FE5TG2W.cjs.map +1 -0
- package/dist/chunk-6XF673YC.cjs +436 -0
- package/dist/chunk-6XF673YC.cjs.map +1 -0
- package/dist/chunk-7CKWZJNS.js +230 -0
- package/dist/chunk-7CKWZJNS.js.map +1 -0
- package/dist/chunk-BI2G665F.js +4588 -0
- package/dist/chunk-BI2G665F.js.map +1 -0
- package/dist/chunk-C5NLWJS2.js +139 -0
- package/dist/chunk-C5NLWJS2.js.map +1 -0
- package/dist/chunk-CJZ66SU3.cjs +4321 -0
- package/dist/chunk-CJZ66SU3.cjs.map +1 -0
- package/dist/chunk-DAMT2CXW.cjs +91 -0
- package/dist/chunk-DAMT2CXW.cjs.map +1 -0
- package/dist/chunk-E7WG3MO5.js +18 -0
- package/dist/chunk-E7WG3MO5.js.map +1 -0
- package/dist/chunk-EFDM6R4J.js +99 -0
- package/dist/chunk-EFDM6R4J.js.map +1 -0
- package/dist/chunk-F7WIPPEO.js +256 -0
- package/dist/chunk-F7WIPPEO.js.map +1 -0
- package/dist/chunk-FAYDE67N.js +6927 -0
- package/dist/chunk-FAYDE67N.js.map +1 -0
- package/dist/chunk-GAE2KKCM.js +21 -0
- package/dist/chunk-GAE2KKCM.js.map +1 -0
- package/dist/chunk-INLNGRXM.cjs +130 -0
- package/dist/chunk-INLNGRXM.cjs.map +1 -0
- package/dist/chunk-JKXKXB5O.js +130 -0
- package/dist/chunk-JKXKXB5O.js.map +1 -0
- package/dist/chunk-K6SAETGP.js +375 -0
- package/dist/chunk-K6SAETGP.js.map +1 -0
- package/dist/chunk-KEASLAYR.js +157 -0
- package/dist/chunk-KEASLAYR.js.map +1 -0
- package/dist/chunk-KKJVNM6O.js +436 -0
- package/dist/chunk-KKJVNM6O.js.map +1 -0
- package/dist/chunk-KYIMVRIM.js +16 -0
- package/dist/chunk-KYIMVRIM.js.map +1 -0
- package/dist/chunk-MB7NXIZD.js +4321 -0
- package/dist/chunk-MB7NXIZD.js.map +1 -0
- package/dist/chunk-MHHDXPGE.js +209 -0
- package/dist/chunk-MHHDXPGE.js.map +1 -0
- package/dist/chunk-NE6JJA5W.js +401 -0
- package/dist/chunk-NE6JJA5W.js.map +1 -0
- package/dist/chunk-PF46XZBF.cjs +6927 -0
- package/dist/chunk-PF46XZBF.cjs.map +1 -0
- package/dist/chunk-PSJIAGDE.cjs +375 -0
- package/dist/chunk-PSJIAGDE.cjs.map +1 -0
- package/dist/chunk-PWOQDXNQ.js +16 -0
- package/dist/chunk-PWOQDXNQ.js.map +1 -0
- package/dist/chunk-QYOMQBBZ.cjs +230 -0
- package/dist/chunk-QYOMQBBZ.cjs.map +1 -0
- package/dist/chunk-UDFXLC4J.cjs +16 -0
- package/dist/chunk-UDFXLC4J.cjs.map +1 -0
- package/dist/chunk-UO4NGXRT.cjs +259 -0
- package/dist/chunk-UO4NGXRT.cjs.map +1 -0
- package/dist/chunk-UPFDFLEW.js +40 -0
- package/dist/chunk-UPFDFLEW.js.map +1 -0
- package/dist/chunk-V55JSQS7.cjs +16 -0
- package/dist/chunk-V55JSQS7.cjs.map +1 -0
- package/dist/chunk-VJADHXZL.cjs +16 -0
- package/dist/chunk-VJADHXZL.cjs.map +1 -0
- package/dist/chunk-VRWD7LCI.js +59 -0
- package/dist/chunk-VRWD7LCI.js.map +1 -0
- package/dist/chunk-WKKQ443C.js +487 -0
- package/dist/chunk-WKKQ443C.js.map +1 -0
- package/dist/chunk-X2GHUHAF.js +436 -0
- package/dist/chunk-X2GHUHAF.js.map +1 -0
- package/dist/chunk-XLGW3XNI.cjs +256 -0
- package/dist/chunk-XLGW3XNI.cjs.map +1 -0
- package/dist/chunk-ZFJKX4DP.js +16 -0
- package/dist/chunk-ZFJKX4DP.js.map +1 -0
- package/dist/chunk-ZM2OEWM2.js +259 -0
- package/dist/chunk-ZM2OEWM2.js.map +1 -0
- package/dist/chunk-ZNAIP2XV.js +16 -0
- package/dist/chunk-ZNAIP2XV.js.map +1 -0
- package/dist/chunk-ZYFAZYSL.js +42 -0
- package/dist/chunk-ZYFAZYSL.js.map +1 -0
- package/dist/cli/index.js +421 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/config-4MHT6TQW.js +153 -0
- package/dist/config-4MHT6TQW.js.map +1 -0
- package/dist/config-REERQFK4.cjs +153 -0
- package/dist/config-REERQFK4.cjs.map +1 -0
- package/dist/cost-tracker-JLOU7IZJ.js +7 -0
- package/dist/cost-tracker-JLOU7IZJ.js.map +1 -0
- package/dist/demo-C52GMSYH.js +188 -0
- package/dist/demo-C52GMSYH.js.map +1 -0
- package/dist/deno/index.js +306 -0
- package/dist/deno/index.js.map +1 -0
- package/dist/deno-runtime.adapter-F744HY7K.js +8 -0
- package/dist/deno-runtime.adapter-F744HY7K.js.map +1 -0
- package/dist/deno-runtime.adapter-RFEVNSCV.cjs +8 -0
- package/dist/deno-runtime.adapter-RFEVNSCV.cjs.map +1 -0
- package/dist/dev-D7DDVDA4.js +218 -0
- package/dist/dev-D7DDVDA4.js.map +1 -0
- package/dist/edge/index.js +10 -0
- package/dist/edge/index.js.map +1 -0
- package/dist/edge-runtime.adapter-UQCW2F7X.js +8 -0
- package/dist/edge-runtime.adapter-UQCW2F7X.js.map +1 -0
- package/dist/edge-runtime.adapter-YED6F3AY.cjs +8 -0
- package/dist/edge-runtime.adapter-YED6F3AY.cjs.map +1 -0
- package/dist/graph-MGFAQZ5W.js +50 -0
- package/dist/graph-MGFAQZ5W.js.map +1 -0
- package/dist/graph-visualization-HBSVQXJK.js +9 -0
- package/dist/graph-visualization-HBSVQXJK.js.map +1 -0
- package/dist/index-BRgqNnh3.d.cts +982 -0
- package/dist/index-CZxpYUxZ.d.ts +982 -0
- package/dist/index.cjs +14789 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +10275 -0
- package/dist/index.d.ts +10275 -0
- package/dist/index.js +14789 -0
- package/dist/index.js.map +1 -0
- package/dist/init-CFWXTQ35.js +133 -0
- package/dist/init-CFWXTQ35.js.map +1 -0
- package/dist/llm-VWO4MC7J.cjs +17 -0
- package/dist/llm-VWO4MC7J.cjs.map +1 -0
- package/dist/llm-XLXVSPBI.js +17 -0
- package/dist/llm-XLXVSPBI.js.map +1 -0
- package/dist/logging-WRAK5ZXT.js +33 -0
- package/dist/logging-WRAK5ZXT.js.map +1 -0
- package/dist/metrics-FAHZVVD4.js +47 -0
- package/dist/metrics-FAHZVVD4.js.map +1 -0
- package/dist/node/index.cjs +280 -0
- package/dist/node/index.cjs.map +1 -0
- package/dist/node/index.d.cts +51 -0
- package/dist/node/index.d.ts +51 -0
- package/dist/node/index.js +280 -0
- package/dist/node/index.js.map +1 -0
- package/dist/node-runtime.adapter-5L7PJ6W2.js +8 -0
- package/dist/node-runtime.adapter-5L7PJ6W2.js.map +1 -0
- package/dist/node-runtime.adapter-CCRZVGHB.cjs +8 -0
- package/dist/node-runtime.adapter-CCRZVGHB.cjs.map +1 -0
- package/dist/persist-usage-WTBTCWEF.js +7 -0
- package/dist/persist-usage-WTBTCWEF.js.map +1 -0
- package/dist/plugin-RCPBWUUA.js +207 -0
- package/dist/plugin-RCPBWUUA.js.map +1 -0
- package/dist/plugins/index.cjs +75 -0
- package/dist/plugins/index.cjs.map +1 -0
- package/dist/plugins/index.d.cts +8 -0
- package/dist/plugins/index.d.ts +8 -0
- package/dist/plugins/index.js +75 -0
- package/dist/plugins/index.js.map +1 -0
- package/dist/plugins-L4ING3CX.js +4625 -0
- package/dist/plugins-L4ING3CX.js.map +1 -0
- package/dist/providers/index.cjs +189 -0
- package/dist/providers/index.cjs.map +1 -0
- package/dist/providers/index.d.cts +168 -0
- package/dist/providers/index.d.ts +168 -0
- package/dist/providers/index.js +189 -0
- package/dist/providers/index.js.map +1 -0
- package/dist/providers-3RNQ5CKZ.js +59 -0
- package/dist/providers-3RNQ5CKZ.js.map +1 -0
- package/dist/providers-66GPXUGQ.cjs +59 -0
- package/dist/providers-66GPXUGQ.cjs.map +1 -0
- package/dist/repl-K6QN4I2S.js +678 -0
- package/dist/repl-K6QN4I2S.js.map +1 -0
- package/dist/rest/index.cjs +17 -0
- package/dist/rest/index.cjs.map +1 -0
- package/dist/rest/index.d.cts +102 -0
- package/dist/rest/index.d.ts +102 -0
- package/dist/rest/index.js +17 -0
- package/dist/rest/index.js.map +1 -0
- package/dist/runtime-deno.js +15 -0
- package/dist/runtime-deno.js.map +1 -0
- package/dist/runtime-edge.js +15 -0
- package/dist/runtime-edge.js.map +1 -0
- package/dist/runtime-node.js +15 -0
- package/dist/runtime-node.js.map +1 -0
- package/dist/scraping/index.cjs +11 -0
- package/dist/scraping/index.cjs.map +1 -0
- package/dist/scraping/index.d.cts +17 -0
- package/dist/scraping/index.d.ts +17 -0
- package/dist/scraping/index.js +11 -0
- package/dist/scraping/index.js.map +1 -0
- package/dist/semantic-scraping.port-CZWUea88.d.cts +54 -0
- package/dist/semantic-scraping.port-CZWUea88.d.ts +54 -0
- package/dist/server/index.js +166 -0
- package/dist/server/index.js.map +1 -0
- package/dist/testing/index.cjs +25 -0
- package/dist/testing/index.cjs.map +1 -0
- package/dist/testing/index.d.cts +63 -0
- package/dist/testing/index.d.ts +63 -0
- package/dist/testing/index.js +25 -0
- package/dist/testing/index.js.map +1 -0
- package/dist/token-counter.port-CRgxZZGe.d.ts +334 -0
- package/dist/token-counter.port-D7BHMCRR.d.cts +334 -0
- package/dist/tools-BZM33OBZ.js +10 -0
- package/dist/tools-BZM33OBZ.js.map +1 -0
- package/dist/tracing-XA3TEWP4.js +48 -0
- package/dist/tracing-XA3TEWP4.js.map +1 -0
- package/dist/types-CVsP7gFI.d.cts +235 -0
- package/dist/types-CVsP7gFI.d.ts +235 -0
- package/dist/virtual-fs.adapter-BBLS-3AY.d.ts +26 -0
- package/dist/virtual-fs.adapter-nb0CTYOj.d.cts +26 -0
- package/dist/workflow/index.cjs +9 -0
- package/dist/workflow/index.cjs.map +1 -0
- package/dist/workflow/index.d.cts +62 -0
- package/dist/workflow/index.d.ts +62 -0
- package/dist/workflow/index.js +9 -0
- package/dist/workflow/index.js.map +1 -0
- package/dist/workflow.port-BaCttxrw.d.cts +153 -0
- package/dist/workflow.port-BaCttxrw.d.ts +153 -0
- package/package.json +230 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/domain/graph.schema.ts","../src/graph/agent-node.ts","../src/graph/priority-queue.ts","../src/graph/worker-pool.ts","../src/graph/async-channel.ts","../src/graph/incremental-ready-tracker.ts","../src/graph/token-budget-controller.ts","../src/graph/fork-coordinator.ts","../src/graph/graph-executor.ts","../src/graph/shared-context.ts","../src/graph/agent-graph.ts"],"sourcesContent":["// =============================================================================\n// Graph Schema ā Configuration & result types for AgentGraph\n// =============================================================================\n\nimport { z } from \"zod\";\n\nexport const GraphConfigSchema = z.object({\n maxDepth: z.number().default(10),\n maxConcurrency: z.number().default(5),\n timeoutMs: z.number().default(600_000),\n maxTokenBudget: z.number().default(1_000_000),\n});\n\nexport type GraphConfig = z.infer<typeof GraphConfigSchema>;\n\nexport const NodeConfigSchema = z.object({\n id: z.string(),\n type: z.enum([\"agent\", \"graph\"]),\n});\n\nexport type NodeConfig = z.infer<typeof NodeConfigSchema>;\n\nexport const NodeResultSchema = z.object({\n nodeId: z.string(),\n output: z.string(),\n tokenUsage: z\n .object({\n input: z.number(),\n output: z.number(),\n })\n .optional(),\n durationMs: z.number(),\n});\n\nexport type NodeResultValue = z.infer<typeof NodeResultSchema>;\n\nexport const GraphResultSchema = z.object({\n output: z.string(),\n nodeResults: z.record(z.string(), NodeResultSchema),\n totalDurationMs: z.number(),\n totalTokenUsage: z.object({\n input: z.number(),\n output: z.number(),\n }),\n});\n\nexport type GraphResult = z.infer<typeof GraphResultSchema>;\n\nexport type GraphStreamEvent =\n | { type: \"graph:start\"; nodeCount: number }\n | { type: \"node:start\"; nodeId: string }\n | { type: \"node:complete\"; nodeId: string; result: NodeResultValue }\n | { type: \"node:error\"; nodeId: string; error: string }\n | { type: \"fork:start\"; forkId: string; agentCount: number }\n | { type: \"fork:complete\"; forkId: string; results: NodeResultValue[] }\n | { type: \"fork:partial\"; forkId: string; completedCount: number; totalCount: number; partialResults: NodeResultValue[] }\n | { type: \"consensus:start\"; forkId: string }\n | { type: \"consensus:result\"; forkId: string; output: string }\n | { type: \"graph:complete\"; result: GraphResult }\n | { type: \"graph:error\"; error: string; partialResults: Record<string, NodeResultValue> }\n | { type: \"pool:metrics\"; metrics: { activeWorkers: number; idleWorkers: number; queueDepth: number; totalCompleted: number; totalFailed: number } }\n | { type: \"budget:warning\"; remaining: number; used: number; threshold: \"soft\" | \"hard\" }\n | { type: \"backpressure:active\"; queueDepth: number; action: \"slowdown\" | \"pause\" }\n | { type: \"checkpoint:saved\"; checkpoint: string; completedCount: number }\n | { type: \"node:throttled\"; nodeId: string; delayMs: number; reason: string }\n | { type: \"node:scheduled\"; nodeId: string; queuePosition: number };\n","// =============================================================================\n// AgentNode ā Wraps a Agent or nested AgentGraph for graph execution\n// =============================================================================\n\nimport type { AgentConfig } from \"../types.js\";\nimport type { GraphConfig } from \"../domain/graph.schema.js\";\nimport type { SharedContext } from \"./shared-context.js\";\nimport type { AgentGraph } from \"./agent-graph.js\";\nimport { Agent } from \"../agent/agent.js\";\n\nexport interface AgentNodeConfig {\n id: string;\n type: \"agent\" | \"graph\";\n agentConfig?: AgentConfig;\n graph?: AgentGraph;\n overrides?: Partial<GraphConfig>;\n}\n\nexport interface NodeResult {\n nodeId: string;\n output: string;\n tokenUsage?: { input: number; output: number };\n durationMs: number;\n}\n\nexport class AgentNode {\n readonly id: string;\n readonly type: \"agent\" | \"graph\";\n private readonly config: AgentNodeConfig;\n\n constructor(config: AgentNodeConfig) {\n this.id = config.id;\n this.type = config.type;\n this.config = config;\n }\n\n async run(prompt: string, sharedContext: SharedContext): Promise<NodeResult> {\n const start = Date.now();\n\n if (this.config.type === \"graph\" && this.config.graph) {\n const graphResult = await this.config.graph.run(prompt);\n const result: NodeResult = {\n nodeId: this.id,\n output: graphResult.output,\n tokenUsage: graphResult.totalTokenUsage,\n durationMs: Date.now() - start,\n };\n await sharedContext.setNodeResult(this.id, result.output);\n return result;\n }\n\n if (!this.config.agentConfig) {\n throw new Error(`Node \"${this.id}\" has no agentConfig or graph`);\n }\n\n const agent = Agent.minimal(this.config.agentConfig);\n try {\n const agentResult = await agent.run(prompt);\n\n const result: NodeResult = {\n nodeId: this.id,\n output: agentResult.text,\n durationMs: Date.now() - start,\n };\n await sharedContext.setNodeResult(this.id, result.output);\n return result;\n } finally {\n await agent.dispose();\n }\n }\n}\n","// =============================================================================\n// PriorityQueue<T> ā Binary heap with custom comparator\n// =============================================================================\n\nexport class PriorityQueue<T> {\n private readonly heap: T[] = [];\n private readonly compare: (a: T, b: T) => number;\n\n constructor(compare: (a: T, b: T) => number) {\n this.compare = compare;\n }\n\n get size(): number {\n return this.heap.length;\n }\n\n enqueue(item: T): void {\n this.heap.push(item);\n this.bubbleUp(this.heap.length - 1);\n }\n\n dequeue(): T | undefined {\n if (this.heap.length === 0) return undefined;\n const top = this.heap[0];\n const last = this.heap.pop()!;\n if (this.heap.length > 0) {\n this.heap[0] = last;\n this.sinkDown(0);\n }\n return top;\n }\n\n peek(): T | undefined {\n return this.heap[0];\n }\n\n private bubbleUp(i: number): void {\n while (i > 0) {\n const parent = (i - 1) >> 1;\n if (this.compare(this.heap[i], this.heap[parent]) >= 0) break;\n [this.heap[i], this.heap[parent]] = [this.heap[parent], this.heap[i]];\n i = parent;\n }\n }\n\n private sinkDown(i: number): void {\n const n = this.heap.length;\n while (true) {\n let smallest = i;\n const left = 2 * i + 1;\n const right = 2 * i + 2;\n if (left < n && this.compare(this.heap[left], this.heap[smallest]) < 0) {\n smallest = left;\n }\n if (right < n && this.compare(this.heap[right], this.heap[smallest]) < 0) {\n smallest = right;\n }\n if (smallest === i) break;\n [this.heap[i], this.heap[smallest]] = [this.heap[smallest], this.heap[i]];\n i = smallest;\n }\n }\n}\n","// =============================================================================\n// WorkerPool<T, R> ā Generic async work-stealing pool with dynamic sizing\n// =============================================================================\n\nimport { PriorityQueue } from './priority-queue.js';\n\n// āā Types āāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāā\n\nexport interface WorkerPoolConfig {\n initialSize: number;\n minSize: number;\n maxSize: number;\n taskTimeoutMs: number;\n heartbeatIntervalMs: number;\n idleShrinkMs: number;\n growThreshold: number;\n}\n\nexport interface WorkerPoolMetrics {\n activeWorkers: number;\n idleWorkers: number;\n queueDepth: number;\n totalCompleted: number;\n totalFailed: number;\n throughputPerSecond: number;\n latencyP50Ms: number;\n latencyP95Ms: number;\n latencyP99Ms: number;\n utilizationRatio: number;\n workStealCount: number;\n}\n\nexport type WorkerPoolEvent<T, R> =\n | { type: 'task:started'; taskId: string; workerId: number }\n | { type: 'task:completed'; taskId: string; result: R; durationMs: number }\n | { type: 'task:failed'; taskId: string; error: Error; durationMs: number }\n | { type: 'task:timeout'; taskId: string; workerId: number }\n | { type: 'worker:spawned'; workerId: number; poolSize: number }\n | { type: 'worker:removed'; workerId: number; poolSize: number; reason: string }\n | { type: 'pool:drained' }\n | { type: 'pool:pressure'; queueDepth: number; activeWorkers: number };\n\ninterface PoolTask<T, R = unknown> {\n readonly id: string;\n readonly input: T;\n readonly priority: number;\n readonly enqueuedAt: number;\n readonly abortController: AbortController;\n readonly resolve: (result: R | PromiseLike<R>) => void;\n readonly reject: (error: Error) => void;\n}\n\ntype WorkerState = 'idle' | 'busy' | 'dead';\n\ninterface WorkerSlot<T, R = unknown> {\n state: WorkerState;\n currentTask: PoolTask<T, R> | null;\n idleSince: number;\n wakeResolve: (() => void) | null;\n}\n\n// āā Defaults āāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāā\n\nconst DEFAULT_POOL_CONFIG: WorkerPoolConfig = {\n initialSize: 4,\n minSize: 1,\n maxSize: 16,\n taskTimeoutMs: 60_000,\n heartbeatIntervalMs: 5_000,\n idleShrinkMs: 30_000,\n growThreshold: 3,\n};\n\n// āā Implementation āāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāā\n\nexport class WorkerPool<T, R> {\n private readonly queue: PriorityQueue<PoolTask<T, R>>;\n private readonly workers = new Map<number, WorkerSlot<T, R>>();\n private readonly executor: (input: T, signal: AbortSignal) => Promise<R>;\n private readonly config: WorkerPoolConfig;\n private readonly onEvent?: (event: WorkerPoolEvent<T, R>) => void;\n private readonly latencies: number[] = [];\n private readonly completionTimestamps: number[] = [];\n private static readonly MAX_METRICS_ENTRIES = 1000;\n\n private nextWorkerId = 0;\n private draining = false;\n private drainingResolve?: () => void;\n private heartbeatTimer: ReturnType<typeof setInterval> | null = null;\n private totalCompleted = 0;\n private totalFailed = 0;\n private workStealCount = 0;\n\n constructor(\n executor: (input: T, signal: AbortSignal) => Promise<R>,\n config?: Partial<WorkerPoolConfig>,\n onEvent?: (event: WorkerPoolEvent<T, R>) => void,\n ) {\n this.executor = executor;\n this.config = { ...DEFAULT_POOL_CONFIG, ...config };\n this.onEvent = onEvent;\n this.queue = new PriorityQueue<PoolTask<T, R>>(\n (a, b) => a.priority - b.priority,\n );\n\n for (let i = 0; i < this.config.initialSize; i++) {\n this.spawnWorker();\n }\n this.startHeartbeatMonitor();\n }\n\n // āā Public API āāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāā\n\n submit(id: string, input: T, priority = 0): Promise<R> {\n if (this.draining) throw new Error('Pool is draining, cannot submit');\n\n return new Promise<R>((resolve, reject) => {\n const task: PoolTask<T, R> = {\n id,\n input,\n priority,\n enqueuedAt: Date.now(),\n abortController: new AbortController(),\n resolve,\n reject,\n };\n\n this.queue.enqueue(task);\n this.wakeOneIdleWorker();\n });\n }\n\n async drain(timeoutMs = 30_000): Promise<void> {\n this.draining = true;\n\n if (this.allIdle() && this.queue.size === 0) {\n this.cleanup();\n this.emit({ type: 'pool:drained' });\n return;\n }\n\n return new Promise<void>((resolve, reject) => {\n this.drainingResolve = () => {\n this.cleanup();\n this.emit({ type: 'pool:drained' });\n resolve();\n };\n\n const timer = setTimeout(() => {\n for (const [, slot] of this.workers) {\n slot.currentTask?.abortController.abort(\n new Error('Pool drain timeout'),\n );\n slot.state = 'dead';\n if (slot.wakeResolve) {\n slot.wakeResolve();\n slot.wakeResolve = null;\n }\n }\n this.cleanup();\n reject(new Error(`Drain timeout after ${timeoutMs}ms`));\n }, timeoutMs);\n\n const originalResolve = this.drainingResolve!;\n this.drainingResolve = () => {\n clearTimeout(timer);\n originalResolve();\n };\n\n // Wake all idle workers so they can detect drain\n for (const [, slot] of this.workers) {\n if (slot.state === 'idle' && slot.wakeResolve) {\n slot.wakeResolve();\n slot.wakeResolve = null;\n }\n }\n });\n }\n\n getMetrics(): WorkerPoolMetrics {\n let active = 0;\n let idle = 0;\n for (const slot of this.workers.values()) {\n if (slot.state === 'busy') active++;\n else if (slot.state === 'idle') idle++;\n }\n\n const now = Date.now();\n const windowMs = 60_000;\n const recentCompletions = this.completionTimestamps.filter(\n (t) => now - t < windowMs,\n );\n\n const sorted = [...this.latencies].sort((a, b) => a - b);\n const p = (pct: number) => {\n if (sorted.length === 0) return 0;\n const idx = Math.min(\n Math.floor((pct / 100) * sorted.length),\n sorted.length - 1,\n );\n return sorted[idx];\n };\n\n return {\n activeWorkers: active,\n idleWorkers: idle,\n queueDepth: this.queue.size,\n totalCompleted: this.totalCompleted,\n totalFailed: this.totalFailed,\n throughputPerSecond:\n recentCompletions.length > 0\n ? recentCompletions.length / (windowMs / 1000)\n : 0,\n latencyP50Ms: p(50),\n latencyP95Ms: p(95),\n latencyP99Ms: p(99),\n utilizationRatio:\n this.workers.size > 0 ? active / this.workers.size : 0,\n workStealCount: this.workStealCount,\n };\n }\n\n // āā Worker lifecycle āāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāā\n\n private spawnWorker(): void {\n const id = this.nextWorkerId++;\n const slot: WorkerSlot<T, R> = {\n state: 'idle',\n currentTask: null,\n idleSince: Date.now(),\n wakeResolve: null,\n };\n this.workers.set(id, slot);\n this.emit({\n type: 'worker:spawned',\n workerId: id,\n poolSize: this.workers.size,\n });\n // Fire-and-forget the worker loop\n this.workerLoop(id).catch(() => { /* worker loop self-recovers */ });\n }\n\n private removeWorker(id: number, reason: string): void {\n const slot = this.workers.get(id);\n if (!slot) return;\n slot.state = 'dead';\n if (slot.wakeResolve) {\n slot.wakeResolve();\n slot.wakeResolve = null;\n }\n this.workers.delete(id);\n this.emit({\n type: 'worker:removed',\n workerId: id,\n poolSize: this.workers.size,\n reason,\n });\n }\n\n private async workerLoop(workerId: number): Promise<void> {\n const slot = this.workers.get(workerId)!;\n\n while (slot.state !== 'dead') {\n const task = this.queue.dequeue();\n\n if (!task) {\n slot.state = 'idle';\n slot.idleSince = Date.now();\n\n if (this.draining && this.allIdle() && this.queue.size === 0) {\n this.drainingResolve?.();\n return;\n }\n\n // Park until woken\n await new Promise<void>((resolve) => {\n slot.wakeResolve = resolve;\n });\n\n if ((slot.state as WorkerState) === 'dead') return;\n continue;\n }\n\n // Work-stealing: took a task from the shared queue\n this.workStealCount++;\n slot.state = 'busy';\n slot.currentTask = task;\n\n this.emit({ type: 'task:started', taskId: task.id, workerId });\n const startMs = Date.now();\n\n try {\n const result = await this.executeWithTimeout(task, workerId);\n const durationMs = Date.now() - startMs;\n\n this.latencies.push(durationMs);\n this.completionTimestamps.push(Date.now());\n if (this.latencies.length > WorkerPool.MAX_METRICS_ENTRIES) {\n this.latencies.splice(0, this.latencies.length - WorkerPool.MAX_METRICS_ENTRIES);\n }\n if (this.completionTimestamps.length > WorkerPool.MAX_METRICS_ENTRIES) {\n this.completionTimestamps.splice(0, this.completionTimestamps.length - WorkerPool.MAX_METRICS_ENTRIES);\n }\n this.totalCompleted++;\n\n this.emit({\n type: 'task:completed',\n taskId: task.id,\n result,\n durationMs,\n });\n task.resolve(result);\n } catch (error) {\n const durationMs = Date.now() - startMs;\n this.latencies.push(durationMs);\n this.totalFailed++;\n\n const err =\n error instanceof Error ? error : new Error(String(error));\n this.emit({\n type: 'task:failed',\n taskId: task.id,\n error: err,\n durationMs,\n });\n task.reject(err);\n } finally {\n slot.currentTask = null;\n }\n }\n }\n\n private executeWithTimeout(\n task: PoolTask<T, R>,\n workerId: number,\n ): Promise<R> {\n return new Promise<R>((resolve, reject) => {\n let settled = false;\n const timer = setTimeout(() => {\n if (!settled) {\n settled = true;\n task.abortController.abort(\n new Error(`Task timeout after ${this.config.taskTimeoutMs}ms`),\n );\n this.emit({\n type: 'task:timeout',\n taskId: task.id,\n workerId,\n });\n reject(\n new Error(`Task \"${task.id}\" timed out after ${this.config.taskTimeoutMs}ms`),\n );\n }\n }, this.config.taskTimeoutMs);\n\n this.executor(task.input, task.abortController.signal).then(\n (result) => {\n if (!settled) {\n settled = true;\n clearTimeout(timer);\n resolve(result);\n }\n },\n (error) => {\n if (!settled) {\n settled = true;\n clearTimeout(timer);\n reject(error);\n }\n },\n );\n });\n }\n\n // āā Autoscaling āāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāā\n\n private autoscale(): void {\n const now = Date.now();\n let active = 0;\n let idle = 0;\n for (const slot of this.workers.values()) {\n if (slot.state === 'busy') active++;\n else if (slot.state === 'idle') idle++;\n }\n\n // Grow: deep queue + all busy\n if (\n this.queue.size > this.config.growThreshold &&\n idle === 0 &&\n this.workers.size < this.config.maxSize\n ) {\n const toAdd = Math.min(\n Math.ceil(this.queue.size / 2),\n this.config.maxSize - this.workers.size,\n );\n for (let i = 0; i < toAdd; i++) this.spawnWorker();\n }\n\n // Shrink: excess idle workers\n if (idle > 1 && this.workers.size > this.config.minSize) {\n for (const [id, slot] of this.workers) {\n if (\n slot.state === 'idle' &&\n now - slot.idleSince > this.config.idleShrinkMs &&\n this.workers.size > this.config.minSize\n ) {\n this.removeWorker(id, 'idle-timeout');\n }\n }\n }\n }\n\n // āā Health monitoring āāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāā\n\n private startHeartbeatMonitor(): void {\n this.heartbeatTimer = setInterval(() => {\n this.autoscale();\n }, this.config.heartbeatIntervalMs);\n }\n\n // āā Helpers āāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāā\n\n private wakeOneIdleWorker(): void {\n for (const [, slot] of this.workers) {\n if (slot.state === 'idle' && slot.wakeResolve) {\n slot.wakeResolve();\n slot.wakeResolve = null;\n return;\n }\n }\n }\n\n private allIdle(): boolean {\n for (const slot of this.workers.values()) {\n if (slot.state === 'busy') return false;\n }\n return true;\n }\n\n private emit(event: WorkerPoolEvent<T, R>): void {\n this.onEvent?.(event);\n }\n\n private cleanup(): void {\n if (this.heartbeatTimer) {\n clearInterval(this.heartbeatTimer);\n this.heartbeatTimer = null;\n }\n for (const [id] of this.workers) {\n const slot = this.workers.get(id)!;\n slot.state = 'dead';\n if (slot.wakeResolve) {\n slot.wakeResolve();\n slot.wakeResolve = null;\n }\n }\n }\n}\n","// =============================================================================\n// AsyncChannel<T> ā Push-to-pull bridge implementing AsyncIterable\n// =============================================================================\n\nexport class AsyncChannel<T> implements AsyncIterable<T> {\n private buffer: T[] = [];\n private waiters: Array<{\n resolve: (value: IteratorResult<T>) => void;\n }> = [];\n private closed = false;\n\n push(value: T): void {\n if (this.closed) return;\n\n if (this.waiters.length > 0) {\n const waiter = this.waiters.shift()!;\n waiter.resolve({ value, done: false });\n } else {\n this.buffer.push(value);\n }\n }\n\n close(): void {\n if (this.closed) return;\n this.closed = true;\n for (const waiter of this.waiters) {\n waiter.resolve({ value: undefined as unknown as T, done: true });\n }\n this.waiters = [];\n }\n\n get isClosed(): boolean {\n return this.closed;\n }\n\n [Symbol.asyncIterator](): AsyncIterator<T> {\n return {\n next: (): Promise<IteratorResult<T>> => {\n if (this.buffer.length > 0) {\n return Promise.resolve({ value: this.buffer.shift()!, done: false });\n }\n if (this.closed) {\n return Promise.resolve({\n value: undefined as unknown as T,\n done: true,\n });\n }\n return new Promise<IteratorResult<T>>((resolve) => {\n this.waiters.push({ resolve });\n });\n },\n };\n }\n}\n","// =============================================================================\n// IncrementalReadyTracker ā Incremental Kahn's algorithm\n// =============================================================================\n\nexport class IncrementalReadyTracker {\n /** nodeId ā number of pending (uncompleted) dependencies */\n private readonly pendingDeps: Map<string, number>;\n /** nodeId ā list of successor nodeIds (reverse edges) */\n private readonly successors: Map<string, string[]>;\n /** Callback invoked when a node becomes ready (all deps satisfied) */\n private readonly onReady: (nodeId: string) => void;\n\n constructor(\n edges: ReadonlyMap<string, readonly string[]>,\n allNodeIds: Iterable<string>,\n onReady: (nodeId: string) => void,\n ) {\n this.onReady = onReady;\n this.pendingDeps = new Map();\n this.successors = new Map();\n\n // Build reverse graph + dependency counts\n for (const nodeId of allNodeIds) {\n const deps = edges.get(nodeId) ?? [];\n this.pendingDeps.set(nodeId, deps.length);\n\n for (const dep of deps) {\n let succ = this.successors.get(dep);\n if (!succ) {\n succ = [];\n this.successors.set(dep, succ);\n }\n succ.push(nodeId);\n }\n }\n }\n\n /** Emit all nodes with zero dependencies */\n seedInitialReady(): void {\n for (const [nodeId, count] of this.pendingDeps) {\n if (count === 0) {\n this.onReady(nodeId);\n }\n }\n }\n\n /** Mark a node as completed; returns list of newly-ready successors */\n markCompleted(nodeId: string): string[] {\n const newlyReady: string[] = [];\n const succs = this.successors.get(nodeId) ?? [];\n\n for (const succ of succs) {\n const remaining = this.pendingDeps.get(succ)! - 1;\n this.pendingDeps.set(succ, remaining);\n\n if (remaining === 0) {\n newlyReady.push(succ);\n this.onReady(succ);\n }\n }\n\n return newlyReady;\n }\n\n /** Snapshot current pending-deps state for checkpoint */\n snapshot(): Map<string, number> {\n return new Map(this.pendingDeps);\n }\n\n /** Restore from a previously taken snapshot */\n restoreFrom(snap: Map<string, number>): void {\n for (const [k, v] of snap) {\n this.pendingDeps.set(k, v);\n }\n }\n}\n","// =============================================================================\n// TokenBudgetController ā Acquire/release budget with rolling estimation\n// =============================================================================\n\nexport type BudgetStatus = 'ok' | 'soft-limit' | 'hard-limit';\n\nexport interface TokenBudgetControllerConfig {\n totalBudget: number;\n /** Fraction of budget triggering soft-limit (default 0.8) */\n softLimitRatio: number;\n /** Fraction of budget triggering hard-limit (default 0.95) */\n hardLimitRatio: number;\n /** Estimated tokens per node for pre-allocation (default 5000) */\n estimatedTokensPerNode: number;\n}\n\nconst DEFAULT_BUDGET_CONFIG: Omit<TokenBudgetControllerConfig, 'totalBudget'> = {\n softLimitRatio: 0.8,\n hardLimitRatio: 0.95,\n estimatedTokensPerNode: 5_000,\n};\n\nexport class TokenBudgetController {\n private readonly config: TokenBudgetControllerConfig;\n private reserved = 0;\n private consumed = 0;\n private readonly recentUsages: number[] = [];\n\n constructor(\n totalBudget: number,\n config?: Partial<Omit<TokenBudgetControllerConfig, 'totalBudget'>>,\n ) {\n this.config = { ...DEFAULT_BUDGET_CONFIG, totalBudget, ...config };\n }\n\n /**\n * Reserve budget BEFORE executing a node.\n * Returns whether it was granted and an optional throttle delay.\n */\n acquire(_nodeId: string): { granted: boolean; delayMs: number } {\n const estimated = this.config.estimatedTokensPerNode;\n const projected = this.consumed + this.reserved + estimated;\n const ratio = projected / this.config.totalBudget;\n\n if (ratio > this.config.hardLimitRatio) {\n return { granted: false, delayMs: 0 };\n }\n\n if (ratio > this.config.softLimitRatio) {\n const pressure =\n (ratio - this.config.softLimitRatio) /\n (this.config.hardLimitRatio - this.config.softLimitRatio);\n const delayMs = Math.round(pressure * 5_000);\n this.reserved += estimated;\n return { granted: true, delayMs };\n }\n\n this.reserved += estimated;\n return { granted: true, delayMs: 0 };\n }\n\n /**\n * Finalize actual consumption. Moves tokens from reserved to consumed.\n */\n release(actual: { input: number; output: number }): void {\n this.reserved = Math.max(\n 0,\n this.reserved - this.config.estimatedTokensPerNode,\n );\n this.consumed += actual.input + actual.output;\n this.updateEstimate(actual.input + actual.output);\n }\n\n /** Check current budget status without reserving */\n check(usage: { input: number; output: number }): BudgetStatus {\n const total = usage.input + usage.output;\n const ratio = total / this.config.totalBudget;\n if (ratio >= this.config.hardLimitRatio) return 'hard-limit';\n if (ratio >= this.config.softLimitRatio) return 'soft-limit';\n return 'ok';\n }\n\n /** Remaining budget (total - consumed - reserved) */\n remaining(): number {\n return Math.max(\n 0,\n this.config.totalBudget - this.consumed - this.reserved,\n );\n }\n\n /** Estimated number of nodes that can still execute */\n estimatedRemainingNodes(): number {\n return Math.floor(this.remaining() / this.config.estimatedTokensPerNode);\n }\n\n /** Rolling average of last N executions to refine estimates */\n private updateEstimate(actual: number): void {\n this.recentUsages.push(actual);\n if (this.recentUsages.length > 20) this.recentUsages.shift();\n this.config.estimatedTokensPerNode = Math.ceil(\n this.recentUsages.reduce((a, b) => a + b, 0) / this.recentUsages.length,\n );\n }\n}\n","// =============================================================================\n// ForkCoordinator ā Manages parallel fork execution with partial results\n// =============================================================================\n\nimport type { NodeResult } from \"./agent-node.js\";\n\nexport class ForkCoordinator {\n private readonly results = new Map<string, NodeResult>();\n private readonly errors = new Map<string, Error>();\n private readonly total: number;\n private resolveAll!: (results: NodeResult[]) => void;\n private rejectAll!: (error: Error) => void;\n readonly promise: Promise<NodeResult[]>;\n private timeoutTimer?: ReturnType<typeof setTimeout>;\n private settled = false;\n\n constructor(\n private readonly forkId: string,\n nodeIds: string[],\n timeoutMs: number,\n private readonly minResults: number,\n private readonly onPartial?: (results: NodeResult[]) => void,\n ) {\n this.total = nodeIds.length;\n this.promise = new Promise((resolve, reject) => {\n this.resolveAll = resolve;\n this.rejectAll = reject;\n });\n\n this.timeoutTimer = setTimeout(() => {\n if (this.settled) return;\n if (this.results.size >= this.minResults) {\n this.settle();\n this.resolveAll([...this.results.values()]);\n } else {\n this.settle();\n this.rejectAll(\n new Error(\n `Fork \"${forkId}\" timeout: only ${this.results.size}/${this.total} ` +\n `completed (minimum: ${this.minResults})`,\n ),\n );\n }\n }, timeoutMs);\n }\n\n onNodeComplete(nodeId: string, result: NodeResult): void {\n if (this.settled) return;\n this.results.set(nodeId, result);\n this.onPartial?.([...this.results.values()]);\n\n if (this.results.size === this.total) {\n this.settle();\n this.resolveAll([...this.results.values()]);\n } else {\n this.tryEagerResolve();\n }\n }\n\n onNodeError(nodeId: string, error: Error): void {\n if (this.settled) return;\n this.errors.set(nodeId, error);\n\n if (this.errors.size > this.total - this.minResults) {\n this.settle();\n this.rejectAll(\n new Error(\n `Fork \"${this.forkId}\": too many failures (${this.errors.size}/${this.total})`,\n ),\n );\n } else {\n this.tryEagerResolve();\n }\n }\n\n /** Eagerly resolve when all nodes reported and we have enough successes */\n private tryEagerResolve(): void {\n if (this.settled) return;\n if (this.results.size + this.errors.size === this.total && this.results.size >= this.minResults) {\n this.settle();\n this.resolveAll([...this.results.values()]);\n }\n }\n\n dispose(): void {\n this.settle();\n }\n\n private settle(): void {\n if (this.settled) return;\n this.settled = true;\n if (this.timeoutTimer) {\n clearTimeout(this.timeoutTimer);\n this.timeoutTimer = undefined;\n }\n }\n}\n","// =============================================================================\n// GraphExecutor ā Reactive, event-driven DAG execution engine\n// Uses WorkerPool (work-stealing), IncrementalReadyTracker (push-based),\n// AsyncChannel (callbackāAsyncGenerator bridge), and TokenBudgetController.\n// =============================================================================\n\nimport type { GraphConfig, GraphResult, GraphStreamEvent } from \"../domain/graph.schema.js\";\nimport type { ConsensusPort } from \"../ports/consensus.port.js\";\nimport type { NodeResult } from \"./agent-node.js\";\nimport type { AgentNode } from \"./agent-node.js\";\nimport type { SharedContext } from \"./shared-context.js\";\nimport type { EventBus } from \"../agent/event-bus.js\";\nimport type { TelemetryPort } from \"../ports/telemetry.port.js\";\nimport { WorkerPool } from \"./worker-pool.js\";\nimport { AsyncChannel } from \"./async-channel.js\";\nimport { IncrementalReadyTracker } from \"./incremental-ready-tracker.js\";\nimport { TokenBudgetController } from \"./token-budget-controller.js\";\nimport { ForkCoordinator } from \"./fork-coordinator.js\";\n\ninterface NodeTask {\n nodeId: string;\n prompt: string;\n}\n\nexport interface GraphCheckpoint {\n completedNodes: Map<string, NodeResult>;\n pendingDepsSnapshot: Map<string, number>;\n tokenUsage: { input: number; output: number };\n elapsedMs: number;\n prompt: string;\n}\n\nexport class GraphExecutor {\n private static readonly CHECKPOINT_INTERVAL = 5;\n\n constructor(\n private readonly nodes: Map<string, AgentNode>,\n private readonly edges: Map<string, string[]>,\n private readonly forks: Map<\n string,\n { nodes: AgentNode[]; consensus?: ConsensusPort }\n >,\n private readonly config: GraphConfig,\n private readonly sharedContext: SharedContext,\n private readonly eventBus?: EventBus,\n private readonly telemetry?: TelemetryPort,\n ) {}\n\n async execute(prompt: string): Promise<GraphResult> {\n let result: GraphResult | undefined;\n for await (const event of this.stream(prompt)) {\n if (event.type === \"graph:complete\") {\n result = event.result;\n }\n if (event.type === \"graph:error\") {\n throw new Error(event.error);\n }\n }\n if (!result) throw new Error(\"Graph execution produced no result\");\n return result;\n }\n\n async *stream(prompt: string): AsyncGenerator<GraphStreamEvent> {\n const start = Date.now();\n const nodeResults = new Map<string, NodeResult>();\n let totalInput = 0;\n let totalOutput = 0;\n let completedCount = 0;\n const totalNodes = this.nodes.size;\n let terminated = false;\n\n const channel = new AsyncChannel<GraphStreamEvent>();\n const budgetCtrl = new TokenBudgetController(this.config.maxTokenBudget);\n\n // āā WorkerPool with executor closure āā\n const pool = new WorkerPool<NodeTask, NodeResult>(\n async (task: NodeTask, signal: AbortSignal): Promise<NodeResult> => {\n const { nodeId } = task;\n this.eventBus?.emit(\"node:start\", { nodeId });\n channel.push({ type: \"node:start\", nodeId });\n const nodeSpan = this.telemetry?.startSpan(\n `graph.node.${nodeId}`,\n { \"node.id\": nodeId },\n );\n\n try {\n const fork = this.forks.get(nodeId);\n if (fork) {\n const result = await this.executeForkTask(\n nodeId, prompt, fork, nodeResults, channel,\n );\n nodeSpan?.setAttribute(\"node.duration_ms\", result.durationMs);\n nodeSpan?.setStatus(\"OK\");\n return result;\n }\n\n const node = this.nodes.get(nodeId);\n if (!node) throw new Error(`Node \"${nodeId}\" not found`);\n\n const enrichedPrompt = this.buildNodePrompt(prompt, nodeId, nodeResults);\n const result = await node.run(enrichedPrompt, this.sharedContext);\n nodeSpan?.setAttribute(\"node.duration_ms\", result.durationMs);\n nodeSpan?.setStatus(\"OK\");\n return result;\n } catch (error) {\n const errorMsg = error instanceof Error ? error.message : String(error);\n nodeSpan?.setStatus(\"ERROR\", errorMsg);\n throw error;\n } finally {\n nodeSpan?.end();\n }\n },\n {\n initialSize: this.config.maxConcurrency,\n minSize: 1,\n maxSize: this.config.maxConcurrency,\n taskTimeoutMs: 600_000,\n heartbeatIntervalMs: 60_000,\n idleShrinkMs: 30_000,\n growThreshold: 10,\n },\n );\n\n const emitError = (errorMsg: string) => {\n if (terminated) return;\n terminated = true;\n const partialResults: Record<string, NodeResult> = {};\n for (const [id, r] of nodeResults) {\n partialResults[id] = r;\n }\n this.eventBus?.emit(\"graph:complete\", {\n totalDurationMs: Date.now() - start,\n totalTokenUsage: { input: totalInput, output: totalOutput },\n error: errorMsg,\n });\n channel.push({ type: \"graph:error\", error: errorMsg, partialResults });\n channel.close();\n };\n\n const emitCompletion = () => {\n if (terminated) return;\n terminated = true;\n const lastNodeId = this.findTerminalNode();\n const lastResult = nodeResults.get(lastNodeId)!;\n const resultMap: Record<string, NodeResult> = {};\n for (const [id, r] of nodeResults) {\n resultMap[id] = r;\n }\n const result: GraphResult = {\n output: lastResult.output,\n nodeResults: resultMap,\n totalDurationMs: Date.now() - start,\n totalTokenUsage: { input: totalInput, output: totalOutput },\n };\n this.eventBus?.emit(\"graph:complete\", {\n totalDurationMs: result.totalDurationMs,\n totalTokenUsage: result.totalTokenUsage,\n });\n channel.push({ type: \"graph:complete\", result });\n channel.close();\n };\n\n // āā IncrementalReadyTracker: push-based scheduling āā\n const tracker = new IncrementalReadyTracker(\n this.edges,\n this.nodes.keys(),\n (nodeId: string) => {\n if (nodeResults.has(nodeId) || terminated) return;\n\n pool\n .submit(nodeId, { nodeId, prompt }, 0)\n .then((result) => {\n if (terminated) return;\n nodeResults.set(result.nodeId, result);\n completedCount++;\n\n if (result.tokenUsage) {\n totalInput += result.tokenUsage.input;\n totalOutput += result.tokenUsage.output;\n budgetCtrl.release(result.tokenUsage);\n }\n\n this.eventBus?.emit(\"node:complete\", { nodeId, result });\n channel.push({ type: \"node:complete\", nodeId, result });\n\n // Budget enforcement\n if (totalInput + totalOutput > this.config.maxTokenBudget) {\n emitError(\"Token budget exceeded\");\n return;\n }\n\n // Budget soft/hard warnings\n const budgetStatus = budgetCtrl.check({ input: totalInput, output: totalOutput });\n if (budgetStatus === \"soft-limit\") {\n channel.push({\n type: \"budget:warning\",\n remaining: budgetCtrl.remaining(),\n used: totalInput + totalOutput,\n threshold: \"soft\",\n });\n } else if (budgetStatus === \"hard-limit\") {\n channel.push({\n type: \"budget:warning\",\n remaining: budgetCtrl.remaining(),\n used: totalInput + totalOutput,\n threshold: \"hard\",\n });\n }\n\n // Checkpoint every N nodes\n if (\n completedCount % GraphExecutor.CHECKPOINT_INTERVAL === 0 &&\n completedCount < totalNodes\n ) {\n const cp: GraphCheckpoint = {\n completedNodes: new Map(nodeResults),\n pendingDepsSnapshot: tracker.snapshot(),\n tokenUsage: { input: totalInput, output: totalOutput },\n elapsedMs: Date.now() - start,\n prompt,\n };\n channel.push({\n type: \"checkpoint:saved\",\n checkpoint: JSON.stringify({\n completedNodeIds: [...cp.completedNodes.keys()],\n tokenUsage: cp.tokenUsage,\n elapsedMs: cp.elapsedMs,\n }),\n completedCount,\n });\n }\n\n // Trigger successors via tracker (push-based)\n tracker.markCompleted(nodeId);\n\n // Check completion\n if (completedCount === totalNodes) {\n emitCompletion();\n }\n })\n .catch((error) => {\n if (terminated) return;\n const errorMsg =\n error instanceof Error ? error.message : String(error);\n this.eventBus?.emit(\"node:complete\", { nodeId, error: errorMsg });\n channel.push({ type: \"node:error\", nodeId, error: errorMsg });\n emitError(errorMsg);\n });\n },\n );\n\n this.eventBus?.emit(\"graph:start\", { nodeCount: totalNodes });\n yield { type: \"graph:start\", nodeCount: totalNodes };\n\n // Seed nodes with zero dependencies\n tracker.seedInitialReady();\n\n // Deadlock detection: if no nodes were seeded and graph isn't empty\n if (completedCount === 0 && totalNodes > 0 && terminated === false) {\n // Check if any node has zero deps (should have been seeded)\n let hasZeroDeps = false;\n for (const nodeId of this.nodes.keys()) {\n const deps = this.edges.get(nodeId) ?? [];\n if (deps.length === 0) {\n hasZeroDeps = true;\n break;\n }\n }\n if (!hasZeroDeps) {\n emitError(\"Deadlock: no nodes ready but graph incomplete\");\n }\n }\n\n // Graph-level timeout\n const timeoutTimer = setTimeout(() => {\n emitError(\"Graph execution timed out\");\n }, this.config.timeoutMs);\n\n try {\n for await (const event of channel) {\n yield event;\n if (\n event.type === \"graph:complete\" ||\n event.type === \"graph:error\"\n ) {\n break;\n }\n }\n } finally {\n clearTimeout(timeoutTimer);\n await pool.drain(5_000).catch(() => { /* best-effort pool drain */ });\n }\n }\n\n // āā Fork execution with ForkCoordinator āā\n\n private async executeForkTask(\n forkId: string,\n prompt: string,\n fork: { nodes: AgentNode[]; consensus?: ConsensusPort },\n previousResults: Map<string, NodeResult>,\n channel: AsyncChannel<GraphStreamEvent>,\n ): Promise<NodeResult> {\n const forkStart = Date.now();\n const enrichedPrompt = this.buildNodePrompt(prompt, forkId, previousResults);\n\n this.eventBus?.emit(\"fork:start\", { forkId, agentCount: fork.nodes.length });\n channel.push({ type: \"fork:start\", forkId, agentCount: fork.nodes.length });\n\n const coordinator = new ForkCoordinator(\n forkId,\n fork.nodes.map((n) => n.id),\n Math.max(this.config.timeoutMs / 2, 5_000),\n Math.max(1, Math.ceil(fork.nodes.length / 2)),\n (partial) => {\n channel.push({\n type: \"fork:partial\",\n forkId,\n completedCount: partial.length,\n totalCount: fork.nodes.length,\n partialResults: partial,\n });\n },\n );\n\n const promises = fork.nodes.map(async (node) => {\n try {\n const result = await node.run(enrichedPrompt, this.sharedContext);\n coordinator.onNodeComplete(node.id, result);\n } catch (error) {\n coordinator.onNodeError(\n node.id,\n error instanceof Error ? error : new Error(String(error)),\n );\n }\n });\n\n let results: NodeResult[];\n try {\n results = await coordinator.promise;\n // Ensure all fork node promises settle (prevents orphaned executions)\n await Promise.allSettled(promises);\n } catch (error) {\n await Promise.allSettled(promises);\n coordinator.dispose();\n this.eventBus?.emit(\"fork:complete\", {\n forkId,\n error: error instanceof Error ? error.message : String(error),\n });\n channel.push({ type: \"fork:complete\", forkId, results: [] });\n throw error;\n }\n\n this.eventBus?.emit(\"fork:complete\", { forkId, resultCount: results.length });\n channel.push({ type: \"fork:complete\", forkId, results });\n\n let output: string;\n let tokenUsage = { input: 0, output: 0 };\n for (const r of results) {\n if (r.tokenUsage) {\n tokenUsage.input += r.tokenUsage.input;\n tokenUsage.output += r.tokenUsage.output;\n }\n }\n\n if (fork.consensus) {\n this.eventBus?.emit(\"consensus:start\", { forkId });\n channel.push({ type: \"consensus:start\", forkId });\n try {\n const consensusInput = results.map((r) => ({\n id: r.nodeId,\n output: r.output,\n }));\n const consensusResult = await fork.consensus.evaluate(consensusInput);\n this.eventBus?.emit(\"consensus:result\", {\n forkId,\n winnerId: consensusResult.winnerId,\n merged: !!consensusResult.merged,\n });\n output = consensusResult.merged ?? consensusResult.winnerOutput;\n channel.push({ type: \"consensus:result\", forkId, output });\n } catch (error) {\n this.eventBus?.emit(\"consensus:result\", {\n forkId,\n error: error instanceof Error ? error.message : String(error),\n });\n channel.push({ type: \"consensus:result\", forkId, output: \"\" });\n coordinator.dispose();\n throw error;\n }\n } else {\n output = results[0]!.output;\n }\n\n const result: NodeResult = {\n nodeId: forkId,\n output,\n tokenUsage,\n durationMs: Date.now() - forkStart,\n };\n await this.sharedContext.setNodeResult(forkId, output);\n coordinator.dispose();\n return result;\n }\n\n // āā Helpers āā\n\n private buildNodePrompt(\n basePrompt: string,\n nodeId: string,\n previousResults: Map<string, NodeResult>,\n ): string {\n const deps = this.edges.get(nodeId) ?? [];\n if (deps.length === 0) return basePrompt;\n\n const context = deps\n .map((depId) => {\n const r = previousResults.get(depId);\n return r ? `[${depId}]: ${r.output}` : \"\";\n })\n .filter(Boolean)\n .join(\"\\n\\n\");\n\n return `${basePrompt}\\n\\n--- Previous results ---\\n${context}`;\n }\n\n private findTerminalNode(): string {\n const isDependency = new Set<string>();\n for (const deps of this.edges.values()) {\n for (const d of deps) isDependency.add(d);\n }\n for (const nodeId of this.nodes.keys()) {\n if (!isDependency.has(nodeId)) return nodeId;\n }\n return [...this.nodes.keys()].pop()!;\n }\n}\n","// =============================================================================\n// SharedContext ā Namespaced shared state between agents in a graph\n// Supports watchers, versioning (optimistic locking), CRDT merge, and scoping.\n// =============================================================================\n\nimport type { FilesystemPort } from \"../ports/filesystem.port.js\";\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\nexport interface ContextChange {\n key: string;\n oldValue: unknown;\n newValue: unknown;\n version: number;\n source: string;\n timestamp: number;\n}\n\nexport type ContextChangeHandler = (change: ContextChange) => void;\n\nexport interface Versioned<T> {\n value: T;\n version: number;\n}\n\nexport class VersionConflictError extends Error {\n constructor(key: string, expected: number, actual: number) {\n super(\n `Version conflict on \"${key}\": expected ${expected}, actual ${actual}`,\n );\n this.name = \"VersionConflictError\";\n }\n}\n\n// ---------------------------------------------------------------------------\n// SharedContext\n// ---------------------------------------------------------------------------\n\nexport class SharedContext {\n private readonly watchers = new Map<string, Set<ContextChangeHandler>>();\n private readonly versions = new Map<string, number>();\n private readonly parent?: SharedContext;\n\n constructor(\n private readonly fs: FilesystemPort,\n private readonly namespace: string = \"/.shared\",\n parent?: SharedContext,\n ) {\n this.parent = parent;\n }\n\n // ---- helpers ------------------------------------------------------------\n\n private keyPath(key: string): string {\n return `${this.namespace}/${key}`;\n }\n\n private getVersion(key: string): number {\n return this.versions.get(key) ?? 0;\n }\n\n private bumpVersion(key: string): number {\n const next = this.getVersion(key) + 1;\n this.versions.set(key, next);\n return next;\n }\n\n // ---- notify watchers ----------------------------------------------------\n\n private notify(change: ContextChange): void {\n const keyHandlers = this.watchers.get(change.key);\n const wildHandlers = this.watchers.get(\"*\");\n if (keyHandlers) {\n for (const h of keyHandlers) h(change);\n }\n if (wildHandlers) {\n for (const h of wildHandlers) h(change);\n }\n // bubble to parent\n if (this.parent) {\n this.parent.notify(change);\n }\n }\n\n // ---- original API (backward compatible) ---------------------------------\n\n async set(key: string, value: unknown): Promise<void> {\n const oldValue = await this.get(key);\n await this.fs.write(this.keyPath(key), JSON.stringify(value));\n const version = this.bumpVersion(key);\n this.notify({\n key,\n oldValue,\n newValue: value,\n version,\n source: this.namespace,\n timestamp: Date.now(),\n });\n }\n\n async get<T>(key: string): Promise<T | null> {\n const path = this.keyPath(key);\n if (!(await this.fs.exists(path))) return null;\n const raw = await this.fs.read(path);\n return JSON.parse(raw) as T;\n }\n\n async delete(key: string): Promise<void> {\n const path = this.keyPath(key);\n if (await this.fs.exists(path)) {\n const oldValue = await this.get(key);\n await this.fs.delete(path);\n const version = this.bumpVersion(key);\n this.notify({\n key,\n oldValue,\n newValue: undefined,\n version,\n source: this.namespace,\n timestamp: Date.now(),\n });\n }\n }\n\n async list(): Promise<string[]> {\n if (!(await this.fs.exists(this.namespace))) return [];\n const entries = await this.fs.list(this.namespace);\n return entries\n .filter((e) => !e.isDirectory)\n .map((e) => e.name);\n }\n\n async getNodeResult(nodeId: string): Promise<string | null> {\n return this.get<string>(`results/${nodeId}`);\n }\n\n async setNodeResult(nodeId: string, result: string): Promise<void> {\n await this.set(`results/${nodeId}`, result);\n }\n\n // ---- watchers -----------------------------------------------------------\n\n /**\n * Subscribe to changes on a specific key, or use \"*\" for all changes.\n * Returns an unsubscribe function.\n */\n watch(key: string, handler: ContextChangeHandler): () => void {\n let handlers = this.watchers.get(key);\n if (!handlers) {\n handlers = new Set();\n this.watchers.set(key, handlers);\n }\n handlers.add(handler);\n\n return () => {\n handlers!.delete(handler);\n if (handlers!.size === 0) this.watchers.delete(key);\n };\n }\n\n // ---- versioning (optimistic locking) ------------------------------------\n\n async getVersioned<T>(key: string): Promise<Versioned<T> | null> {\n const value = await this.get<T>(key);\n if (value === null) return null;\n return { value, version: this.getVersion(key) };\n }\n\n async setVersioned(\n key: string,\n value: unknown,\n expectedVersion: number,\n ): Promise<void> {\n // Synchronous check-and-bump to avoid TOCTOU race\n const actual = this.getVersion(key);\n if (actual !== expectedVersion) {\n throw new VersionConflictError(key, expectedVersion, actual);\n }\n // Bump version synchronously before async write to prevent concurrent setVersioned\n // from passing the same version check\n this.bumpVersion(key);\n const oldValue = await this.get(key);\n await this.fs.write(this.keyPath(key), JSON.stringify(value));\n this.notify({\n key,\n oldValue,\n newValue: value,\n version: this.getVersion(key),\n source: this.namespace,\n timestamp: Date.now(),\n });\n }\n\n // ---- CRDT merge ---------------------------------------------------------\n\n /**\n * Read-then-write with a merge function using optimistic locking.\n * Default mergeFn is Last-Writer-Wins (returns newValue).\n * Retries on version conflict (CAS pattern).\n */\n async merge<T>(\n key: string,\n value: T,\n mergeFn: (oldValue: T | null, newValue: T) => T = (_old, nw) => nw,\n ): Promise<void> {\n const maxRetries = 3;\n for (let attempt = 0; attempt <= maxRetries; attempt++) {\n const currentVersion = this.getVersion(key);\n const current = await this.get<T>(key);\n const merged = mergeFn(current, value);\n try {\n await this.setVersioned(key, merged, currentVersion);\n return;\n } catch (err) {\n if (err instanceof VersionConflictError && attempt < maxRetries) {\n continue; // retry\n }\n throw err;\n }\n }\n }\n\n // ---- scoping ------------------------------------------------------------\n\n createScoped(scope: string): SharedContext {\n return new SharedContext(this.fs, `${this.namespace}/${scope}`, this);\n }\n}\n","// =============================================================================\n// AgentGraph ā Declarative agent graph with builder API\n// =============================================================================\n\nimport { GraphConfigSchema } from \"../domain/graph.schema.js\";\nimport type { GraphConfig, GraphResult, GraphStreamEvent } from \"../domain/graph.schema.js\";\nimport type { AgentConfig } from \"../types.js\";\nimport type { ConsensusPort } from \"../ports/consensus.port.js\";\nimport type { FilesystemPort } from \"../ports/filesystem.port.js\";\nimport type { TelemetryPort } from \"../ports/telemetry.port.js\";\nimport type { EventBus } from \"../agent/event-bus.js\";\nimport { AbstractBuilder } from \"../utils/abstract-builder.js\";\nimport { AgentNode } from \"./agent-node.js\";\nimport { GraphExecutor } from \"./graph-executor.js\";\nimport { SharedContext } from \"./shared-context.js\";\nimport { VirtualFilesystem } from \"../adapters/filesystem/virtual-fs.adapter.js\";\nimport type { GraphDescriptor } from \"../ports/graph-visualization.port.js\";\nimport { AsciiGraphAdapter } from \"../adapters/graph-visualization/ascii-graph.adapter.js\";\nimport { MermaidGraphAdapter } from \"../adapters/graph-visualization/mermaid-graph.adapter.js\";\n\nexport class AgentGraph {\n constructor(\n private readonly nodes: Map<string, AgentNode>,\n private readonly edges: Map<string, string[]>,\n private readonly forks: Map<\n string,\n { nodes: AgentNode[]; consensus?: ConsensusPort }\n >,\n private readonly config: GraphConfig,\n private readonly fs: FilesystemPort,\n private readonly eventBus?: EventBus,\n private readonly telemetry?: TelemetryPort,\n ) {}\n\n getNodes(): ReadonlyMap<string, AgentNode> {\n return this.nodes;\n }\n\n getEdges(): ReadonlyMap<string, readonly string[]> {\n return this.edges;\n }\n\n getForks(): ReadonlyMap<string, { nodes: readonly AgentNode[]; consensus?: ConsensusPort }> {\n return this.forks;\n }\n\n describe(): GraphDescriptor {\n const nodes = [...this.nodes.values()].map((n) => ({\n id: n.id,\n type: n.type,\n }));\n const edges: GraphDescriptor[\"edges\"] = [];\n for (const [to, sources] of this.edges) {\n for (const from of sources) {\n edges.push({ from, to });\n }\n }\n const forks = [...this.forks.entries()].map(([id, f]) => ({\n id,\n nodeIds: f.nodes.map((n) => n.id),\n }));\n return { nodes, edges, forks };\n }\n\n visualize(format: \"ascii\" | \"mermaid\" = \"ascii\"): string {\n const descriptor = this.describe();\n if (format === \"mermaid\") {\n return new MermaidGraphAdapter().toMermaid(descriptor);\n }\n return new AsciiGraphAdapter().toAscii(descriptor);\n }\n\n static create(config?: Partial<GraphConfig>): AgentGraphBuilder {\n return new AgentGraphBuilder(config);\n }\n\n async run(prompt: string): Promise<GraphResult> {\n const sharedContext = new SharedContext(this.fs);\n const executor = new GraphExecutor(\n this.nodes,\n this.edges,\n this.forks,\n this.config,\n sharedContext,\n this.eventBus,\n this.telemetry,\n );\n return executor.execute(prompt);\n }\n\n async *stream(prompt: string): AsyncGenerator<GraphStreamEvent> {\n const sharedContext = new SharedContext(this.fs);\n const executor = new GraphExecutor(\n this.nodes,\n this.edges,\n this.forks,\n this.config,\n sharedContext,\n this.eventBus,\n this.telemetry,\n );\n yield* executor.stream(prompt);\n }\n}\n\nexport class AgentGraphBuilder extends AbstractBuilder<AgentGraph> {\n private readonly nodeMap = new Map<string, AgentNode>();\n private readonly edgeMap = new Map<string, string[]>();\n private readonly forkMap = new Map<\n string,\n { nodes: AgentNode[]; consensus?: ConsensusPort }\n >();\n private readonly config: GraphConfig;\n private fs: FilesystemPort | undefined;\n private eventBus: EventBus | undefined;\n private telemetryAdapter: TelemetryPort | undefined;\n\n constructor(config?: Partial<GraphConfig>) {\n super();\n this.config = GraphConfigSchema.parse(config ?? {});\n }\n\n node(id: string, config: AgentConfig): this {\n if (this.nodeMap.has(id)) {\n throw new Error(`Node \"${id}\" already exists`);\n }\n this.nodeMap.set(\n id,\n new AgentNode({ id, type: \"agent\", agentConfig: config }),\n );\n return this;\n }\n\n edge(from: string, to: string): this {\n const deps = this.edgeMap.get(to) ?? [];\n deps.push(from);\n this.edgeMap.set(to, deps);\n return this;\n }\n\n fork(id: string, configs: AgentConfig[]): this {\n if (configs.length < 2) {\n throw new Error(`Fork \"${id}\" requires at least 2 configs`);\n }\n if (this.nodeMap.has(id) || this.forkMap.has(id)) {\n throw new Error(`Node \"${id}\" already exists`);\n }\n const forkNodes = configs.map(\n (cfg, i) =>\n new AgentNode({\n id: `${id}__fork_${i}`,\n type: \"agent\",\n agentConfig: cfg,\n }),\n );\n // Register a placeholder node for the fork so edges can reference it\n this.nodeMap.set(\n id,\n new AgentNode({ id, type: \"agent\" }),\n );\n this.forkMap.set(id, { nodes: forkNodes });\n return this;\n }\n\n consensus(forkId: string, strategy: ConsensusPort): this {\n const fork = this.forkMap.get(forkId);\n if (!fork) {\n throw new Error(\n `Cannot set consensus: \"${forkId}\" is not a fork node`,\n );\n }\n fork.consensus = strategy;\n return this;\n }\n\n withFilesystem(fs: FilesystemPort): this {\n this.fs = fs;\n return this;\n }\n\n withEventBus(eventBus: EventBus): this {\n this.eventBus = eventBus;\n return this;\n }\n\n withTelemetry(adapter: TelemetryPort): this {\n this.telemetryAdapter = adapter;\n return this;\n }\n\n protected validate(): void {\n this.validateEdges();\n this.validateNoCycles();\n }\n\n protected construct(): AgentGraph {\n return new AgentGraph(\n this.nodeMap,\n this.edgeMap,\n this.forkMap,\n this.config,\n this.fs ?? new VirtualFilesystem(),\n this.eventBus,\n this.telemetryAdapter,\n );\n }\n\n private validateEdges(): void {\n for (const [to, deps] of this.edgeMap) {\n if (!this.nodeMap.has(to)) {\n throw new Error(`Edge target \"${to}\" does not exist`);\n }\n for (const from of deps) {\n if (!this.nodeMap.has(from)) {\n throw new Error(`Edge source \"${from}\" does not exist`);\n }\n }\n }\n }\n\n private validateNoCycles(): void {\n const visited = new Set<string>();\n const stack = new Set<string>();\n\n const visit = (nodeId: string): void => {\n if (stack.has(nodeId)) {\n throw new Error(`Cycle detected involving node \"${nodeId}\"`);\n }\n if (visited.has(nodeId)) return;\n stack.add(nodeId);\n const deps = this.edgeMap.get(nodeId) ?? [];\n for (const dep of deps) {\n visit(dep);\n }\n stack.delete(nodeId);\n visited.add(nodeId);\n };\n\n for (const nodeId of this.nodeMap.keys()) {\n visit(nodeId);\n }\n }\n}\n"],"mappings":"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","names":["result"]}
|
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
// src/adapters/mcp/ai-sdk-mcp.adapter.ts
|
|
2
|
+
var AiSdkMcpAdapter = class {
|
|
3
|
+
clients = /* @__PURE__ */ new Map();
|
|
4
|
+
configs = /* @__PURE__ */ new Map();
|
|
5
|
+
constructor(options = {}) {
|
|
6
|
+
for (const server of options.servers ?? []) {
|
|
7
|
+
this.configs.set(server.id, server);
|
|
8
|
+
}
|
|
9
|
+
}
|
|
10
|
+
async discoverTools() {
|
|
11
|
+
const result = {};
|
|
12
|
+
for (const [serverId, client] of this.clients) {
|
|
13
|
+
const tools = await client.tools();
|
|
14
|
+
for (const [name, rawTool] of Object.entries(tools)) {
|
|
15
|
+
const tool = rawTool;
|
|
16
|
+
const namespacedName = `${serverId}:${name}`;
|
|
17
|
+
result[namespacedName] = {
|
|
18
|
+
name: namespacedName,
|
|
19
|
+
description: tool.description ?? "",
|
|
20
|
+
inputSchema: tool.parameters ?? {}
|
|
21
|
+
};
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
return result;
|
|
25
|
+
}
|
|
26
|
+
async executeTool(name, args) {
|
|
27
|
+
const colonIndex = name.indexOf(":");
|
|
28
|
+
const serverId = colonIndex > -1 ? name.slice(0, colonIndex) : void 0;
|
|
29
|
+
const toolName = colonIndex > -1 ? name.slice(colonIndex + 1) : name;
|
|
30
|
+
if (serverId) {
|
|
31
|
+
const client = this.clients.get(serverId);
|
|
32
|
+
if (client) {
|
|
33
|
+
const tools = await client.tools();
|
|
34
|
+
const toolDef = tools[toolName];
|
|
35
|
+
if (toolDef?.execute) {
|
|
36
|
+
const raw = await toolDef.execute(args);
|
|
37
|
+
return {
|
|
38
|
+
content: [{ type: "text", text: String(raw) }],
|
|
39
|
+
isError: false
|
|
40
|
+
};
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
throw new Error(
|
|
44
|
+
`Tool "${toolName}" not found on server "${serverId}"`
|
|
45
|
+
);
|
|
46
|
+
}
|
|
47
|
+
for (const [, client] of this.clients) {
|
|
48
|
+
const tools = await client.tools();
|
|
49
|
+
const toolDef = tools[toolName];
|
|
50
|
+
if (!toolDef?.execute) continue;
|
|
51
|
+
const raw = await toolDef.execute(args);
|
|
52
|
+
return { content: [{ type: "text", text: String(raw) }], isError: false };
|
|
53
|
+
}
|
|
54
|
+
throw new Error(`Tool "${name}" not found on any connected MCP server`);
|
|
55
|
+
}
|
|
56
|
+
async listServers() {
|
|
57
|
+
const infos = [];
|
|
58
|
+
for (const [id, config] of this.configs) {
|
|
59
|
+
infos.push({
|
|
60
|
+
id,
|
|
61
|
+
name: config.name,
|
|
62
|
+
status: this.clients.has(id) ? "connected" : "disconnected",
|
|
63
|
+
toolCount: 0,
|
|
64
|
+
transport: config.transport === "sse" ? "sse" : config.transport
|
|
65
|
+
});
|
|
66
|
+
}
|
|
67
|
+
return infos;
|
|
68
|
+
}
|
|
69
|
+
async connect(config) {
|
|
70
|
+
this.configs.set(config.id, config);
|
|
71
|
+
if (this.clients.has(config.id)) return;
|
|
72
|
+
const createClient = await loadCreateMCPClient();
|
|
73
|
+
const client = await createClient(buildTransport(config));
|
|
74
|
+
this.clients.set(config.id, client);
|
|
75
|
+
}
|
|
76
|
+
async disconnect(serverId) {
|
|
77
|
+
const client = this.clients.get(serverId);
|
|
78
|
+
if (!client) return;
|
|
79
|
+
await client.close();
|
|
80
|
+
this.clients.delete(serverId);
|
|
81
|
+
}
|
|
82
|
+
async closeAll() {
|
|
83
|
+
const ids = Array.from(this.clients.keys());
|
|
84
|
+
for (const id of ids) {
|
|
85
|
+
await this.disconnect(id);
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
};
|
|
89
|
+
async function loadCreateMCPClient() {
|
|
90
|
+
try {
|
|
91
|
+
const mod = await import("@ai-sdk/mcp");
|
|
92
|
+
if (!mod.createMCPClient) {
|
|
93
|
+
throw new Error("createMCPClient not found in @ai-sdk/mcp");
|
|
94
|
+
}
|
|
95
|
+
return mod.createMCPClient;
|
|
96
|
+
} catch {
|
|
97
|
+
throw new Error(
|
|
98
|
+
"Failed to load @ai-sdk/mcp. Install it with: pnpm add @ai-sdk/mcp"
|
|
99
|
+
);
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
function buildTransport(config) {
|
|
103
|
+
if (config.transport === "stdio") {
|
|
104
|
+
return {
|
|
105
|
+
transport: {
|
|
106
|
+
type: "stdio",
|
|
107
|
+
command: config.command,
|
|
108
|
+
args: config.args,
|
|
109
|
+
env: config.env
|
|
110
|
+
}
|
|
111
|
+
};
|
|
112
|
+
}
|
|
113
|
+
return {
|
|
114
|
+
transport: {
|
|
115
|
+
type: config.transport === "sse" ? "sse" : "http",
|
|
116
|
+
url: config.url,
|
|
117
|
+
headers: config.headers
|
|
118
|
+
}
|
|
119
|
+
};
|
|
120
|
+
}
|
|
121
|
+
export {
|
|
122
|
+
AiSdkMcpAdapter
|
|
123
|
+
};
|
|
124
|
+
//# sourceMappingURL=ai-sdk-mcp.adapter-SEN6KHNU.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/adapters/mcp/ai-sdk-mcp.adapter.ts"],"sourcesContent":["// AiSdkMcpAdapter ā Adapter using @ai-sdk/mcp createMCPClient\n\nimport type {\n McpPort,\n McpToolDefinition,\n McpToolResult,\n McpServerInfo,\n McpServerConfig,\n} from \"../../ports/mcp.port.js\";\n\ninterface MCPClient {\n tools(): Promise<Record<string, unknown>>;\n close(): Promise<void>;\n}\n\nexport class AiSdkMcpAdapter implements McpPort {\n private readonly clients = new Map<string, MCPClient>();\n private readonly configs = new Map<string, McpServerConfig>();\n\n constructor(options: { servers?: McpServerConfig[] } = {}) {\n for (const server of options.servers ?? []) {\n this.configs.set(server.id, server);\n }\n }\n\n async discoverTools(): Promise<Record<string, McpToolDefinition>> {\n const result: Record<string, McpToolDefinition> = {};\n for (const [serverId, client] of this.clients) {\n const tools = await client.tools();\n for (const [name, rawTool] of Object.entries(tools)) {\n const tool = rawTool as {\n description?: string;\n parameters?: Record<string, unknown>;\n };\n const namespacedName = `${serverId}:${name}`;\n result[namespacedName] = {\n name: namespacedName,\n description: tool.description ?? \"\",\n inputSchema: (tool.parameters ?? {}) as Record<string, unknown>,\n };\n }\n }\n return result;\n }\n\n async executeTool(name: string, args: unknown): Promise<McpToolResult> {\n const colonIndex = name.indexOf(\":\");\n const serverId = colonIndex > -1 ? name.slice(0, colonIndex) : undefined;\n const toolName = colonIndex > -1 ? name.slice(colonIndex + 1) : name;\n\n if (serverId) {\n const client = this.clients.get(serverId);\n if (client) {\n const tools = await client.tools();\n const toolDef = tools[toolName] as\n | { execute?: (a: unknown) => Promise<unknown> }\n | undefined;\n if (toolDef?.execute) {\n const raw = await toolDef.execute(args);\n return {\n content: [{ type: \"text\", text: String(raw) }],\n isError: false,\n };\n }\n }\n throw new Error(\n `Tool \"${toolName}\" not found on server \"${serverId}\"`,\n );\n }\n\n for (const [, client] of this.clients) {\n const tools = await client.tools();\n const toolDef = tools[toolName] as\n | { execute?: (a: unknown) => Promise<unknown> }\n | undefined;\n if (!toolDef?.execute) continue;\n const raw = await toolDef.execute(args);\n return { content: [{ type: \"text\", text: String(raw) }], isError: false };\n }\n throw new Error(`Tool \"${name}\" not found on any connected MCP server`);\n }\n\n async listServers(): Promise<McpServerInfo[]> {\n const infos: McpServerInfo[] = [];\n for (const [id, config] of this.configs) {\n infos.push({\n id,\n name: config.name,\n status: this.clients.has(id) ? \"connected\" : \"disconnected\",\n toolCount: 0,\n transport: config.transport === \"sse\" ? \"sse\" : config.transport,\n });\n }\n return infos;\n }\n\n async connect(config: McpServerConfig): Promise<void> {\n this.configs.set(config.id, config);\n if (this.clients.has(config.id)) return;\n const createClient = await loadCreateMCPClient();\n const client = await createClient(buildTransport(config));\n this.clients.set(config.id, client as MCPClient);\n }\n\n async disconnect(serverId: string): Promise<void> {\n const client = this.clients.get(serverId);\n if (!client) return;\n await client.close();\n this.clients.delete(serverId);\n }\n\n async closeAll(): Promise<void> {\n const ids = Array.from(this.clients.keys());\n for (const id of ids) {\n await this.disconnect(id);\n }\n }\n}\n\nasync function loadCreateMCPClient(): Promise<\n (config: Record<string, unknown>) => Promise<unknown>\n> {\n try {\n // @ts-expect-error ā optional peer dependency, resolved at runtime\n const mod = (await import(\"@ai-sdk/mcp\")) as {\n createMCPClient?: (c: Record<string, unknown>) => Promise<unknown>;\n };\n if (!mod.createMCPClient) {\n throw new Error(\"createMCPClient not found in @ai-sdk/mcp\");\n }\n return mod.createMCPClient;\n } catch {\n throw new Error(\n \"Failed to load @ai-sdk/mcp. Install it with: pnpm add @ai-sdk/mcp\",\n );\n }\n}\n\nfunction buildTransport(config: McpServerConfig): Record<string, unknown> {\n if (config.transport === \"stdio\") {\n return {\n transport: {\n type: \"stdio\",\n command: config.command,\n args: config.args,\n env: config.env,\n },\n };\n }\n return {\n transport: {\n type: config.transport === \"sse\" ? \"sse\" : \"http\",\n url: config.url,\n headers: config.headers,\n },\n };\n}\n"],"mappings":"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","names":[]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
"use strict";Object.defineProperty(exports, "__esModule", {value: true});
|
|
2
|
+
|
|
3
|
+
var _chunk5FE5TG2Wcjs = require('./chunk-5FE5TG2W.cjs');
|
|
4
|
+
require('./chunk-3LD3JTH4.cjs');
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
exports.BunRuntimeAdapter = _chunk5FE5TG2Wcjs.BunRuntimeAdapter;
|
|
8
|
+
//# sourceMappingURL=bun-runtime.adapter-XKOUXVAK.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["/Users/giulioleone/Sviluppo/gauss/gauss-flow/dist/bun-runtime.adapter-XKOUXVAK.cjs"],"names":[],"mappings":"AAAA;AACE;AACF,wDAA6B;AAC7B,gCAA6B;AAC7B;AACE;AACF,gEAAC","file":"/Users/giulioleone/Sviluppo/gauss/gauss-flow/dist/bun-runtime.adapter-XKOUXVAK.cjs"}
|
|
@@ -0,0 +1,129 @@
|
|
|
1
|
+
import {
|
|
2
|
+
createCliTools
|
|
3
|
+
} from "./chunk-WKKQ443C.js";
|
|
4
|
+
import {
|
|
5
|
+
contextToSystemPrompt,
|
|
6
|
+
detectProjectContext
|
|
7
|
+
} from "./chunk-KEASLAYR.js";
|
|
8
|
+
import "./chunk-ZYFAZYSL.js";
|
|
9
|
+
import {
|
|
10
|
+
color,
|
|
11
|
+
createSpinner,
|
|
12
|
+
formatDuration
|
|
13
|
+
} from "./chunk-VRWD7LCI.js";
|
|
14
|
+
import "./chunk-K6SAETGP.js";
|
|
15
|
+
|
|
16
|
+
// src/cli/commands/chat.ts
|
|
17
|
+
var MAX_DELTA_DISPLAY_LENGTH = 200;
|
|
18
|
+
var MAX_TOOL_OUTPUT_DISPLAY_LENGTH = 500;
|
|
19
|
+
async function runChat(prompt, model, yolo = false) {
|
|
20
|
+
const tools = createCliTools({
|
|
21
|
+
yolo,
|
|
22
|
+
confirm: async (desc) => {
|
|
23
|
+
if (!process.stdin.isTTY) {
|
|
24
|
+
console.log(color("red", ` \u2717 Blocked: ${desc} (use --yolo to auto-approve)`));
|
|
25
|
+
return false;
|
|
26
|
+
}
|
|
27
|
+
const { createInterface } = await import("readline/promises");
|
|
28
|
+
const rl = createInterface({ input: process.stdin, output: process.stdout });
|
|
29
|
+
try {
|
|
30
|
+
const answer = await rl.question(color("yellow", ` \u26A0 ${desc} \u2014 Execute? (y/n) `));
|
|
31
|
+
return answer.toLowerCase().startsWith("y");
|
|
32
|
+
} finally {
|
|
33
|
+
rl.close();
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
});
|
|
37
|
+
const { Agent } = await import("./agent-UIQDSYCE.js");
|
|
38
|
+
const { DefaultCostTrackerAdapter } = await import("./cost-tracker-JLOU7IZJ.js");
|
|
39
|
+
const { persistUsage } = await import("./persist-usage-WTBTCWEF.js");
|
|
40
|
+
const costTracker = new DefaultCostTrackerAdapter();
|
|
41
|
+
let projectContext = "";
|
|
42
|
+
try {
|
|
43
|
+
projectContext = contextToSystemPrompt(detectProjectContext());
|
|
44
|
+
} catch {
|
|
45
|
+
}
|
|
46
|
+
const agent = Agent.create({
|
|
47
|
+
model,
|
|
48
|
+
instructions: `You are Gauss, an AI coding assistant. ${projectContext} You can read files, write files, search code, and execute bash commands. Use these tools to help accomplish the task. Be concise and direct.`,
|
|
49
|
+
maxSteps: 15
|
|
50
|
+
}).withTools(tools).withCostTracker(costTracker).build();
|
|
51
|
+
const startTime = Date.now();
|
|
52
|
+
const spinner = createSpinner("Thinking");
|
|
53
|
+
try {
|
|
54
|
+
const stream = await agent.stream({
|
|
55
|
+
messages: [{ role: "user", content: prompt }]
|
|
56
|
+
});
|
|
57
|
+
let firstChunk = true;
|
|
58
|
+
for await (const part of stream.fullStream) {
|
|
59
|
+
switch (part.type) {
|
|
60
|
+
case "text-delta":
|
|
61
|
+
if (firstChunk) {
|
|
62
|
+
spinner.stop();
|
|
63
|
+
process.stdout.write(color("cyan", "\n\u{1F916} "));
|
|
64
|
+
firstChunk = false;
|
|
65
|
+
}
|
|
66
|
+
process.stdout.write(part.text);
|
|
67
|
+
break;
|
|
68
|
+
case "tool-input-start":
|
|
69
|
+
if (firstChunk) {
|
|
70
|
+
spinner.stop();
|
|
71
|
+
firstChunk = false;
|
|
72
|
+
}
|
|
73
|
+
process.stdout.write(color("magenta", `
|
|
74
|
+
\u{1F527} ${part.toolName} `));
|
|
75
|
+
break;
|
|
76
|
+
case "tool-input-delta":
|
|
77
|
+
process.stdout.write(color("dim", part.delta.length > MAX_DELTA_DISPLAY_LENGTH ? part.delta.slice(0, MAX_DELTA_DISPLAY_LENGTH) + "\u2026" : part.delta));
|
|
78
|
+
break;
|
|
79
|
+
case "tool-input-end":
|
|
80
|
+
process.stdout.write("\n");
|
|
81
|
+
break;
|
|
82
|
+
case "tool-result":
|
|
83
|
+
{
|
|
84
|
+
const raw = part.output ?? part.result;
|
|
85
|
+
const summary = typeof raw === "string" ? raw : JSON.stringify(raw) ?? "(no output)";
|
|
86
|
+
process.stdout.write(color("dim", ` \u21B3 ${summary.length > MAX_TOOL_OUTPUT_DISPLAY_LENGTH ? summary.slice(0, MAX_TOOL_OUTPUT_DISPLAY_LENGTH) + "\u2026" : summary}
|
|
87
|
+
`));
|
|
88
|
+
}
|
|
89
|
+
break;
|
|
90
|
+
case "tool-error":
|
|
91
|
+
process.stdout.write(color("red", ` \u2717 Tool error (${part.toolName}): ${part.error}
|
|
92
|
+
`));
|
|
93
|
+
break;
|
|
94
|
+
case "error":
|
|
95
|
+
if (firstChunk) {
|
|
96
|
+
spinner.stop();
|
|
97
|
+
firstChunk = false;
|
|
98
|
+
}
|
|
99
|
+
process.stdout.write(color("red", `
|
|
100
|
+
\u2717 Stream error: ${part.error}
|
|
101
|
+
`));
|
|
102
|
+
break;
|
|
103
|
+
default:
|
|
104
|
+
break;
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
const elapsed = formatDuration(Date.now() - startTime);
|
|
108
|
+
process.stdout.write(color("dim", `
|
|
109
|
+
|
|
110
|
+
\u23F1 ${elapsed}
|
|
111
|
+
|
|
112
|
+
`));
|
|
113
|
+
} catch (err) {
|
|
114
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
115
|
+
console.error(color("red", `
|
|
116
|
+
\u2717 Error: ${msg}
|
|
117
|
+
`));
|
|
118
|
+
} finally {
|
|
119
|
+
spinner.stop();
|
|
120
|
+
await persistUsage(costTracker).catch((err) => {
|
|
121
|
+
console.warn("[usage] Failed to persist usage data:", err instanceof Error ? err.message : String(err));
|
|
122
|
+
});
|
|
123
|
+
await agent.dispose();
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
export {
|
|
127
|
+
runChat
|
|
128
|
+
};
|
|
129
|
+
//# sourceMappingURL=chat-A3XMRPJL.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/cli/commands/chat.ts"],"sourcesContent":["// =============================================================================\n// CLI Chat Command ā Single-shot agentic prompt execution (streaming)\n// =============================================================================\n\nimport type { LanguageModel } from \"../../core/llm/index.js\";\nimport { color, createSpinner, formatDuration } from \"../format.js\";\nimport { createCliTools } from \"../tools.js\";\nimport { detectProjectContext, contextToSystemPrompt } from \"../project-context.js\";\n\n/** Max characters shown for streaming tool-input deltas */\nconst MAX_DELTA_DISPLAY_LENGTH = 200;\n/** Max characters shown for tool output summaries */\nconst MAX_TOOL_OUTPUT_DISPLAY_LENGTH = 500;\n\nexport async function runChat(\n prompt: string,\n model: LanguageModel,\n yolo = false,\n): Promise<void> {\n const tools = createCliTools({\n yolo,\n confirm: async (desc: string) => {\n if (!process.stdin.isTTY) {\n console.log(color(\"red\", ` ā Blocked: ${desc} (use --yolo to auto-approve)`));\n return false;\n }\n // Interactive: ask user\n const { createInterface } = await import(\"node:readline/promises\");\n const rl = createInterface({ input: process.stdin, output: process.stdout });\n try {\n const answer = await rl.question(color(\"yellow\", ` ā ${desc} ā Execute? (y/n) `));\n return answer.toLowerCase().startsWith(\"y\");\n } finally {\n rl.close();\n }\n },\n });\n\n const { Agent } = await import(\"../../agent/agent.js\");\n const { DefaultCostTrackerAdapter } = await import(\"../../adapters/cost-tracker/index.js\");\n const { persistUsage } = await import(\"../persist-usage.js\");\n const costTracker = new DefaultCostTrackerAdapter();\n let projectContext = \"\";\n try { projectContext = contextToSystemPrompt(detectProjectContext()); } catch { /* fallback to no context */ }\n const agent = Agent.create({\n model,\n instructions: `You are Gauss, an AI coding assistant. ${projectContext} You can read files, write files, search code, and execute bash commands. Use these tools to help accomplish the task. Be concise and direct.`,\n maxSteps: 15,\n })\n .withTools(tools)\n .withCostTracker(costTracker)\n .build();\n\n const startTime = Date.now();\n const spinner = createSpinner(\"Thinking\");\n\n try {\n const stream = await agent.stream({\n messages: [{ role: \"user\", content: prompt }],\n });\n\n let firstChunk = true;\n for await (const part of stream.fullStream) {\n switch (part.type) {\n case \"text-delta\":\n if (firstChunk) {\n spinner.stop();\n process.stdout.write(color(\"cyan\", \"\\nš¤ \"));\n firstChunk = false;\n }\n process.stdout.write(part.text);\n break;\n case \"tool-input-start\":\n if (firstChunk) { spinner.stop(); firstChunk = false; }\n process.stdout.write(color(\"magenta\", `\\n š§ ${part.toolName} `));\n break;\n case \"tool-input-delta\":\n process.stdout.write(color(\"dim\", part.delta.length > MAX_DELTA_DISPLAY_LENGTH ? part.delta.slice(0, MAX_DELTA_DISPLAY_LENGTH) + \"ā¦\" : part.delta));\n break;\n case \"tool-input-end\":\n process.stdout.write(\"\\n\");\n break;\n case \"tool-result\":\n {\n const raw = (part as Record<string, unknown>).output ?? (part as Record<string, unknown>).result;\n const summary = typeof raw === \"string\" ? raw : (JSON.stringify(raw) ?? \"(no output)\");\n process.stdout.write(color(\"dim\", ` ā³ ${summary.length > MAX_TOOL_OUTPUT_DISPLAY_LENGTH ? summary.slice(0, MAX_TOOL_OUTPUT_DISPLAY_LENGTH) + \"ā¦\" : summary}\\n`));\n }\n break;\n case \"tool-error\":\n process.stdout.write(color(\"red\", ` ā Tool error (${(part as Record<string, unknown>).toolName}): ${(part as Record<string, unknown>).error}\\n`));\n break;\n case \"error\":\n if (firstChunk) { spinner.stop(); firstChunk = false; }\n process.stdout.write(color(\"red\", `\\n ā Stream error: ${(part as Record<string, unknown>).error}\\n`));\n break;\n default:\n break;\n }\n }\n\n const elapsed = formatDuration(Date.now() - startTime);\n process.stdout.write(color(\"dim\", `\\n\\n ā± ${elapsed}\\n\\n`));\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n console.error(color(\"red\", `\\nā Error: ${msg}\\n`));\n } finally {\n spinner.stop();\n // fire-and-forget: usage persistence must not block exit\n await persistUsage(costTracker).catch((err: unknown) => {\n console.warn(\"[usage] Failed to persist usage data:\", err instanceof Error ? err.message : String(err));\n });\n await agent.dispose();\n }\n}\n"],"mappings":"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","names":[]}
|