tnega 0.3.0 → 0.4.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/agent.js.map CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
- "sources": ["../packages/agent/src/service.ts", "../packages/session/src/index.ts", "../packages/session/src/invariant.ts", "../packages/agent/src/definition.ts", "../packages/agent/src/live.ts", "../packages/agent/src/inbox-durable.ts", "../packages/agent/src/prompt.ts", "../packages/agent/src/llm-service.ts"],
4
- "sourcesContent": ["import type { Context } from '@tnega/core'\r\nimport { randomUUID } from 'node:crypto'\r\n\r\nimport {\r\n DEFAULT_CONTEXT_LIMIT,\r\n estimateContextUsage,\r\n type ModelMessage,\r\n type RequestContextPayload,\r\n type SessionLog,\r\n type ToolResultPayload,\r\n type TurnEndReason,\r\n} from '@tnega/session'\r\nimport type { ToolDefinition, ToolError, ToolResult } from '@tnega/tools'\r\nimport type { ToolSchemaSnapshot } from './prompt.js'\r\nimport type { ToolsService } from '@tnega/tools'\r\n\r\nimport type {\r\n AgentContextBudget,\r\n AgentCancelCause,\r\n AgentFinishReason,\r\n AgentHooks,\r\n AgentInput,\r\n AgentPreStepEvent,\r\n AgentRequestErrorEvent,\r\n AgentRequestEvent,\r\n AgentRequestRetryDecision,\r\n AgentRunOptions,\r\n AgentRunResult,\r\n AgentStep,\r\n AgentStreamEvent,\r\n LLMStreamRequestEvent,\r\n AgentTurnStoppingEvent,\r\n CompleteOptions,\r\n LLMAdapter,\r\n LLMCompletion,\r\n LLMStreamEvent,\r\n LLMToolCall,\r\n} from './types.js'\r\n\r\nexport class AgentError extends Error {\r\n override name = 'AgentError'\r\n}\r\n\r\nexport class AgentInbox {\r\n private _queue: AgentInput[] = []\r\n private _steerQueue: AgentInput[] = []\r\n private _injected = new Map<string, unknown>()\r\n\r\n get size(): number {\r\n return this._queue.length + this._steerQueue.length\r\n }\r\n\r\n get steerSize(): number {\r\n return this._steerQueue.length\r\n }\r\n\r\n push(input: AgentInput): AgentInput {\r\n this._queue.push(input)\r\n return input\r\n }\r\n\r\n followup(input: AgentInput): AgentInput {\r\n return this.push(input)\r\n }\r\n\r\n steer(input: AgentInput): AgentInput {\r\n this._steerQueue.push(input)\r\n return input\r\n }\r\n\r\n send(\r\n input: AgentInput,\r\n options: { mode?: 'followup' | 'steer'; wake?: boolean } = {},\r\n ): AgentInput {\r\n if (options.mode === 'steer') return this.steer(input)\r\n return this.followup(input)\r\n }\r\n\r\n claim(): AgentInput | undefined {\r\n return this._steerQueue.shift() ?? this._queue.shift()\r\n }\r\n\r\n peek(): AgentInput | undefined {\r\n return this._steerQueue[0] ?? this._queue[0]\r\n }\r\n\r\n inject(key: string, value: unknown): void {\r\n this._injected.set(key, value)\r\n }\r\n\r\n injected(): ReadonlyMap<string, unknown> {\r\n return new Map(this._injected)\r\n }\r\n}\r\n\r\nexport interface AgentConfig {\r\n llm?: LLMAdapter\r\n /** Bind the loop to a specific session instead of the ctx-provided singleton. */\r\n session?: SessionLog\r\n /** Fail fast when the actual request would not be reconstructable from the log. */\r\n assertReplayable?: boolean\r\n maxTurns?: number\r\n maxSteps?: number\r\n inbox?: AgentInbox\r\n hooks?: AgentHooks\r\n contextBudget?: AgentContextBudget\r\n}\r\n\r\nfunction copyMessages(messages: readonly ModelMessage[]): ModelMessage[] {\r\n return messages.map((message) => {\r\n const copy: ModelMessage = {\r\n role: message.role,\r\n content: message.content,\r\n }\r\n if (message.name) copy.name = message.name\r\n if (message.tool_call_id) copy.tool_call_id = message.tool_call_id\r\n if (message.toolOk !== undefined) copy.toolOk = message.toolOk\r\n if (message.toolError) copy.toolError = { ...message.toolError }\r\n if (message.tool_calls) {\r\n copy.tool_calls = message.tool_calls.map(call => ({\r\n id: call.id,\r\n name: call.name,\r\n arguments: call.arguments,\r\n }))\r\n }\r\n return copy\r\n })\r\n}\r\n\r\nfunction isUserOrSystemMessage(\r\n message: ModelMessage,\r\n): message is ModelMessage & { role: 'system' | 'user' } {\r\n return message.role === 'system' || message.role === 'user'\r\n}\r\n\r\nfunction stringify(value: unknown): string {\r\n if (typeof value === 'string') return value\r\n try {\r\n return JSON.stringify(value) ?? String(value)\r\n } catch {\r\n return String(value)\r\n }\r\n}\r\n\r\nfunction copyCompletion(completion: LLMCompletion): LLMCompletion {\r\n const copy: LLMCompletion = {\r\n finishReason: completion.finishReason,\r\n }\r\n if (completion.content !== undefined) copy.content = completion.content\r\n if (completion.toolCalls) {\r\n copy.toolCalls = completion.toolCalls.map(call => ({\r\n id: call.id,\r\n name: call.name,\r\n arguments: call.arguments,\r\n }))\r\n }\r\n return copy\r\n}\r\n\r\nfunction isCancelCause(value: unknown): value is AgentCancelCause {\r\n if (typeof value !== 'object' || value === null) return false\r\n const record = value as Record<string, unknown>\r\n if (record.type === 'user' || record.type === 'parent' || record.type === 'disposed') {\r\n return true\r\n }\r\n if (\r\n record.type === 'abort'\r\n && (record.message === undefined || typeof record.message === 'string')\r\n ) {\r\n return true\r\n }\r\n if (record.type === 'timeout' && typeof record.timeoutMs === 'number') {\r\n return true\r\n }\r\n return false\r\n}\r\n\r\nfunction cancelCauseFromSignal(signal?: AbortSignal): AgentCancelCause | undefined {\r\n if (!signal?.aborted) return undefined\r\n const reason = signal.reason\r\n if (isCancelCause(reason)) return reason\r\n return { type: 'abort' }\r\n}\r\n\r\n/** Map a completed loop to the typed durable reason a `turn/end` records. */\r\nfunction toTurnEndReason(fields: {\r\n cancelled: boolean\r\n turnError: unknown\r\n finishReason: AgentFinishReason\r\n cancelCause?: AgentCancelCause\r\n}): TurnEndReason {\r\n const { cancelled, turnError, finishReason, cancelCause } = fields\r\n if (cancelled || finishReason === 'cancelled') {\r\n return { kind: 'aborted', cause: cancelCause ?? { type: 'user' } }\r\n }\r\n if (turnError || finishReason === 'error') {\r\n return {\r\n kind: 'error',\r\n error: turnError\r\n ? toToolError(turnError)\r\n : { name: 'TurnError', message: finishReason },\r\n }\r\n }\r\n switch (finishReason) {\r\n case 'length':\r\n return { kind: 'max-tokens' }\r\n case 'max_steps':\r\n return { kind: 'max-steps' }\r\n case 'max_turns':\r\n return { kind: 'max-turns' }\r\n default:\r\n return { kind: 'completed' }\r\n }\r\n}\r\n\r\nfunction partialStreamContent(events: readonly LLMStreamEvent[]): string {\r\n let content = ''\r\n for (const event of events) {\r\n if (event.type === 'message_delta') content += event.delta\r\n }\r\n return content\r\n}\r\n\r\nasync function cancellableDelay(ms: number, signal?: AbortSignal): Promise<boolean> {\r\n if (ms <= 0) return !signal?.aborted\r\n if (signal?.aborted) return false\r\n return new Promise(resolve => {\r\n const timer = setTimeout(() => {\r\n signal?.removeEventListener('abort', onAbort)\r\n resolve(true)\r\n }, ms)\r\n const onAbort = (): void => {\r\n clearTimeout(timer)\r\n resolve(false)\r\n }\r\n signal?.addEventListener('abort', onAbort, { once: true })\r\n })\r\n}\r\n\r\nexport class AgentService {\r\n readonly inbox: AgentInbox\r\n private _seriesStarted = false\r\n private _persistedRequest = false\r\n\r\n constructor(\r\n private ctx: Context,\r\n private config: AgentConfig = {},\r\n ) {\r\n this.inbox = config.inbox ?? new AgentInbox()\r\n }\r\n\r\n /** Call when a request begins an explicit new model-message series. */\r\n startSeries(): void {\r\n this._seriesStarted = true\r\n }\r\n\r\n /** Clear any pending series marker after a completed run. */\r\n endSeriesBoundary(): void {\r\n this._seriesStarted = false\r\n }\r\n\r\n /** True when this service instance has already persisted a model-visible step. */\r\n get hasPersistedRequest(): boolean {\r\n return this._persistedRequest\r\n }\r\n\r\n async run(input?: AgentInput, options: AgentRunOptions = {}): Promise<AgentRunResult> {\r\n return consumeAgentStream(this._stream(input, options, false))\r\n }\r\n\r\n async *runStream(\r\n input?: AgentInput,\r\n options: AgentRunOptions = {},\r\n ): AsyncGenerator<AgentStreamEvent, AgentRunResult, void> {\r\n const iterator = this._stream(input, options)[Symbol.asyncIterator]()\r\n while (true) {\r\n const next = await iterator.next()\r\n if (next.done) return next.value\r\n yield next.value\r\n }\r\n }\r\n\r\n private async *_stream(\r\n input?: AgentInput,\r\n options: AgentRunOptions = {},\r\n useStream = true,\r\n ): AsyncGenerator<AgentStreamEvent, AgentRunResult, void> {\r\n const claimed = input ?? this.inbox.claim()\r\n if (!claimed) throw new AgentError('no agent input available')\r\n await this.config.hooks?.beforeRun?.(claimed, options)\r\n\r\n const session = this._session()\r\n const tools = this._tools()\r\n const llm = this._llm()\r\n if (!llm) throw new AgentError('no LLM adapter available')\r\n\r\n const maxTurns = options.maxTurns ?? this.config.maxTurns ?? 64\r\n const maxSteps = options.maxSteps ?? this.config.maxSteps ?? 64\r\n const contextBudget = options.contextBudget ?? this.config.contextBudget\r\n const injected = this.inbox.injected()\r\n this.ctx.emit('agent/start', { input: claimed, options, injected })\r\n\r\n let messages = await this._initialMessages(claimed)\r\n const steps: AgentStep[] = []\r\n let output = ''\r\n let finishReason: AgentFinishReason = 'stop'\r\n\r\n this.ctx.emit('agent/turn-start', {\r\n input: claimed,\r\n messages: copyMessages(messages),\r\n injected,\r\n })\r\n\r\n const turn = await session.nextTurn()\r\n await session.append('turn/start', {\r\n turn,\r\n input: claimed.text ?? claimed,\r\n reason: 'user',\r\n })\r\n\r\n let index = 0\r\n let finalTurnGranted = false\r\n let currentStepIndex: number | undefined\r\n let turnError: unknown\r\n try {\r\n while (index < maxTurns + (finalTurnGranted ? 1 : 0)) {\r\n if (options.signal?.aborted) {\r\n finishReason = 'cancelled'\r\n break\r\n }\r\n if (steps.length >= maxSteps) {\r\n finishReason = 'max_steps'\r\n break\r\n }\r\n if (contextBudget) {\r\n messages = await this._enforceContextBudget(session, contextBudget, messages)\r\n }\r\n\r\n const stepInput = copyMessages(messages)\r\n const preStep = this.ctx.waterfall('agent/pre-step', {\r\n index,\r\n turn,\r\n step: index,\r\n messages: stepInput,\r\n ...(options.signal ? { signal: options.signal } : {}),\r\n }, (payload: AgentPreStepEvent) => payload)\r\n if (!preStep || !Array.isArray(preStep.messages) || !preStep.messages.length) {\r\n break\r\n }\r\n if (preStep.startsRequestSeries) this._seriesStarted = true\r\n\r\n await session.append('step/start', { turn, step: index })\r\n currentStepIndex = index\r\n\r\n const requestedInput = copyMessages(preStep.messages)\r\n this.ctx.emit('agent/step', {\r\n index,\r\n turn,\r\n step: index,\r\n input: copyMessages(requestedInput),\r\n })\r\n const availableTools = finalTurnGranted ? [] : await this._resolveAvailableTools()\r\n const completeOptions: CompleteOptions = {\r\n maxSteps: maxSteps - steps.length,\r\n }\r\n if (options.signal) completeOptions.signal = options.signal\r\n\r\n const request = this.ctx.waterfall('agent/request', {\r\n index,\r\n messages: requestedInput,\r\n tools: availableTools,\r\n options: completeOptions,\r\n }, (payload: AgentRequestEvent) => payload)\r\n if (!request || !request.options || !request.tools) {\r\n throw new AgentError('agent/request must return a request payload')\r\n }\r\n let llmMessages = copyMessages(requestedInput)\r\n\r\n let completion: LLMCompletion | undefined\r\n const streamMethod = useStream ? llm.stream : undefined\r\n let attempt = 0\r\n let persistedStepInput = false\r\n while (true) {\r\n if (options.signal?.aborted) {\r\n finishReason = 'cancelled'\r\n break\r\n }\r\n const streamEvents: LLMStreamEvent[] = []\r\n try {\r\n if (streamMethod) {\r\n const streamRequest: LLMStreamRequestEvent = {\r\n index,\r\n messages: llmMessages,\r\n tools: request.tools,\r\n options: request.options,\r\n }\r\n const stream = await this.ctx.waterfallAsync(\r\n 'llm/stream',\r\n streamRequest,\r\n async (payload: LLMStreamRequestEvent) => {\r\n if (!streamMethod) {\r\n throw new AgentError('llm.stream is required for streaming runs')\r\n }\r\n return streamMethod(payload.messages, payload.tools, payload.options)\r\n },\r\n )\r\n if (!stream || typeof stream[Symbol.asyncIterator] !== 'function') {\r\n throw new AgentError('llm/stream must return an async iterable stream')\r\n }\r\n llmMessages = copyMessages(streamRequest.messages)\r\n if (!persistedStepInput) {\r\n await this._persistStepInput(session, request, llmMessages)\r\n if (this.config.assertReplayable) {\r\n await this._assertReplayable(session, llmMessages)\r\n }\r\n persistedStepInput = true\r\n }\r\n let chunkIndex = 0\r\n for await (const event of stream) {\r\n streamEvents.push(event)\r\n if (event.type === 'message_delta') {\r\n await session.append('assistant/chunk', {\r\n id: event.id,\r\n content: event.delta,\r\n index: chunkIndex,\r\n })\r\n chunkIndex += 1\r\n }\r\n yield event\r\n }\r\n completion = completionFromStreamEvents(streamEvents)\r\n } else {\r\n if (!persistedStepInput) {\r\n await this._persistStepInput(session, request, llmMessages)\r\n if (this.config.assertReplayable) {\r\n await this._assertReplayable(session, llmMessages)\r\n }\r\n persistedStepInput = true\r\n }\r\n completion = await llm.complete(llmMessages, request.tools, request.options)\r\n }\r\n break\r\n } catch (error) {\r\n const content = partialStreamContent(streamEvents)\r\n if (content) {\r\n await session.append('assistant/message', {\r\n content,\r\n interrupted: true,\r\n })\r\n llmMessages = await session.deriveMessages()\r\n }\r\n if (options.signal?.aborted) {\r\n finishReason = 'cancelled'\r\n break\r\n }\r\n attempt += 1\r\n const failure = toToolError(error)\r\n const decision = await this.ctx.waterfallAsync(\r\n 'agent/request-error',\r\n {\r\n index,\r\n turn,\r\n step: index,\r\n messages: copyMessages(llmMessages),\r\n tools: request.tools,\r\n options: request.options,\r\n attempt,\r\n error,\r\n failure,\r\n ...(request.options.provider ? { provider: request.options.provider } : {}),\r\n ...(request.options.model ? { model: request.options.model } : {}),\r\n ...(options.signal ? { signal: options.signal } : {}),\r\n } satisfies AgentRequestErrorEvent,\r\n () => undefined,\r\n ) as AgentRequestRetryDecision\r\n if (options.signal?.aborted) {\r\n finishReason = 'cancelled'\r\n break\r\n }\r\n if (decision?.kind !== 'retry') throw error\r\n const retryId = randomUUID()\r\n const delayMs = decision.delayMs ?? 0\r\n await session.append('llm/retry', {\r\n retryId,\r\n retry: attempt,\r\n ...(delayMs > 0 ? { delayMs } : {}),\r\n failure: toToolError(error),\r\n })\r\n if (!await cancellableDelay(delayMs, options.signal)) {\r\n finishReason = 'cancelled'\r\n break\r\n }\r\n await session.append('llm/retry-started', { retryId, retry: attempt })\r\n }\r\n }\r\n if (options.signal?.aborted) break\r\n if (!completion) throw new AgentError('LLM adapter did not produce a completion')\r\n\r\n const toolCalls = completion.toolCalls ?? []\r\n if (finalTurnGranted && toolCalls.length) {\r\n finishReason = 'max_turns'\r\n break\r\n }\r\n const toolResults: ToolResult[] = []\r\n if (toolCalls.length) {\r\n await session.append('assistant/message', {\r\n content: completion.content ?? '',\r\n toolCalls: toolCalls.map(call => ({\r\n id: call.id,\r\n name: call.name,\r\n arguments: call.arguments,\r\n })),\r\n })\r\n }\r\n for (const call of toolCalls) {\r\n this.ctx.emit('agent/tool-call', { index, turn, step: index, call })\r\n yield { type: 'tool/start', index, turn, step: index, call }\r\n await session.append('tool/call', {\r\n id: call.id,\r\n name: call.name,\r\n arguments: call.arguments,\r\n })\r\n const toolOptions: { callId: string; signal?: AbortSignal } = { callId: call.id }\r\n if (options.signal) toolOptions.signal = options.signal\r\n const startedAt = Date.now()\r\n let result: ToolResult\r\n try {\r\n result = await tools.execute(call.name, call.arguments, toolOptions)\r\n } catch (error) {\r\n result = {\r\n ok: false,\r\n name: call.name,\r\n callId: call.id,\r\n input: call.arguments,\r\n error: toToolError(error),\r\n startedAt,\r\n durationMs: Date.now() - startedAt,\r\n }\r\n }\r\n toolResults.push(result)\r\n const toolResultPayload: ToolResultPayload = {\r\n id: call.id,\r\n toolCallId: call.id,\r\n name: call.name,\r\n ok: result.ok,\r\n durationMs: result.durationMs,\r\n }\r\n if (result.output !== undefined) toolResultPayload.output = result.output\r\n if (result.error) {\r\n toolResultPayload.error = {\r\n name: result.error.name,\r\n message: result.error.message,\r\n }\r\n if (result.error.stack) toolResultPayload.error.stack = result.error.stack\r\n }\r\n await session.append('tool/result', toolResultPayload)\r\n yield { type: 'tool/end', index, turn, step: index, call, result }\r\n this.ctx.emit('agent/tool-result', {\r\n index,\r\n turn,\r\n step: index,\r\n call,\r\n result,\r\n })\r\n }\r\n if (options.signal?.aborted) {\r\n finishReason = 'cancelled'\r\n break\r\n }\r\n\r\n steps.push({\r\n index,\r\n input: copyMessages(llmMessages),\r\n completion,\r\n toolResults,\r\n })\r\n\r\n if (completion.content) {\r\n output = completion.content\r\n }\r\n if (!toolCalls.length) {\r\n await session.append('assistant/message', { content: completion.content ?? '' })\r\n }\r\n\r\n await session.append('step/end', {\r\n turn,\r\n step: index,\r\n finishReason: completion.finishReason,\r\n toolCalls: toolCalls.length,\r\n })\r\n currentStepIndex = undefined\r\n\r\n const nextMessages = this._extendMessages(llmMessages, completion, toolResults)\r\n const concludesTurn = toolResults.some(result => result.concludesTurn === true)\r\n if (concludesTurn) {\r\n finishReason = 'stop'\r\n break\r\n }\r\n if (toolCalls.length === 0) {\r\n finishReason = completion.finishReason === 'length'\r\n ? 'length'\r\n : completion.finishReason === 'error'\r\n ? 'error'\r\n : 'stop'\r\n const keepGoing = await this.ctx.serial('agent/turn-stopping', {\r\n index,\r\n turn,\r\n steps: copySteps(steps),\r\n finishReason,\r\n } satisfies AgentTurnStoppingEvent) as unknown\r\n if (!keepGoing) break\r\n }\r\n if (index + 1 >= maxTurns && !finalTurnGranted) {\r\n finalTurnGranted = true\r\n } else if (index + 1 >= maxTurns + (finalTurnGranted ? 1 : 0)) {\r\n finishReason = 'max_turns'\r\n break\r\n }\r\n if (toolCalls.length) finishReason = 'tool_calls'\r\n index += 1\r\n messages = nextMessages\r\n }\r\n } catch (error) {\r\n turnError = error\r\n throw error\r\n } finally {\r\n const cancelCause = cancelCauseFromSignal(options.signal)\r\n if (currentStepIndex !== undefined) {\r\n const cancelled = options.signal?.aborted\r\n await session.append('step/end', {\r\n turn,\r\n step: currentStepIndex,\r\n finishReason: cancelled\r\n ? 'cancelled'\r\n : turnError\r\n ? 'error'\r\n : 'interrupted',\r\n interrupted: true,\r\n ...(cancelCause ? { cancelCause } : {}),\r\n ...(turnError ? { error: toToolError(turnError) } : {}),\r\n })\r\n }\r\n await session.append('turn/end', {\r\n turn,\r\n finishReason: turnError\r\n ? (options.signal?.aborted ? 'cancelled' : 'error')\r\n : finishReason,\r\n reason: toTurnEndReason({\r\n cancelled: options.signal?.aborted ?? false,\r\n turnError,\r\n finishReason: turnError\r\n ? (options.signal?.aborted ? 'cancelled' : 'error')\r\n : finishReason,\r\n ...(cancelCause ? { cancelCause } : {}),\r\n }),\r\n ...(cancelCause ? { cancelCause } : {}),\r\n ...(output ? { output } : {}),\r\n ...(steps.length ? { steps: steps.length } : {}),\r\n ...(turnError ? { interrupted: true, error: toToolError(turnError) } : {}),\r\n })\r\n }\r\n\r\n const runResult: AgentRunResult = {\r\n input: claimed,\r\n output,\r\n finishReason,\r\n turn,\r\n steps,\r\n messages: copyMessages(messages),\r\n }\r\n this.ctx.emit('agent/turn-end', {\r\n input: claimed,\r\n steps: copySteps(steps),\r\n messages: copyMessages(messages),\r\n output,\r\n finishReason,\r\n })\r\n this.ctx.emit('agent/end', {\r\n input: claimed,\r\n steps: copySteps(steps),\r\n messages: copyMessages(messages),\r\n output,\r\n finishReason,\r\n })\r\n await this.config.hooks?.afterRun?.(runResult, options)\r\n\r\n yield { type: 'run/end', run: runResult }\r\n return runResult\r\n }\r\n\r\n private async _enforceContextBudget(\r\n session: SessionLog,\r\n budget: AgentContextBudget,\r\n messages: readonly ModelMessage[],\r\n ): Promise<ModelMessage[]> {\r\n const limit = budget.limit ?? DEFAULT_CONTEXT_LIMIT\r\n const compactRatio = budget.compactRatio ?? 0.9\r\n if (limit <= 0 || compactRatio <= 0 || compactRatio > 1) {\r\n throw new AgentError('invalid context budget: limit must be positive and compactRatio must be in (0, 1]')\r\n }\r\n const usage = estimateContextUsage(messages, limit)\r\n if (usage.ratio < compactRatio) return copyMessages(messages)\r\n const keepTokens = budget.keepTokens ?? Math.max(1, Math.floor(limit * 0.5))\r\n const compactMessages = budget.summarize\r\n ? await budget.summarize(messages, usage)\r\n : [{ role: 'system' as const, content: defaultContextSummary(messages, usage) }]\r\n const summary = compactMessages\r\n .map(message => `${message.role}: ${message.content}`)\r\n .join('\\n')\r\n await session.compact({\r\n keepTokens,\r\n summary,\r\n tokensBefore: usage.tokens,\r\n messages: compactMessages.map(message => copyMessages([message])[0]!),\r\n })\r\n this.ctx.emit('agent/context-compact', {\r\n type: 'agent/context-compact',\r\n messagesBefore: messages.length,\r\n tokensBefore: usage.tokens,\r\n limit,\r\n keepTokens,\r\n messagesAfter: compactMessages.length,\r\n })\r\n return compactMessages.map(message => copyMessages([message])[0]!)\r\n }\r\n\r\n private async _persistStepInput(\r\n session: SessionLog,\r\n request: AgentRequestEvent,\r\n input: readonly ModelMessage[],\r\n ): Promise<void> {\r\n const system = input.find(message => message.role === 'system')?.content\r\n const tools = request.tools.map(tool => ({\r\n name: tool.schema.name,\r\n description: tool.schema.description,\r\n ...(tool.schema.parameters ? { parameters: tool.schema.parameters } : {}),\r\n }))\r\n const config = {\r\n ...(request.options.provider ? { provider: request.options.provider } : {}),\r\n ...(request.options.model ? { model: request.options.model } : {}),\r\n ...(request.options.temperature !== undefined\r\n ? { temperature: request.options.temperature }\r\n : {}),\r\n }\r\n const nextHeader = {\r\n ...(Object.keys(config).length ? { config } : {}),\r\n ...(system !== undefined ? { system } : {}),\r\n ...(tools.length ? { tools } : {}),\r\n }\r\n const previousHeader = session.requestHeader()\r\n const isFirstRequest = !this._persistedRequest\r\n const isResume = isFirstRequest && previousHeader !== undefined\r\n this._persistedRequest = true\r\n const changedHeader = previousHeader && (\r\n previousHeader.system !== nextHeader.system\r\n || JSON.stringify(previousHeader.tools ?? []) !== JSON.stringify(nextHeader.tools ?? [])\r\n || JSON.stringify(previousHeader.config ?? {}) !== JSON.stringify(nextHeader.config ?? {})\r\n )\r\n if (isFirstRequest) {\r\n await session.append('request/header', {\r\n reason: this._seriesStarted\r\n ? 'series'\r\n : isResume\r\n ? 'resume'\r\n : 'initial',\r\n ...nextHeader,\r\n ...(this._seriesStarted ? { startsSeries: true } : {}),\r\n })\r\n } else if (changedHeader) {\r\n await session.append('request/header', {\r\n reason: this._seriesStarted ? 'change-series' : 'change',\r\n ...nextHeader,\r\n startsSeries: true,\r\n })\r\n } else if (this._seriesStarted) {\r\n await session.append('request/header', {\r\n reason: 'series',\r\n ...nextHeader,\r\n startsSeries: true,\r\n })\r\n }\r\n this._seriesStarted = false\r\n\r\n const nextContext: RequestContextPayload = {\r\n ...(request.options.provider ? { provider: request.options.provider } : {}),\r\n ...(request.options.model ? { model: request.options.model } : {}),\r\n }\r\n const llmService = this.ctx.reflect.get('llm', false) as\r\n | { routeCapacity(): unknown }\r\n | undefined\r\n const routeCapacity = llmService?.routeCapacity?.() as\r\n | { provider?: string; model?: string; contextWindow?: number }\r\n | undefined\r\n if (routeCapacity?.contextWindow !== undefined) {\r\n nextContext.contextWindow = routeCapacity.contextWindow\r\n }\r\n const previousContext = session.requestContext()\r\n if (\r\n previousContext?.provider !== nextContext.provider\r\n || previousContext?.model !== nextContext.model\r\n || previousContext?.contextWindow !== nextContext.contextWindow\r\n || (previousContext === undefined)\r\n ) {\r\n await session.append('request/context', nextContext)\r\n }\r\n const requested = input.filter(isUserOrSystemMessage)\r\n const surface = await session.deriveMessages()\r\n // The session surface is the durable history. A caller (e.g. the web run\r\n // handler) includes the full derived history as model context and also\r\n // prepends run-scoped system prompts that are NOT part of the surface.\r\n // Counting those systems against the surface inflates the \"new\" tail and\r\n // re-appends already-persisted user turns (every resumed run duplicated\r\n // the preceding user message in the log). Durable user messages are always\r\n // a prefix of the requested user messages \u2014 new turns arrive last \u2014 so\r\n // anchor on users: only what follows the last durable user is genuinely\r\n // new. Text-based matching stays unsafe because the same user text can\r\n // legitimately repeat across turns.\r\n const appendDurable = async (messages: readonly ModelMessage[]): Promise<void> => {\r\n for (const message of messages) {\r\n if (message.role === 'user') {\r\n await session.append('user/message', {\r\n content: message.content,\r\n ...(message.name ? { name: message.name } : {}),\r\n })\r\n } else {\r\n await session.append('system/message', {\r\n content: message.content,\r\n ...(message.name ? { name: message.name } : {}),\r\n })\r\n }\r\n }\r\n }\r\n if (surface.length === 0) {\r\n // Fresh log: nothing is durable yet; persist the whole requested head so\r\n // the initial system prompt and first user turn land in the log.\r\n await appendDurable(requested)\r\n return\r\n }\r\n const durableUsers = surface.filter(message => message.role === 'user').length\r\n let seenUsers = 0\r\n const newTail: ModelMessage[] = []\r\n for (const message of requested) {\r\n if (message.role === 'user') seenUsers += 1\r\n if (seenUsers <= durableUsers) continue // already on the durable surface\r\n newTail.push(message)\r\n }\r\n await appendDurable(newTail)\r\n }\r\n\r\n private async _assertReplayable(\r\n session: SessionLog,\r\n input: readonly ModelMessage[],\r\n ): Promise<void> {\r\n const reconstructed = await session.deriveMessages()\r\n const canonical = (messages: readonly ModelMessage[]) => messages\r\n .filter(message => message.role !== 'system')\r\n .map(message => ({\r\n role: message.role,\r\n content: message.content,\r\n ...(message.tool_call_id ? { tool_call_id: message.tool_call_id } : {}),\r\n ...(message.name ? { name: message.name } : {}),\r\n ...(message.tool_calls?.length\r\n ? { tool_calls: message.tool_calls.map(call => ({\r\n id: call.id,\r\n name: call.name,\r\n args: JSON.stringify(call.arguments ?? {}),\r\n })) }\r\n : {}),\r\n }))\r\n const actual = canonical(input)\r\n const replay = canonical(reconstructed)\r\n if (JSON.stringify(actual) !== JSON.stringify(replay)) {\r\n throw new AgentError(\r\n `request is not reconstructable from session log: actual=${JSON.stringify(actual)} replay=${JSON.stringify(replay)}`,\r\n )\r\n }\r\n }\r\n\r\n private async _initialMessages(input: AgentInput): Promise<ModelMessage[]> {\r\n const promptService = this.ctx.reflect.get('systemPrompt', false) as\r\n | { assemble(options?: object): Promise<{ text: string }> }\r\n | undefined\r\n const assembled = promptService\r\n ? (await promptService.assemble()).text.trim()\r\n : undefined\r\n const systemPrompt = assembled || this.inbox.injected().get('agentSystem')\r\n const systemMessage = typeof systemPrompt === 'string' && systemPrompt\r\n ? [{ role: 'system' as const, content: systemPrompt }]\r\n : []\r\n if (input.messages?.length) {\r\n const first = input.messages[0]\r\n if (first?.role === 'system') return copyMessages(input.messages)\r\n return [...systemMessage, ...copyMessages(input.messages)]\r\n }\r\n if (input.text) return [...systemMessage, { role: 'user', content: input.text }]\r\n return systemMessage\r\n }\r\n\r\n private _extendMessages(\r\n messages: readonly ModelMessage[],\r\n completion: LLMCompletion,\r\n toolResults: readonly ToolResult[],\r\n ): ModelMessage[] {\r\n const next = copyMessages(messages)\r\n const assistant: ModelMessage = {\r\n role: 'assistant',\r\n content: completion.content ?? '',\r\n }\r\n const toolCalls = completion.toolCalls ?? []\r\n if (toolCalls.length) {\r\n assistant.tool_calls = toolCalls.map(call => ({\r\n id: call.id,\r\n name: call.name,\r\n arguments: call.arguments,\r\n }))\r\n }\r\n next.push(assistant)\r\n\r\n for (const call of toolCalls) {\r\n const result = toolResults.find(candidate => candidate.callId === call.id)\r\n const content = result\r\n ? result.ok\r\n ? stringify(result.output)\r\n : `error: ${result.error?.message ?? 'unknown'}`\r\n : 'error: missing tool result'\r\n const message: ModelMessage = {\r\n role: 'tool',\r\n content,\r\n tool_call_id: call.id,\r\n }\r\n message.name = result?.name ?? call.name\r\n if (result && !result.ok) {\r\n message.toolOk = false\r\n if (result.error) {\r\n message.toolError = {\r\n name: result.error.name,\r\n message: result.error.message,\r\n }\r\n }\r\n }\r\n next.push(message)\r\n }\r\n return next\r\n }\r\n\r\n private _session(): SessionLog {\r\n if (this.config.session) return this.config.session\r\n const session = (this.ctx as unknown as { session?: SessionLog }).session\r\n if (!session) throw new AgentError('session service is required')\r\n return session\r\n }\r\n\r\n private _tools(): ToolsService {\r\n const tools = (this.ctx as unknown as { tools?: ToolsService }).tools\r\n if (!tools) throw new AgentError('tools service is required')\r\n return tools\r\n }\r\n\r\n private async _resolveAvailableTools(): Promise<readonly ToolDefinition[]> {\r\n // Executable tools are the single source of truth. When a system-prompt\r\n // service is mounted, its assembled schema list narrows what the model\r\n // sees \u2014 but only to tools that are actually registered, so a declared\r\n // schema can never advertise an un-executable stub.\r\n const executable = this._tools().list()\r\n const promptService = this.ctx.reflect.get('systemPrompt', false) as\r\n | { toolSchemas(options?: object): Promise<readonly ToolSchemaSnapshot[]> }\r\n | undefined\r\n if (!promptService) return executable\r\n const schemas = await promptService.toolSchemas()\r\n if (!schemas.length) return executable\r\n const byName = new Map(executable.map(tool => [tool.schema.name, tool] as const))\r\n return schemas\r\n .map(schema => byName.get(schema.name))\r\n .filter((tool): tool is ToolDefinition => tool !== undefined)\r\n }\r\n\r\n private _llm(): LLMAdapter | undefined {\r\n if (this.config.llm) return this.config.llm\r\n const service = this.ctx.reflect.get('llm', false) as\r\n | { current(): LLMAdapter | undefined }\r\n | undefined\r\n return service?.current()\r\n }\r\n}\r\n\r\nfunction defaultContextSummary(\r\n messages: readonly ModelMessage[],\r\n usage: { tokens: number },\r\n): string {\r\n const latest = messages.at(-1)\r\n const latestText = latest ? `${latest.role}: ${latest.content}` : 'none'\r\n return [\r\n 'Earlier context was compacted.',\r\n `Messages before compaction: ${messages.length}.`,\r\n `Tokens before compaction: ${usage.tokens}.`,\r\n `Latest message: ${latestText}`,\r\n ].join(' ')\r\n}\r\n\r\nfunction copySteps(steps: readonly AgentStep[]): readonly AgentStep[] {\r\n return steps.map(step => ({\r\n index: step.index,\r\n input: copyMessages(step.input),\r\n completion: copyCompletion(step.completion),\r\n toolResults: step.toolResults.map(result => ({ ...result })),\r\n }))\r\n}\r\n\r\nfunction toToolError(error: unknown): ToolError {\r\n if (error instanceof Error) {\r\n const result: ToolError = {\r\n name: error.name,\r\n message: error.message,\r\n }\r\n if (error.stack) result.stack = error.stack\r\n return result\r\n }\r\n return {\r\n name: 'ToolExecutionError',\r\n message: String(error),\r\n }\r\n}\r\n\r\nfunction completionFromStreamEvents(events: readonly LLMStreamEvent[]): LLMCompletion {\r\n let content = ''\r\n const calls = new Map<number, LLMToolCall>()\r\n let finishReason: AgentFinishReason = 'error'\r\n for (const event of events) {\r\n if (event.type === 'message_delta') {\r\n content += event.delta\r\n } else if (event.type === 'toolcall_end') {\r\n calls.set(event.index, {\r\n id: event.id,\r\n name: event.name,\r\n arguments: event.arguments,\r\n })\r\n } else if (event.type === 'message_stop') {\r\n finishReason = event.finishReason\r\n }\r\n }\r\n const completion: LLMCompletion = { finishReason }\r\n if (content) completion.content = content\r\n if (calls.size) completion.toolCalls = [...calls.values()]\r\n return completion\r\n}\r\n\r\nasync function consumeAgentStream(\r\n stream: AsyncGenerator<AgentStreamEvent, AgentRunResult, void>,\r\n): Promise<AgentRunResult> {\r\n const iterator = stream[Symbol.asyncIterator]()\r\n while (true) {\r\n const next = await iterator.next()\r\n if (next.done) return next.value\r\n }\r\n}\r\n\r\nexport const agent = {\r\n name: 'agent',\r\n inject: ['session', 'tools'],\r\n apply: (ctx: Context, config: AgentConfig = {}) => {\r\n const service = new AgentService(ctx, config)\r\n ctx.provide('agent', service)\r\n ctx.provide('agentLoop', (input?: AgentInput, options?: AgentRunOptions) => service.run(input, options))\r\n ctx.provide('inbox', service.inbox)\r\n return () => {}\r\n },\r\n}\r\n\r\nexport const name = '@tnega/agent'\r\n", "import { randomUUID } from 'node:crypto'\r\nimport { appendFile, mkdir, readFile, writeFile } from 'node:fs/promises'\r\nimport { dirname, resolve } from 'node:path'\r\nimport type { Context } from '@tnega/core'\r\nimport { checkSessionInvariants, type SessionInvariantFailure } from './invariant.js'\r\n\r\n/**\r\n * v7 derives model-visible messages from the *folded surface* instead of from\r\n * raw file order, so compaction can stay strictly append-only.\r\n *\r\n * v6 rewrote the log on every real compaction: the kept tail was physically\r\n * reordered after the checkpoint (and every seq renumbered) purely so that a\r\n * file-order projection would equal the surface. v7 removes that coupling:\r\n * `deriveMessages()` walks the surface nodes in surface position order (a\r\n * replacement node may carry a *higher* seq than the nodes that follow it),\r\n * so compaction appends `compaction/start` \u2192 `checkpoint` (prefix +\r\n * `surfaceOp.replace` range) \u2192 `compaction/end` and never rewrites history.\r\n * To keep every surface node self-describing, `assistant/message` now carries\r\n * its own `toolCalls` (the assistant turn is not reassembled from separate\r\n * `tool/call` events at projection time).\r\n *\r\n * v6 logs are rejected (no migration in the pre-release window).\r\n */\r\nexport const SESSION_FORMAT_VERSION = 7\r\n\r\n/** Serialized tool schema, structurally compatible with @tnega/tools ToolSchema. */\r\nexport interface ToolSchemaSnapshot {\r\n name: string\r\n description: string\r\n parameters?: Record<string, unknown>\r\n}\r\n\r\n/** Call configuration recorded beside a request so it can be reconstructed. */\r\nexport interface LlmCallConfig {\r\n provider?: string\r\n model?: string\r\n maxTokens?: number\r\n temperature?: number\r\n reasoningEffort?: string\r\n}\r\n\r\nexport class SessionFormatError extends Error {\r\n override name = 'SessionFormatError'\r\n}\r\n\r\nconst liveSessions = new Map<string, SessionLog>()\r\n\r\nfunction sessionFileKey(file: string): string {\r\n return resolve(file)\r\n}\r\n\r\nexport type ModelRole = 'system' | 'user' | 'assistant' | 'tool'\r\n\r\nexport interface ModelToolCall {\r\n id: string\r\n name: string\r\n arguments: unknown\r\n}\r\n\r\nexport interface ModelMessage {\r\n role: ModelRole\r\n content: string\r\n name?: string\r\n tool_call_id?: string\r\n tool_calls?: ModelToolCall[]\r\n toolOk?: boolean\r\n toolError?: ToolResultErrorPayload\r\n}\r\n\r\nexport interface UserMessagePayload {\r\n content: string\r\n name?: string\r\n parentId?: string\r\n}\r\n\r\nexport interface AssistantMessagePayload {\r\n content: string\r\n name?: string\r\n parentId?: string\r\n interrupted?: boolean\r\n /**\r\n * The tool requests this assistant turn made, when it made any. The model\r\n * transcript is derived node-by-node from the surface, so an assistant turn\r\n * must carry its calls itself rather than being reassembled from the\r\n * separate (log-only) `tool/call` events that follow it.\r\n */\r\n toolCalls?: ModelToolCall[]\r\n}\r\n\r\nexport interface AssistantChunkPayload {\r\n id: string\r\n content: string\r\n index?: number\r\n}\r\n\r\nexport interface SystemMessagePayload {\r\n content: string\r\n name?: string\r\n parentId?: string\r\n}\r\n\r\nexport type MessageEventPayload =\r\n | UserMessagePayload\r\n | AssistantMessagePayload\r\n | SystemMessagePayload\r\n\r\nexport type MessageEventType = 'user/message' | 'assistant/message' | 'system/message'\r\n\r\nexport interface CompactionStartPayload {\r\n boundary?: number\r\n keep?: number\r\n tokensBefore?: number\r\n}\r\n\r\nexport interface CompactionEndPayload {\r\n checkpointId?: string\r\n keep?: number\r\n}\r\n\r\nexport interface ToolCallPayload {\r\n id: string\r\n name: string\r\n arguments: unknown\r\n /** Exact raw arguments JSON as produced by the model; preserves serialization. */\r\n argRaw?: string\r\n turn?: number\r\n step?: number\r\n}\r\n\r\nexport interface ToolResultErrorPayload {\r\n name?: string\r\n message: string\r\n stack?: string\r\n}\r\n\r\nexport interface ToolResultPayload {\r\n id: string\r\n toolCallId: string\r\n name: string\r\n ok: boolean\r\n durationMs?: number\r\n output?: unknown\r\n error?: ToolResultErrorPayload\r\n argRaw?: string\r\n turn?: number\r\n step?: number\r\n}\r\n\r\nexport type CancelCause =\r\n | { type: 'user' }\r\n | { type: 'parent' }\r\n | { type: 'disposed' }\r\n | { type: 'abort'; message?: string }\r\n | { type: 'timeout'; timeoutMs: number }\r\n\r\n/**\r\n * Why a turn ended \u2014 the durable machine outcome, distinct from the\r\n * per-step model `finishReason`. Written on `turn/end`.\r\n */\r\nexport type TurnEndReason =\r\n | { kind: 'completed' }\r\n | { kind: 'aborted'; cause: CancelCause }\r\n | { kind: 'blocked' }\r\n | { kind: 'error'; error: ToolResultErrorPayload }\r\n | { kind: 'max-tokens' }\r\n | { kind: 'max-steps' }\r\n | { kind: 'max-turns' }\r\n | { kind: 'interrupted' }\r\n\r\nexport interface TurnStartPayload {\r\n turn: number\r\n input?: unknown\r\n reason?: string\r\n}\r\n\r\nexport interface TurnEndPayload {\r\n turn: number\r\n finishReason?: string\r\n /** The typed durable reason this turn ended. Supersedes `finishReason`. */\r\n reason?: TurnEndReason\r\n output?: string\r\n steps?: number\r\n interrupted?: boolean\r\n cancelCause?: CancelCause\r\n error?: ToolResultErrorPayload\r\n}\r\n\r\nexport interface StepStartPayload {\r\n turn: number\r\n step: number\r\n}\r\n\r\nexport interface StepEndPayload {\r\n turn: number\r\n step: number\r\n finishReason?: string\r\n toolCalls?: number\r\n interrupted?: boolean\r\n cancelCause?: CancelCause\r\n error?: ToolResultErrorPayload\r\n}\r\n\r\nexport interface LLMRetryPayload {\r\n retryId: string\r\n retry: number\r\n delayMs?: number\r\n failure?: ToolResultErrorPayload\r\n}\r\n\r\nexport interface LLMRetryStartedPayload {\r\n retryId: string\r\n retry: number\r\n}\r\n\r\n/** How a `request/header` snapshot enters the log. */\r\nexport type RequestHeaderReason =\r\n | 'initial'\r\n | 'resume'\r\n | 'change'\r\n | 'series'\r\n | 'change-series'\r\n\r\nexport interface RequestHeaderPayload {\r\n reason: RequestHeaderReason\r\n config?: LlmCallConfig\r\n /** Rendered system prompt; absent for a system-less request. */\r\n system?: string\r\n /** Assembled tool schemas; absent for a tool-less request. */\r\n tools?: ToolSchemaSnapshot[]\r\n /** True when this snapshot also begins a new model-message series. */\r\n startsSeries?: boolean\r\n}\r\n\r\nexport interface RequestContextPayload {\r\n provider?: string\r\n model?: string\r\n contextWindow?: number\r\n}\r\n\r\nexport interface CheckpointPayload {\r\n /** The compacted prefix: messages the model keeps seeing after compaction. */\r\n messages: ModelMessage[]\r\n summary?: string\r\n tokensBefore?: number\r\n /**\r\n * The surface span this checkpoint shadows, when written by a v7\r\n * compaction: `start`/`end` are the seqs of the first and last *surface\r\n * nodes* being replaced (surface positions, so `start` may be numerically\r\n * greater than `end` after an earlier compaction). The fold removes every\r\n * live node between those two positions and inserts this checkpoint there;\r\n * the kept tail stays in place and the log is never rewritten.\r\n * `'replace'` (bare string) is the legacy v5 form and shadows nothing\r\n * structurally; projection treats it as a full-surface seed.\r\n */\r\n surfaceOp?: { op: 'replace'; start: number; end: number } | 'replace'\r\n /** @deprecated v0.2 keeps raw events in place; use messages instead. */\r\n snapshot?: SessionEvent[]\r\n}\r\n\r\nexport type PlanItemStatus = 'pending' | 'done' | 'failed'\r\n\r\nexport interface PlanItemPayload {\r\n id: string\r\n title: string\r\n status: PlanItemStatus\r\n detail?: string\r\n}\r\n\r\nexport interface PlanPayload {\r\n items: PlanItemPayload[]\r\n status?: 'pending' | 'running' | 'done' | 'failed'\r\n summary?: string\r\n}\r\n\r\nexport interface InboxSplicePayload {\r\n target: 'next-turn' | 'next-step'\r\n index?: number\r\n deleteCount?: number\r\n inserted?: Array<{\r\n id: string\r\n content: string\r\n /** Structured message payload preserved across restart when present. */\r\n payload?: unknown\r\n mode?: 'followup' | 'steer'\r\n }>\r\n}\r\n\r\n/** A durable change to session display metadata (title, mode, agentType). */\r\nexport interface MetaPatchPayload {\r\n /** Keys changed by this event; only present keys are touched. */\r\n fields: Array<'title' | 'agentType' | 'mode'>\r\n title?: string\r\n agentType?: AgentType\r\n mode?: SessionMode\r\n}\r\n\r\nexport type AgentType = 'general' | 'coding'\r\n\r\nexport type SessionMode = 'auto' | 'plan' | 'execute'\r\n\r\nexport type SessionEventType =\r\n | MessageEventType\r\n | 'assistant/chunk'\r\n | 'tool/call'\r\n | 'tool/result'\r\n | 'request/header'\r\n | 'request/context'\r\n | 'agent/inbox/spliced'\r\n | 'plan'\r\n | 'checkpoint'\r\n | 'compaction/start'\r\n | 'compaction/end'\r\n | 'meta'\r\n | 'meta/patch'\r\n | 'llm/retry'\r\n | 'llm/retry-started'\r\n | 'turn/start'\r\n | 'turn/end'\r\n | 'step/start'\r\n | 'step/end'\r\n\r\nexport interface SessionEventBase<T extends SessionEventType, P> {\r\n id: string\r\n seq: number\r\n ts: number\r\n type: T\r\n payload: P\r\n /** Surface placement; required on message-producing events. */\r\n surfaceOp?: SurfaceOp\r\n /** Seqs of earlier raw events this event derives from. */\r\n sourceEventSeqs?: number[]\r\n}\r\n\r\n/**\r\n * The message-producing subset of event types. Every variant is a surface\r\n * node that carries `surfaceOp` and participates in the ordered fold.\r\n * `system/message` is included because tnega keeps the system prompt on the\r\n * transcript (OpenAI-style), so it must be replaceable and derivable like any\r\n * other message rather than living only in `request/header`.\r\n */\r\nexport type SurfaceEventType =\r\n | 'user/message'\r\n | 'system/message'\r\n | 'assistant/message'\r\n | 'tool/result'\r\n\r\nexport type SurfaceOp = 'append' | { op: 'replace'; start: number; end: number }\r\n\r\nexport type SessionEvent =\r\n | SessionEventBase<'user/message', UserMessagePayload>\r\n | SessionEventBase<'assistant/message', AssistantMessagePayload>\r\n | SessionEventBase<'assistant/chunk', AssistantChunkPayload>\r\n | SessionEventBase<'system/message', SystemMessagePayload>\r\n | SessionEventBase<'tool/call', ToolCallPayload>\r\n | SessionEventBase<'tool/result', ToolResultPayload>\r\n | SessionEventBase<'request/header', RequestHeaderPayload>\r\n | SessionEventBase<'request/context', RequestContextPayload>\r\n | SessionEventBase<'agent/inbox/spliced', InboxSplicePayload>\r\n | SessionEventBase<'plan', PlanPayload>\r\n | SessionEventBase<'checkpoint', CheckpointPayload>\r\n | SessionEventBase<'compaction/start', CompactionStartPayload>\r\n | SessionEventBase<'compaction/end', CompactionEndPayload>\r\n | SessionEventBase<'meta', Record<string, unknown>>\r\n | SessionEventBase<'meta/patch', MetaPatchPayload>\r\n | SessionEventBase<'llm/retry', LLMRetryPayload>\r\n | SessionEventBase<'llm/retry-started', LLMRetryStartedPayload>\r\n | SessionEventBase<'turn/start', TurnStartPayload>\r\n | SessionEventBase<'turn/end', TurnEndPayload>\r\n | SessionEventBase<'step/start', StepStartPayload>\r\n | SessionEventBase<'step/end', StepEndPayload>\r\n\r\nfunction isMessageEventType(type: SessionEventType): type is MessageEventType {\r\n return type === 'user/message'\r\n || type === 'assistant/message'\r\n || type === 'system/message'\r\n}\r\n\r\nfunction isMessageEvent(\r\n event: SessionEvent,\r\n): event is Extract<SessionEvent, { type: MessageEventType }> {\r\n return isMessageEventType(event.type)\r\n}\r\n\r\nexport interface SessionConfig {\r\n file: string\r\n broadcast?: SessionBroadcast\r\n}\r\n\r\nexport interface CompactOptions {\r\n keep?: number\r\n keepTokens?: number\r\n summary?: string\r\n tokensBefore?: number\r\n messages?: ModelMessage[]\r\n}\r\n\r\nexport type ReplayReducer<T> = (state: T, event: SessionEvent) => T | Promise<T>\r\n\r\nexport type SessionBroadcast = (\r\n type: 'event' | 'flush',\r\n payload: unknown,\r\n) => void\r\n\r\nexport interface ContextUsage {\r\n tokens: number\r\n limit: number\r\n ratio: number\r\n}\r\n\r\nexport const DEFAULT_CONTEXT_LIMIT = 128_000\r\n\r\nfunction isSessionEvent(value: unknown): value is SessionEvent {\r\n if (typeof value !== 'object' || value === null) return false\r\n const record = value as Record<string, unknown>\r\n return typeof record.id === 'string'\r\n && typeof record.seq === 'number'\r\n && typeof record.ts === 'number'\r\n && typeof record.type === 'string'\r\n && 'payload' in record\r\n}\r\n\r\nfunction clone<T>(value: T): T {\r\n return structuredClone(value)\r\n}\r\n\r\nfunction previousSurfaceSeq(nodes: readonly number[]): number | undefined {\r\n return nodes.at(-1)\r\n}\r\n\r\n/**\r\n * Project an event list to model messages, in the list's own order. Each\r\n * surface event is mapped through {@link deriveEventMessage}; a `checkpoint`\r\n * splices its compacted prefix in at its position. This is the building block\r\n * both {@link deriveSurfaceMessages} (surface order) and callers holding a\r\n * compact slice (e.g. the events a summarizer will read) share.\r\n */\r\nexport function projectEvents(events: readonly SessionEvent[]): ModelMessage[] {\r\n const messages: ModelMessage[] = []\r\n for (const event of events) {\r\n if (event.type === 'checkpoint') {\r\n messages.splice(0, messages.length, ...clone(event.payload.messages))\r\n continue\r\n }\r\n const message = deriveEventMessage(event)\r\n if (message) messages.push(message)\r\n }\r\n return messages\r\n}\r\n\r\nexport function isAppendSurfaceEvent(event: SessionEvent): boolean {\r\n return isSurfaceEventType(event.type) && event.surfaceOp === 'append'\r\n}\r\n\r\nexport function isSurfaceEventType(type: SessionEventType): type is SurfaceEventType {\r\n return type === 'user/message'\r\n || type === 'system/message'\r\n || type === 'assistant/message'\r\n || type === 'tool/result'\r\n}\r\n\r\n/** A v7 checkpoint shadows a surface span; legacy ('replace') shadows nothing structurally. */\r\nexport function checkpointShadowRange(\r\n event: SessionEvent,\r\n): { start: number; end: number } | undefined {\r\n if (event.type !== 'checkpoint') return undefined\r\n const op = event.payload.surfaceOp\r\n if (typeof op === 'object' && op !== null && op.op === 'replace') {\r\n return { start: op.start, end: op.end }\r\n }\r\n return undefined\r\n}\r\n\r\n/** Detached current surface nodes plus every replacement's shadowed ranges. */\r\nexport interface SurfaceFoldReplacement {\r\n seq: number\r\n start: number\r\n end: number\r\n shadowedSeqs: number[]\r\n}\r\n\r\nexport interface SurfaceFoldResult {\r\n nodes: number[]\r\n replacements: SurfaceFoldReplacement[]\r\n}\r\n\r\n/**\r\n * Fold a log's surface operations into the current surface node order.\r\n *\r\n * The surface is *positional*: a replacement removes the live nodes between\r\n * the positions of `start`/`end` and inserts the replacing event's seq there,\r\n * so surface order is independent of raw seq order \u2014 after compaction the\r\n * checkpoint node may carry a higher seq than the kept tail that follows it.\r\n */\r\nexport function foldSurface(events: readonly SessionEvent[]): SurfaceFoldResult {\r\n const nodes: number[] = []\r\n const replacements: SurfaceFoldReplacement[] = []\r\n\r\n const applyReplace = (seq: number, start: number, end: number): void => {\r\n const startIndex = nodes.indexOf(start)\r\n if (startIndex < 0) {\r\n // The shadowed head is already gone (defensive; our writer always\r\n // shadows live nodes). Keep the prefix visible by anchoring at the tail.\r\n nodes.push(seq)\r\n return\r\n }\r\n const endIndex = nodes.indexOf(end, startIndex)\r\n if (endIndex < 0) {\r\n nodes.push(seq)\r\n return\r\n }\r\n const shadowed = nodes.splice(startIndex, endIndex - startIndex + 1)\r\n nodes.splice(startIndex, 0, seq)\r\n replacements.push({ seq, start, end, shadowedSeqs: shadowed })\r\n }\r\n\r\n for (const event of events) {\r\n if (event.type === 'checkpoint') {\r\n const range = checkpointShadowRange(event)\r\n if (!range) {\r\n // A range-less checkpoint is a prefix seed: it contributes its own\r\n // node at its surface position (used when compaction runs before any\r\n // durable history exists to shadow).\r\n nodes.push(event.seq)\r\n continue\r\n }\r\n applyReplace(event.seq, range.start, range.end)\r\n continue\r\n }\r\n if (!isSurfaceEventType(event.type)) continue\r\n const op = event.surfaceOp ?? 'append'\r\n if (op === 'append') {\r\n nodes.push(event.seq)\r\n continue\r\n }\r\n applyReplace(event.seq, op.start, op.end)\r\n }\r\n return { nodes, replacements }\r\n}\r\n\r\n/**\r\n * Derive one surface node's model-visible message. A content-less assistant\r\n * turn (e.g. a max-token cutoff with no output and no tool calls) is skipped\r\n * so it never enters a provider transcript; `tool/result` yields the `tool`\r\n * role message that pairs with the assistant's `toolCalls`.\r\n */\r\nexport function deriveEventMessage(event: SessionEvent): ModelMessage | null {\r\n switch (event.type) {\r\n case 'user/message': {\r\n const message: ModelMessage = { role: 'user', content: event.payload.content }\r\n if (event.payload.name) message.name = event.payload.name\r\n return message\r\n }\r\n case 'system/message': {\r\n const message: ModelMessage = { role: 'system', content: event.payload.content }\r\n if (event.payload.name) message.name = event.payload.name\r\n return message\r\n }\r\n case 'assistant/message': {\r\n const toolCalls = event.payload.toolCalls\r\n if (!event.payload.content && !(toolCalls && toolCalls.length)) return null\r\n const message: ModelMessage = { role: 'assistant', content: event.payload.content }\r\n if (event.payload.name) message.name = event.payload.name\r\n if (toolCalls?.length) message.tool_calls = clone(toolCalls)\r\n return message\r\n }\r\n case 'tool/result': {\r\n const failed = !event.payload.ok\r\n const message: ModelMessage = {\r\n role: 'tool',\r\n content: failed\r\n ? `error: ${event.payload.error?.message ?? 'unknown'}`\r\n : stringify(event.payload.output),\r\n tool_call_id: event.payload.toolCallId,\r\n }\r\n message.name = event.payload.name\r\n if (failed) {\r\n message.toolOk = false\r\n if (event.payload.error) message.toolError = event.payload.error\r\n }\r\n return message\r\n }\r\n default:\r\n return null\r\n }\r\n}\r\n\r\n/**\r\n * Derive the model transcript strictly from the folded surface: walk the\r\n * surface nodes in surface position order (so a checkpoint's prefix is placed\r\n * where it replaced history, whatever its raw seq), mapping each node through\r\n * {@link deriveEventMessage}. This is the single source of the model's view;\r\n * raw log order never influences it.\r\n */\r\nexport function deriveSurfaceMessages(events: readonly SessionEvent[]): ModelMessage[] {\r\n const { nodes } = foldSurface(events)\r\n const bySeq = new Map(events.map(event => [event.seq, event] as const))\r\n const messages: ModelMessage[] = []\r\n for (const seq of nodes) {\r\n const event = bySeq.get(seq)\r\n if (!event) continue\r\n if (event.type === 'checkpoint') {\r\n messages.splice(0, messages.length, ...clone(event.payload.messages))\r\n continue\r\n }\r\n const message = deriveEventMessage(event)\r\n if (message) messages.push(message)\r\n }\r\n return messages\r\n}\r\n\r\n/**\r\n * Project the log into a human-facing transcript (the web view). Unlike the\r\n * model surface, a compaction does **not** hide the history it summarized:\r\n * shadowed messages are kept in place, and each live checkpoint is retained\r\n * as a marker exactly where it replaced them (with nested checkpoints\r\n * expanded recursively). Readers see the full conversation; the model keeps\r\n * deriving from the folded surface via {@link deriveSurfaceMessages}.\r\n */\r\nexport function transcriptEvents(events: readonly SessionEvent[]): SessionEvent[] {\r\n const bySeq = new Map(events.map(event => [event.seq, event] as const))\r\n const { nodes, replacements } = foldSurface(events)\r\n\r\n const shadowedOf = new Map<number, SessionEvent[]>()\r\n for (const replacement of replacements) {\r\n shadowedOf.set(replacement.seq, replacement.shadowedSeqs\r\n .map(seq => bySeq.get(seq))\r\n .filter((event): event is SessionEvent => event !== undefined))\r\n }\r\n\r\n const isVisible = (event: SessionEvent): boolean => (\r\n event.type !== 'system/message' && isSurfaceEventType(event.type)\r\n )\r\n\r\n const skeleton: SessionEvent[] = []\r\n const appendHistory = (checkpointSeq: number): void => {\r\n for (const shadowed of shadowedOf.get(checkpointSeq) ?? []) {\r\n if (shadowed.type === 'checkpoint') appendHistory(shadowed.seq)\r\n else if (isVisible(shadowed)) skeleton.push(shadowed)\r\n }\r\n }\r\n for (const seq of nodes) {\r\n const event = bySeq.get(seq)\r\n if (!event) continue\r\n if (event.type === 'checkpoint') appendHistory(event.seq)\r\n skeleton.push(event)\r\n }\r\n\r\n // Declared tool calls travel on their assistant message, so the matching\r\n // log-only `tool/call` records would double-render: drop those, keep the\r\n // legacy ones that have no assistant declaration.\r\n const declaredCalls = new Set<string>()\r\n for (const event of events) {\r\n if (event.type === 'assistant/message') {\r\n for (const call of event.payload.toolCalls ?? []) declaredCalls.add(call.id)\r\n }\r\n }\r\n const inSkeleton = new Set(skeleton.map(event => event.id))\r\n const structure = events\r\n .filter(event => !inSkeleton.has(event.id))\r\n .filter(event => event.type !== 'compaction/start' && event.type !== 'compaction/end')\r\n .filter(event => event.type !== 'checkpoint') // superseded markers: history shown via the live chain\r\n .filter(event => !(event.type === 'tool/call' && declaredCalls.has(event.payload.id)))\r\n\r\n const ordered = [...skeleton]\r\n for (const event of structure) {\r\n let index = ordered.length\r\n for (let cursor = ordered.length - 1; cursor >= 0; cursor -= 1) {\r\n if (ordered[cursor]!.seq <= event.seq) {\r\n index = cursor + 1\r\n break\r\n }\r\n }\r\n ordered.splice(index, 0, event)\r\n }\r\n return ordered\r\n}\r\n\r\nexport function foldRequestHeader(events: readonly SessionEvent[]): RequestHeaderPayload | undefined {\r\n let header: RequestHeaderPayload | undefined\r\n for (const event of events) {\r\n if (event.type === 'request/header') header = clone(event.payload)\r\n }\r\n return header\r\n}\r\n\r\nexport function foldRequestContext(events: readonly SessionEvent[]): RequestContextPayload | undefined {\r\n let context: RequestContextPayload | undefined\r\n for (const event of events) {\r\n if (event.type === 'request/context') context = clone(event.payload)\r\n }\r\n return context\r\n}\r\n\r\n/**\r\n * Session display metadata, rebuilt from the immutable events: the head\r\n * `meta` base followed by every `meta/patch` in seq order. No mutable\r\n * side file or in-place rewrite is involved, so title/mode/agentType stay\r\n * replayable and fork-clean like every other durable fact.\r\n */\r\nexport function foldSessionMeta(events: readonly SessionEvent[]): {\r\n title?: string\r\n agentType?: AgentType\r\n mode?: SessionMode\r\n} {\r\n const meta: { title?: string; agentType?: AgentType; mode?: SessionMode } = {}\r\n for (const event of events) {\r\n if (event.type === 'meta') {\r\n const payload = event.payload as Record<string, unknown>\r\n if (typeof payload.title === 'string') meta.title = payload.title\r\n if (payload.agentType === 'general' || payload.agentType === 'coding') {\r\n meta.agentType = payload.agentType\r\n }\r\n if (payload.mode === 'auto' || payload.mode === 'plan' || payload.mode === 'execute') {\r\n meta.mode = payload.mode\r\n }\r\n continue\r\n }\r\n if (event.type === 'meta/patch') {\r\n const patch = event.payload\r\n if (patch.fields.includes('title') && typeof patch.title === 'string') {\r\n meta.title = patch.title\r\n }\r\n if (patch.fields.includes('agentType') && patch.agentType !== undefined) {\r\n meta.agentType = patch.agentType\r\n }\r\n if (patch.fields.includes('mode') && patch.mode !== undefined) {\r\n meta.mode = patch.mode\r\n }\r\n }\r\n }\r\n return meta\r\n}\r\n\r\n/** Convenience wrapper: fold session metadata from a `SessionLog`'s events. */\r\nexport function foldMetaFromLog(log: { read(): Promise<SessionEvent[]> }): Promise<{\r\n title?: string\r\n agentType?: AgentType\r\n mode?: SessionMode\r\n}> {\r\n return log.read().then(foldSessionMeta)\r\n}\r\n\r\nfunction stringify(value: unknown): string {\r\n if (typeof value === 'string') return value\r\n try {\r\n return JSON.stringify(value) ?? String(value)\r\n } catch {\r\n return String(value)\r\n }\r\n}\r\n\r\nexport function estimateMessageTokens(messages: readonly ModelMessage[]): number {\r\n let tokens = 0\r\n for (const message of messages) {\r\n tokens += Math.ceil(message.content.length / 4)\r\n for (const call of message.tool_calls ?? []) {\r\n const raw = JSON.stringify(call.arguments ?? {}) ?? ''\r\n tokens += Math.ceil(raw.length / 4)\r\n }\r\n }\r\n return tokens\r\n}\r\n\r\nexport function estimateEventTokens(event: SessionEvent): number {\r\n switch (event.type) {\r\n case 'user/message':\r\n case 'system/message':\r\n return Math.ceil(event.payload.content.length / 4)\r\n case 'assistant/message': {\r\n let tokens = Math.ceil(event.payload.content.length / 4)\r\n for (const call of event.payload.toolCalls ?? []) {\r\n const raw = JSON.stringify(call.arguments ?? {}) ?? ''\r\n tokens += Math.ceil(raw.length / 4)\r\n }\r\n return tokens\r\n }\r\n case 'assistant/chunk':\r\n return Math.ceil(event.payload.content.length / 4)\r\n case 'tool/call': {\r\n const raw = JSON.stringify(event.payload.arguments ?? {}) ?? ''\r\n return Math.ceil(raw.length / 4)\r\n }\r\n case 'tool/result': {\r\n const raw = event.payload.ok\r\n ? stringify(event.payload.output)\r\n : event.payload.error?.message ?? 'error'\r\n return Math.ceil(raw.length / 4)\r\n }\r\n case 'plan':\r\n return 0\r\n case 'checkpoint':\r\n return estimateMessageTokens(event.payload.messages)\r\n case 'compaction/start':\r\n case 'compaction/end':\r\n case 'meta':\r\n case 'meta/patch':\r\n return 0\r\n case 'llm/retry':\r\n case 'llm/retry-started':\r\n return 0\r\n case 'request/header':\r\n case 'request/context':\r\n case 'agent/inbox/spliced':\r\n return 0\r\n case 'turn/start':\r\n case 'turn/end':\r\n case 'step/start':\r\n case 'step/end':\r\n return 0\r\n }\r\n}\r\n\r\nexport function suffixStartIndexForTokens(\r\n events: readonly SessionEvent[],\r\n targetTokens: number,\r\n): number {\r\n if (!events.length || targetTokens <= 0) return 0\r\n let tokens = 0\r\n let candidate = events.length\r\n for (let index = events.length - 1; index >= 0; index -= 1) {\r\n tokens += estimateEventTokens(events[index]!)\r\n if (tokens >= targetTokens) {\r\n candidate = index\r\n break\r\n }\r\n }\r\n if (candidate === events.length) return 0\r\n let cut = candidate\r\n while (cut < events.length) {\r\n const event = events[cut]\r\n if (event?.type === 'user/message') return cut\r\n cut += 1\r\n }\r\n return candidate\r\n}\r\n\r\nexport function safeCompactSplit(\r\n events: readonly SessionEvent[],\r\n splitIndex: number,\r\n): number {\r\n const index = Math.max(0, Math.min(splitIndex, events.length))\r\n const first = events[index]\r\n if (first?.type === 'tool/result') {\r\n const callId = first.payload.toolCallId\r\n for (let cursor = index - 1; cursor >= 0; cursor -= 1) {\r\n const candidate = events[cursor]\r\n if (candidate?.type === 'tool/call' && candidate.payload.id === callId) {\r\n return cursor\r\n }\r\n }\r\n }\r\n\r\n let openCalls = 0\r\n for (let cursor = 0; cursor <= events.length; cursor += 1) {\r\n if (cursor >= index && openCalls === 0) return cursor\r\n const event = events[cursor]\r\n if (!event) continue\r\n if (event.type === 'tool/call') openCalls += 1\r\n if (event.type === 'tool/result') openCalls = Math.max(0, openCalls - 1)\r\n }\r\n return index\r\n}\r\n\r\nexport function repairUnclosed(\r\n events: readonly SessionEvent[],\r\n): SessionEvent[] {\r\n const openCalls: Extract<SessionEvent, { type: 'tool/call' }>[] = []\r\n const openSteps: Extract<SessionEvent, { type: 'step/start' }>[] = []\r\n const openTurns: Extract<SessionEvent, { type: 'turn/start' }>[] = []\r\n for (const event of events) {\r\n switch (event.type) {\r\n case 'tool/call':\r\n openCalls.push(event)\r\n break\r\n case 'tool/result': {\r\n const callIndex = openCalls.findIndex(\r\n call => call.payload.id === event.payload.toolCallId,\r\n )\r\n if (callIndex >= 0) openCalls.splice(callIndex, 1)\r\n else openCalls.pop()\r\n break\r\n }\r\n case 'step/start':\r\n openSteps.push(event)\r\n break\r\n case 'step/end':\r\n openSteps.pop()\r\n break\r\n case 'turn/start':\r\n openTurns.push(event)\r\n break\r\n case 'turn/end':\r\n openTurns.pop()\r\n break\r\n }\r\n }\r\n\r\n if (!openCalls.length && !openSteps.length && !openTurns.length) return []\r\n\r\n const synthetic: SessionEvent[] = []\r\n let nextSeq = (events.at(-1)?.seq ?? 0) + 1\r\n let nextTs = (events.at(-1)?.ts ?? Date.now()) + 1\r\n const push = (type: SessionEventType, payload: SessionEvent['payload']): void => {\r\n synthetic.push({\r\n id: randomUUID(),\r\n seq: nextSeq,\r\n ts: nextTs,\r\n type: type as SessionEvent['type'],\r\n payload: clone(payload),\r\n } as SessionEvent)\r\n nextSeq += 1\r\n nextTs += 1\r\n }\r\n\r\n for (const call of openCalls) {\r\n push('tool/result', {\r\n id: call.payload.id,\r\n toolCallId: call.payload.id,\r\n name: call.payload.name,\r\n ok: false,\r\n error: {\r\n name: 'SessionInterruptedError',\r\n message: 'session interrupted before tool result was recorded',\r\n },\r\n })\r\n }\r\n for (const step of openSteps) {\r\n push('step/end', {\r\n turn: step.payload.turn,\r\n step: step.payload.step,\r\n finishReason: 'interrupted',\r\n interrupted: true,\r\n })\r\n }\r\n for (let i = 0; i < openTurns.length; i++) {\r\n const turn = openTurns[i]!.payload.turn\r\n push('turn/end', {\r\n turn,\r\n finishReason: 'interrupted',\r\n interrupted: true,\r\n })\r\n }\r\n return synthetic\r\n}\r\n\r\nexport function resolveCompactKeep(\r\n events: readonly SessionEvent[],\r\n options: CompactOptions,\r\n): number {\r\n if (\r\n typeof options.keepTokens === 'number'\r\n && Number.isFinite(options.keepTokens)\r\n && options.keepTokens > 0\r\n ) {\r\n return events.length - suffixStartIndexForTokens(events, options.keepTokens)\r\n }\r\n const keep = typeof options.keep === 'number' && Number.isFinite(options.keep) && options.keep > 0\r\n ? Math.floor(options.keep)\r\n : 0\r\n return Math.min(keep, events.length)\r\n}\r\n\r\nexport function estimateContextUsage(\r\n messages: readonly ModelMessage[],\r\n limit = DEFAULT_CONTEXT_LIMIT,\r\n): ContextUsage {\r\n const tokens = estimateMessageTokens(messages)\r\n return {\r\n tokens,\r\n limit,\r\n ratio: limit > 0 ? tokens / limit : 0,\r\n }\r\n}\r\n\r\nexport class SessionLog {\r\n private _events: SessionEvent[] = []\r\n private _surface: ModelMessage[] = []\r\n private _surfaceNodes: number[] = []\r\n private _requestHeader: RequestHeaderPayload | undefined\r\n private _requestContext: RequestContextPayload | undefined\r\n private _loaded = false\r\n private _nextSeq = 1\r\n private _queue: Promise<unknown> = Promise.resolve()\r\n private _writeTail: Promise<void> = Promise.resolve()\r\n private _pending: SessionEvent[] = []\r\n private _drainScheduled = false\r\n private _writeError: unknown\r\n\r\n constructor(\r\n readonly file: string,\r\n private _broadcast?: SessionBroadcast,\r\n ) {}\r\n\r\n init(): Promise<void> {\r\n return this._run(async () => {\r\n const key = sessionFileKey(this.file)\r\n if (!liveSessions.has(key)) liveSessions.set(key, this)\r\n try {\r\n await this._ensureLoaded()\r\n await this._drainWrite()\r\n if (this._writeError) {\r\n const error = this._writeError\r\n this._writeError = undefined\r\n throw error\r\n }\r\n } catch (error) {\r\n if (liveSessions.get(key) === this) liveSessions.delete(key)\r\n throw error\r\n }\r\n })\r\n }\r\n\r\n append(type: 'user/message', payload: UserMessagePayload): Promise<SessionEvent>\r\n append(type: 'assistant/message', payload: AssistantMessagePayload): Promise<SessionEvent>\r\n append(type: 'assistant/chunk', payload: AssistantChunkPayload): Promise<SessionEvent>\r\n append(type: 'system/message', payload: SystemMessagePayload): Promise<SessionEvent>\r\n append(type: 'tool/call', payload: ToolCallPayload): Promise<SessionEvent>\r\n append(type: 'tool/result', payload: ToolResultPayload): Promise<SessionEvent>\r\n append(type: 'request/header', payload: RequestHeaderPayload): Promise<SessionEvent>\r\n append(type: 'request/context', payload: RequestContextPayload): Promise<SessionEvent>\r\n append(type: 'agent/inbox/spliced', payload: InboxSplicePayload): Promise<SessionEvent>\r\n append(type: 'plan', payload: PlanPayload): Promise<SessionEvent>\r\n append(type: 'checkpoint', payload: CheckpointPayload): Promise<SessionEvent>\r\n append(type: 'compaction/start', payload: CompactionStartPayload): Promise<SessionEvent>\r\n append(type: 'compaction/end', payload: CompactionEndPayload): Promise<SessionEvent>\r\n append(type: 'meta', payload: Record<string, unknown>): Promise<SessionEvent>\r\n append(type: 'meta/patch', payload: MetaPatchPayload): Promise<SessionEvent>\r\n append(type: 'llm/retry', payload: LLMRetryPayload): Promise<SessionEvent>\r\n append(type: 'llm/retry-started', payload: LLMRetryStartedPayload): Promise<SessionEvent>\r\n append(type: 'turn/start', payload: TurnStartPayload): Promise<SessionEvent>\r\n append(type: 'turn/end', payload: TurnEndPayload): Promise<SessionEvent>\r\n append(type: 'step/start', payload: StepStartPayload): Promise<SessionEvent>\r\n append(type: 'step/end', payload: StepEndPayload): Promise<SessionEvent>\r\n append(type: SessionEventType, payload: SessionEvent['payload']): Promise<SessionEvent> {\r\n return this._run(async () => {\r\n await this._ensureLoaded()\r\n const event = this._buildEvent(type, payload)\r\n this._commitEvent(event)\r\n return event\r\n })\r\n }\r\n\r\n private _buildEvent(\r\n type: SessionEventType,\r\n payload: SessionEvent['payload'],\r\n ): SessionEvent {\r\n const eventPayload = clone(payload)\r\n const event = {\r\n id: randomUUID(),\r\n seq: this._nextSeq,\r\n ts: Date.now(),\r\n type: type as SessionEvent['type'],\r\n payload: eventPayload,\r\n } as SessionEvent\r\n if (isMessageEventType(type)) {\r\n for (let index = this._events.length - 1; index >= 0; index -= 1) {\r\n const previous = this._events[index]\r\n if (previous && isMessageEvent(previous)) {\r\n const messagePayload = eventPayload as MessageEventPayload\r\n messagePayload.parentId ??= previous.id\r\n break\r\n }\r\n }\r\n event.surfaceOp ??= 'append'\r\n const previous = previousSurfaceSeq(this._surfaceNodes)\r\n event.sourceEventSeqs ??= previous === undefined ? [] : [previous]\r\n } else if (type === 'request/header') {\r\n event.sourceEventSeqs ??= []\r\n } else if (type === 'request/context') {\r\n event.sourceEventSeqs ??= []\r\n } else if (type === 'agent/inbox/spliced') {\r\n event.sourceEventSeqs ??= []\r\n }\r\n this._nextSeq += 1\r\n return event\r\n }\r\n\r\n private _commitEvent(event: SessionEvent): void {\r\n this._events.push(event)\r\n this._refreshSurface()\r\n if (event.type === 'request/header') this._requestHeader = clone(event.payload)\r\n if (event.type === 'request/context') this._requestContext = clone(event.payload)\r\n this._broadcast?.('event', event)\r\n this._enqueue(event)\r\n }\r\n\r\n /**\r\n * Rebuild both surface views from the committed log. The nodes come from the\r\n * positional {@link foldSurface} fold; the messages come from\r\n * {@link deriveSurfaceMessages}, which walks those nodes in surface order \u2014\r\n * the model view is a pure function of the surface, never of raw file order.\r\n */\r\n private _refreshSurface(): void {\r\n this._surfaceNodes = foldSurface(this._events).nodes\r\n this._surface = deriveSurfaceMessages(this._events)\r\n }\r\n\r\n private _enqueue(event: SessionEvent): void {\r\n this._pending.push(event)\r\n if (this._drainScheduled) return\r\n this._drainScheduled = true\r\n setImmediate(() => {\r\n this._drainScheduled = false\r\n void this._drainWrite()\r\n })\r\n }\r\n\r\n private _drainWrite(): Promise<void> {\r\n const events = this._pending.splice(0)\r\n if (!events.length) return this._writeTail\r\n const write = this._writeTail.then(() => appendFile(\r\n this.file,\r\n `${events.map(event => JSON.stringify(event)).join('\\n')}\\n`,\r\n 'utf8',\r\n ))\r\n this._writeTail = write.catch((error) => {\r\n this._writeError ??= error\r\n })\r\n return write.then(() => undefined, () => undefined)\r\n }\r\n\r\n flush(): Promise<number> {\r\n return this._run(async () => {\r\n await this._ensureLoaded()\r\n await this._drainWrite()\r\n if (this._writeError) {\r\n const error = this._writeError\r\n this._writeError = undefined\r\n throw error\r\n }\r\n const seq = this._nextSeq - 1\r\n this._broadcast?.('flush', { file: this.file, seq })\r\n return seq\r\n })\r\n }\r\n\r\n async lineage(messageId: string): Promise<SessionEvent[]> {\r\n return this._run(async () => {\r\n await this._ensureLoaded()\r\n return this._resolveLineage(messageId)\r\n })\r\n }\r\n\r\n /** The next turn number: one more than the highest recorded `turn/start`. */\r\n async nextTurn(): Promise<number> {\r\n return this._run(async () => {\r\n await this._ensureLoaded()\r\n let max = 0\r\n for (const event of this._events) {\r\n if (event.type === 'turn/start') max = Math.max(max, event.payload.turn)\r\n }\r\n return max + 1\r\n })\r\n }\r\n\r\n async forkAt(messageId: string): Promise<SessionEvent[]> {\r\n return this._run(async () => {\r\n await this._ensureLoaded()\r\n const lineage = this._resolveLineage(messageId)\r\n const lineageIds = new Set(lineage.map(event => event.id))\r\n const targetIndex = this._events.findIndex(\r\n event => event.id === messageId && isMessageEvent(event),\r\n )\r\n if (targetIndex < 0) {\r\n throw new Error(`message not found: ${messageId}`)\r\n }\r\n const selected: SessionEvent[] = []\r\n let skippedMessage = false\r\n for (let index = 0; index <= targetIndex; index += 1) {\r\n const event = this._events[index]!\r\n if (isMessageEvent(event)) {\r\n if (!lineageIds.has(event.id)) {\r\n skippedMessage = true\r\n continue\r\n }\r\n skippedMessage = false\r\n selected.push(clone(event))\r\n continue\r\n }\r\n if (\r\n event.type === 'meta'\r\n || event.type === 'llm/retry'\r\n || event.type === 'llm/retry-started'\r\n || event.type.startsWith('turn/')\r\n || event.type.startsWith('step/')\r\n ) {\r\n continue\r\n }\r\n if (event.type === 'checkpoint') {\r\n selected.push(clone(event))\r\n continue\r\n }\r\n if (!skippedMessage) {\r\n selected.push(clone(event))\r\n }\r\n }\r\n return selected\r\n })\r\n }\r\n\r\n read(): Promise<SessionEvent[]> {\r\n return this._run(async () => {\r\n await this._ensureLoaded()\r\n return this._events.map(event => clone(event))\r\n })\r\n }\r\n\r\n deriveMessages(): Promise<ModelMessage[]> {\r\n return this._run(async () => {\r\n await this._ensureLoaded()\r\n return clone(this._surface)\r\n })\r\n }\r\n\r\n /** The ordered surface events, after compaction replacements are applied. */\r\n surfaceEvents(): Promise<SessionEvent[]> {\r\n return this._run(async () => {\r\n await this._ensureLoaded()\r\n const bySeq = new Map(this._events.map(event => [event.seq, event] as const))\r\n return this._surfaceNodes\r\n .map(seq => bySeq.get(seq))\r\n .filter((event): event is SessionEvent => event !== undefined)\r\n .map(event => clone(event))\r\n })\r\n }\r\n\r\n /** The latest `request/header` snapshot, or undefined before the first one. */\r\n requestHeader(): RequestHeaderPayload | undefined {\r\n return this._requestHeader ? clone(this._requestHeader) : undefined\r\n }\r\n\r\n /** The latest resolved route metadata, or undefined before the first one. */\r\n requestContext(): RequestContextPayload | undefined {\r\n return this._requestContext ? clone(this._requestContext) : undefined\r\n }\r\n\r\n /** Display metadata folded from the durable `meta` + `meta/patch` events. */\r\n meta(): Promise<{ title?: string; agentType?: AgentType; mode?: SessionMode }> {\r\n return this._run(async () => {\r\n await this._ensureLoaded()\r\n return foldSessionMeta(this._events)\r\n })\r\n }\r\n\r\n estimateContext(limit = DEFAULT_CONTEXT_LIMIT): Promise<ContextUsage> {\r\n return this._run(async () => {\r\n await this._ensureLoaded()\r\n return estimateContextUsage(this._surface, limit)\r\n })\r\n }\r\n\r\n replay(): Promise<SessionEvent[]>\r\n replay<T>(reduce: ReplayReducer<T>, initial: T): Promise<T>\r\n replay<T>(reduce?: ReplayReducer<T>, initial?: T): Promise<SessionEvent[] | T> {\r\n return this.read().then((events) => {\r\n if (!reduce) return events\r\n let state = initial as T\r\n let pending: Promise<void> = Promise.resolve()\r\n for (const event of events) {\r\n pending = pending.then(async () => {\r\n state = await reduce(state, event)\r\n })\r\n }\r\n return pending.then(() => state)\r\n })\r\n }\r\n\r\n /** Structural violations in the loaded event stream (empty = balanced). */\r\n runInvariants(): Promise<SessionInvariantFailure[]> {\r\n return this._run(async () => {\r\n await this._ensureLoaded()\r\n return checkSessionInvariants(this._events)\r\n })\r\n }\r\n\r\n /**\r\n * Compact the session without ever rewriting history.\r\n *\r\n * The surface (not the raw log) is the unit of compaction. A kept suffix \u2014\r\n * measured in tokens via `keepTokens`, or in nodes via `keep`, and always\r\n * snapped to start on a fresh `user/message` turn so a tool result never\r\n * outlives the assistant call it answers \u2014 stays visible; every earlier\r\n * surface node is shadowed by the checkpoint's `surfaceOp.replace` range.\r\n * The three compaction events are appended like any other event, so seqs\r\n * stay immutable, live observers see the transition, and a crash can only\r\n * leave an orphaned `compaction/start` rather than a torn rewrite.\r\n *\r\n * Returns the new event count, or the unchanged count when there is no\r\n * useful surface span to shadow.\r\n */\r\n compact(options: CompactOptions = {}): Promise<number> {\r\n return this._run(async () => {\r\n await this._ensureLoaded()\r\n const events = this._events\r\n const bySeq = new Map(events.map(event => [event.seq, event] as const))\r\n const surfaceEvents = foldSurface(events).nodes\r\n .map(seq => bySeq.get(seq))\r\n .filter((event): event is SessionEvent => event !== undefined)\r\n\r\n const keep = resolveCompactKeep(surfaceEvents, options)\r\n let split = Math.max(0, surfaceEvents.length - keep)\r\n // The retained tail must open on a fresh user turn: shadowing an\r\n // assistant step while keeping its tool results would leave an orphan\r\n // tool message at the head of the transcript. Prefer the next user\r\n // boundary; when the candidate sits inside the final turn, keep that\r\n // whole turn instead of cutting it.\r\n if (split < surfaceEvents.length && surfaceEvents[split]!.type !== 'user/message') {\r\n let next = split\r\n while (next < surfaceEvents.length && surfaceEvents[next]!.type !== 'user/message') next += 1\r\n if (next < surfaceEvents.length) {\r\n split = next\r\n } else {\r\n let lastUser = surfaceEvents.length - 1\r\n while (lastUser >= 0 && surfaceEvents[lastUser]!.type !== 'user/message') lastUser -= 1\r\n split = lastUser >= 0 ? lastUser : surfaceEvents.length\r\n }\r\n }\r\n const shadowed = surfaceEvents.slice(0, split)\r\n if (!options.messages?.length) return this._events.length\r\n\r\n // A compaction needs a summary to write. When there is history to\r\n // shadow the checkpoint replaces that head span; when there is none (a\r\n // budget trip before anything is durable) the checkpoint seeds the\r\n // surface with the compacted prefix instead.\r\n const range = shadowed.length\r\n ? { start: shadowed[0]!.seq, end: shadowed[shadowed.length - 1]!.seq }\r\n : undefined\r\n const boundary = split\r\n this._commitEvent(this._buildEvent('compaction/start', {\r\n ...(boundary > 0 ? { boundary } : {}),\r\n ...(options.keep !== undefined ? { keep: options.keep } : {}),\r\n ...(options.tokensBefore !== undefined ? { tokensBefore: options.tokensBefore } : {}),\r\n }))\r\n const checkpoint = this._buildEvent('checkpoint', {\r\n messages: clone(options.messages),\r\n ...(range ? { surfaceOp: { op: 'replace', start: range.start, end: range.end } } : {}),\r\n ...(options.summary ? { summary: options.summary } : {}),\r\n ...(options.tokensBefore !== undefined ? { tokensBefore: options.tokensBefore } : {}),\r\n })\r\n this._commitEvent(checkpoint)\r\n this._commitEvent(this._buildEvent('compaction/end', {\r\n checkpointId: checkpoint.id,\r\n ...(options.keep !== undefined ? { keep: options.keep } : {}),\r\n }))\r\n return this._events.length\r\n })\r\n }\r\n\r\n close(): Promise<void> {\r\n return this._queue.then(async () => {\r\n await this._drainWrite()\r\n if (this._writeError) {\r\n const error = this._writeError\r\n this._writeError = undefined\r\n throw error\r\n }\r\n const key = sessionFileKey(this.file)\r\n if (liveSessions.get(key) === this) liveSessions.delete(key)\r\n })\r\n }\r\n\r\n private _run<T>(task: () => Promise<T>): Promise<T> {\r\n const next = this._queue.then(task, task)\r\n this._queue = next.then(() => undefined, () => undefined)\r\n return next\r\n }\r\n\r\n private async _ensureLoaded(): Promise<void> {\r\n if (this._loaded) return\r\n const key = sessionFileKey(this.file)\r\n const owner = liveSessions.get(key)\r\n if (owner && owner !== this && owner._loaded) {\r\n this._events = owner._events.map(event => clone(event))\r\n this._surface = clone(owner._surface)\r\n this._surfaceNodes = [...owner._surfaceNodes]\r\n this._requestHeader = owner._requestHeader ? clone(owner._requestHeader) : undefined\r\n this._requestContext = owner._requestContext ? clone(owner._requestContext) : undefined\r\n this._nextSeq = owner._nextSeq\r\n this._loaded = true\r\n return\r\n }\r\n await mkdir(dirname(resolve(this.file)), { recursive: true })\r\n const read = await this._read()\r\n if (!read.existing) {\r\n const meta: SessionEvent = {\r\n id: randomUUID(),\r\n seq: 1,\r\n ts: Date.now(),\r\n type: 'meta',\r\n payload: { formatVersion: SESSION_FORMAT_VERSION },\r\n }\r\n await writeFile(this.file, `${JSON.stringify(meta)}\\n`, 'utf8')\r\n this._events = [meta]\r\n this._refreshSurface()\r\n this._nextSeq = 2\r\n this._loaded = true\r\n return\r\n }\r\n this._events = read.events\r\n this._refreshSurface()\r\n this._requestHeader = foldRequestHeader(this._events)\r\n this._requestContext = foldRequestContext(this._events)\r\n this._nextSeq = (this._events.at(-1)?.seq ?? 0) + 1\r\n this._loaded = true\r\n }\r\n\r\n private async _read(): Promise<{ existing: boolean; events: SessionEvent[] }> {\r\n let text: string\r\n try {\r\n text = await readFile(this.file, 'utf8')\r\n } catch (error) {\r\n if ((error as NodeJS.ErrnoException).code === 'ENOENT') {\r\n return { existing: false, events: [] }\r\n }\r\n throw error\r\n }\r\n if (!text.trim()) return { existing: false, events: [] }\r\n\r\n const lines = text.split('\\n')\r\n const events: SessionEvent[] = []\r\n let torn = false\r\n for (const line of lines) {\r\n if (!line.trim()) continue\r\n if (torn) continue\r\n let parsed: unknown\r\n try {\r\n parsed = JSON.parse(line)\r\n } catch {\r\n torn = true\r\n continue\r\n }\r\n if (!isSessionEvent(parsed)) {\r\n torn = true\r\n continue\r\n }\r\n events.push(parsed)\r\n }\r\n\r\n this._assertFormat(events)\r\n\r\n const key = sessionFileKey(this.file)\r\n const owner = liveSessions.get(key)\r\n if (owner && owner !== this) {\r\n // A live writer owns this log; never synthesize closures over its active turn.\r\n return { existing: true, events }\r\n }\r\n\r\n const synthetic = repairUnclosed(events)\r\n if (!torn && !synthetic.length) return { existing: true, events }\r\n\r\n const repaired = [...events, ...synthetic]\r\n await writeFile(\r\n this.file,\r\n `${repaired.map(event => JSON.stringify(event)).join('\\n')}\\n`,\r\n 'utf8',\r\n )\r\n return { existing: true, events: repaired }\r\n }\r\n\r\n private _assertFormat(events: readonly SessionEvent[]): void {\r\n let version: number | undefined\r\n for (const event of events) {\r\n if (event.type !== 'meta') continue\r\n const value = (event.payload as Record<string, unknown>).formatVersion\r\n if (typeof value === 'number') version = value\r\n }\r\n if (version === undefined) {\r\n throw new SessionFormatError(\r\n `session log is missing formatVersion; expected ${SESSION_FORMAT_VERSION}`,\r\n )\r\n }\r\n if (version !== SESSION_FORMAT_VERSION) {\r\n throw new SessionFormatError(\r\n `unsupported session format version ${version}; expected ${SESSION_FORMAT_VERSION}`,\r\n )\r\n }\r\n }\r\n\r\n private _resolveLineage(messageId: string): SessionEvent[] {\r\n const messages = this._events.filter(\r\n (event): event is Extract<SessionEvent, { type: MessageEventType }> => isMessageEvent(event),\r\n )\r\n const byId = new Map<string, Extract<SessionEvent, { type: MessageEventType }>>(\r\n messages.map(event => [event.id, event] as const),\r\n )\r\n if (!byId.has(messageId)) {\r\n throw new Error(`message not found: ${messageId}`)\r\n }\r\n const chain: SessionEvent[] = []\r\n const seen = new Set<string>()\r\n let cursorId: string | undefined = messageId\r\n while (cursorId && byId.has(cursorId) && !seen.has(cursorId)) {\r\n seen.add(cursorId)\r\n const event: Extract<SessionEvent, { type: MessageEventType }> = byId.get(cursorId)!\r\n chain.unshift(clone(event))\r\n const parentId: string | undefined = event.payload.parentId\r\n if (parentId && byId.has(parentId)) {\r\n cursorId = parentId\r\n continue\r\n }\r\n const index = messages.findIndex(message => message.id === cursorId)\r\n cursorId = index > 0 ? messages[index - 1]!.id : undefined\r\n }\r\n return chain\r\n }\r\n}\r\n\r\nexport const session = {\r\n name: 'session',\r\n apply: async (ctx: Context, config: SessionConfig) => {\r\n const log = new SessionLog(config.file, config.broadcast ?? ((type, payload) => {\r\n if (type === 'event') ctx.emit('session/event', payload)\r\n else ctx.emit('session/flush', payload)\r\n }))\r\n await log.init()\r\n ctx.provide('session', log)\r\n return () => log.close()\r\n },\r\n}\r\n\r\nexport * from './invariant.js'\r\n\r\nexport const name = '@tnega/session'\r\n", "/**\r\n * Session invariant companion.\r\n *\r\n * Pure structural checks over a session event stream, mirroring the DSH\r\n * \"each package ships a ./invariant\" discipline. They assert the relationships\r\n * the event-sourcing layer promises:\r\n *\r\n * - durable lifecycle structures (turn / step / tool call) stay balanced \u2014\r\n * every `turn/start` has a `turn/end`, every `tool/call` a `tool/result`;\r\n * - seq stays strictly monotonic;\r\n * - message events that reach the model surface stay append-only unless they\r\n * belong to a compaction replacement.\r\n *\r\n * The checks are pure over `SessionEvent[]`, so they run equally on a full\r\n * log, on a single newly-committed event, or in tests. Recovery (repairing an\r\n * interrupted log into a closed one) is `repairUnclosed`; these checks assert\r\n * that the result is actually legal.\r\n */\r\n\r\nimport type { SessionEvent, ToolResultPayload } from './index.js'\r\n\r\nexport interface SessionInvariantFailure {\r\n name: string\r\n detail: string\r\n}\r\n\r\n/** Balanced `turn/start` \u2194 `turn/end` per turn number. */\r\nexport function checkBalancedTurns(events: readonly SessionEvent[]): SessionInvariantFailure[] {\r\n const opens = new Map<number, number>()\r\n const failures: SessionInvariantFailure[] = []\r\n for (const event of events) {\r\n if (event.type === 'turn/start') {\r\n opens.set(event.payload.turn, (opens.get(event.payload.turn) ?? 0) + 1)\r\n } else if (event.type === 'turn/end') {\r\n const remaining = opens.get(event.payload.turn) ?? 0\r\n if (remaining <= 0) {\r\n failures.push({\r\n name: 'turn/end-without-start',\r\n detail: `turn/end for turn ${event.payload.turn} has no matching turn/start`,\r\n })\r\n } else {\r\n opens.set(event.payload.turn, remaining - 1)\r\n }\r\n }\r\n }\r\n for (const [turn, count] of opens) {\r\n for (let index = 0; index < count; index += 1) {\r\n failures.push({\r\n name: 'turn/start-without-end',\r\n detail: `turn/start ${turn} has no matching turn/end`,\r\n })\r\n }\r\n }\r\n return failures\r\n}\r\n\r\n/** Balanced `step/start` \u2194 `step/end` per (turn, step). */\r\nexport function checkBalancedSteps(events: readonly SessionEvent[]): SessionInvariantFailure[] {\r\n const open = new Set<string>()\r\n const failures: SessionInvariantFailure[] = []\r\n for (const event of events) {\r\n if (event.type === 'step/start') {\r\n const key = `${event.payload.turn}:${event.payload.step}`\r\n if (open.has(key)) {\r\n failures.push({\r\n name: 'duplicate-step-start',\r\n detail: `step/start for ${key} appears twice without a matching step/end`,\r\n })\r\n }\r\n open.add(key)\r\n } else if (event.type === 'step/end') {\r\n const key = `${event.payload.turn}:${event.payload.step}`\r\n if (!open.delete(key)) {\r\n failures.push({\r\n name: 'step/end-without-start',\r\n detail: `step/end for ${key} has no matching step/start`,\r\n })\r\n }\r\n }\r\n }\r\n for (const key of open) {\r\n failures.push({\r\n name: 'step/start-without-end',\r\n detail: `step/start ${key} has no matching step/end`,\r\n })\r\n }\r\n return failures\r\n}\r\n\r\n/** Balanced `tool/call` \u2194 `tool/result` per call id. */\r\nexport function checkBalancedToolCalls(events: readonly SessionEvent[]): SessionInvariantFailure[] {\r\n const open = new Set<string>()\r\n const failures: SessionInvariantFailure[] = []\r\n for (const event of events) {\r\n if (event.type === 'tool/call') {\r\n open.add(event.payload.id)\r\n } else if (event.type === 'tool/result') {\r\n const payload = event.payload as ToolResultPayload\r\n const id = payload.toolCallId\r\n if (!open.delete(id)) {\r\n failures.push({\r\n name: 'tool/result-without-call',\r\n detail: `tool/result for call ${id} has no matching tool/call`,\r\n })\r\n }\r\n }\r\n }\r\n for (const id of open) {\r\n failures.push({\r\n name: 'tool/call-without-result',\r\n detail: `tool/call ${id} has no matching tool/result`,\r\n })\r\n }\r\n return failures\r\n}\r\n\r\n/** seq is strictly monotonic (an append-only log never rewinds). */\r\nexport function checkMonotonicSeq(events: readonly SessionEvent[]): SessionInvariantFailure[] {\r\n const failures: SessionInvariantFailure[] = []\r\n for (let index = 1; index < events.length; index += 1) {\r\n const previous = events[index - 1]\r\n const current = events[index]\r\n if (current && previous && current.seq <= previous.seq) {\r\n failures.push({\r\n name: 'non-monotonic-seq',\r\n detail: `seq ${current.seq} follows ${previous.seq} out of order at index ${index}`,\r\n })\r\n }\r\n }\r\n return failures\r\n}\r\n\r\n/** Aggregate all structural session checks over an event stream. */\r\nexport function checkSessionInvariants(\r\n events: readonly SessionEvent[],\r\n): SessionInvariantFailure[] {\r\n return [\r\n ...checkBalancedTurns(events),\r\n ...checkBalancedSteps(events),\r\n ...checkBalancedToolCalls(events),\r\n ...checkMonotonicSeq(events),\r\n ]\r\n}\r\n", "import type { Context, Plugin } from '@tnega/core'\r\nimport type { ModelMessage } from '@tnega/session'\r\nimport type { ToolDefinition } from '@tnega/tools'\r\n\r\nimport { agent, AgentService, type AgentConfig } from './service.js'\r\nimport type { AgentHooks, AgentInput, AgentLoop } from './types.js'\r\nimport type { SystemPromptService } from './prompt.js'\r\n\r\nexport type AgentDefinitionHooks = AgentHooks\r\n\r\nexport interface AgentDefinition {\r\n name: string\r\n version?: string\r\n system?: string | ((ctx: Context) => string)\r\n tools?: readonly ToolDefinition[]\r\n loop?: AgentLoop\r\n hooks?: AgentDefinitionHooks\r\n}\r\n\r\nexport interface DefineAgentConfig extends Partial<\r\n Pick<AgentConfig, 'llm' | 'maxTurns' | 'maxSteps' | 'inbox' | 'contextBudget'>\r\n> {\r\n [key: string]: unknown\r\n}\r\n\r\nfunction resolveSystemPrompt(\r\n ctx: Context,\r\n system: string | ((ctx: Context) => string) | undefined,\r\n): string | undefined {\r\n if (!system) return undefined\r\n return typeof system === 'function' ? system(ctx) : system\r\n}\r\n\r\nfunction withSystemPrompt(\r\n input: AgentInput | undefined,\r\n system: string | undefined,\r\n): AgentInput | undefined {\r\n if (!system) return input\r\n const messages: ModelMessage[] = [\r\n { role: 'system', content: system },\r\n ...(input?.messages ?? []),\r\n ]\r\n if (input?.text) messages.push({ role: 'user', content: input.text })\r\n return { ...(input ?? {}), messages }\r\n}\r\n\r\nexport function defineAgent(\r\n definition: AgentDefinition,\r\n): Plugin {\r\n const name = definition.name.trim()\r\n if (!name) throw new TypeError('agent definition requires a non-empty name')\r\n\r\n return {\r\n name: `agent:${name}`,\r\n inject: ['session', 'tools'],\r\n apply: async (ctx: Context, config: DefineAgentConfig = {}) => {\r\n const dynamic = ctx as unknown as {\r\n tools: { register(tool: ToolDefinition): () => void }\r\n }\r\n const system = resolveSystemPrompt(ctx, definition.system)\r\n let agentService: AgentService | undefined\r\n\r\n if (definition.loop) {\r\n const loop: AgentLoop = async (input, options) => {\r\n await definition.hooks?.beforeRun?.(input ?? {}, options ?? {})\r\n const result = await definition.loop!(\r\n withSystemPrompt(input, system),\r\n options,\r\n )\r\n await definition.hooks?.afterRun?.(result, options ?? {})\r\n return result\r\n }\r\n ctx.provide('agentLoop', loop)\r\n } else {\r\n const agentConfig: AgentConfig = {}\r\n if (definition.hooks) agentConfig.hooks = definition.hooks\r\n if (config.llm) agentConfig.llm = config.llm\r\n if (config.maxTurns !== undefined) agentConfig.maxTurns = config.maxTurns\r\n if (config.maxSteps !== undefined) agentConfig.maxSteps = config.maxSteps\r\n if (config.inbox) agentConfig.inbox = config.inbox\r\n if (config.contextBudget) agentConfig.contextBudget = config.contextBudget\r\n const agentFiber = ctx.plugin(agent, agentConfig)\r\n await agentFiber\r\n agentService = ctx.reflect.get('agent') as AgentService\r\n if (system) agentService.inbox.inject('agentSystem', system)\r\n }\r\n\r\n if (system) {\r\n const prompt = ctx.reflect.get('systemPrompt') as SystemPromptService | undefined\r\n if (prompt) {\r\n ctx.fiber.effect(() => prompt.registerSection({\r\n name: `${name}:persona`,\r\n content: system,\r\n }), `ctx.systemPrompt.section(${JSON.stringify(name)})`)\r\n }\r\n }\r\n\r\n for (const tool of definition.tools ?? []) {\r\n dynamic.tools.register(tool)\r\n }\r\n\r\n ctx.provide('agentDefinition', definition)\r\n ctx.provide('agentSystem', system)\r\n ctx.emit('agent/definition', {\r\n name,\r\n version: definition.version,\r\n system,\r\n toolCount: (definition.tools ?? []).length,\r\n })\r\n },\r\n }\r\n}\r\n", "import { randomUUID } from 'node:crypto'\r\nimport type { Context, Plugin } from '@tnega/core'\r\nimport { SessionLog, type SessionEvent } from '@tnega/session'\r\nimport type { ModelMessage } from '@tnega/session'\r\nimport { AgentInbox, AgentService } from './service.js'\r\nimport { AgentError } from './service.js'\r\nimport { DurableInbox, type DurableInboxMessage } from './inbox-durable.js'\r\nimport type {\r\n AgentCancelCause,\r\n AgentContextBudget,\r\n AgentHooks,\r\n AgentInput,\r\n AgentStreamEvent,\r\n LLMAdapter,\r\n} from './types.js'\r\n\r\nexport interface AgentSessionMeta {\r\n agentId: string\r\n agentType?: 'general' | 'coding'\r\n mode?: 'auto' | 'plan' | 'execute'\r\n title?: string\r\n owner?: string\r\n parentSessionId?: string\r\n forkedAtMessageId?: string\r\n createdAt?: number\r\n}\r\n\r\n/** Synchronous finalizer invoked immediately before agent publication. */\r\nexport interface AgentSetupCommit {\r\n commit(): void\r\n}\r\n\r\n/** Compose an unpublished agent scope; a throw rejects the whole creation. */\r\nexport type AgentSetup = (\r\n agentCtx: Context,\r\n) => AgentSetupCommit | Promise<AgentSetupCommit | void> | void\r\n\r\nexport interface LiveInboxView {\r\n readonly size: number\r\n snapshot(): { nextTurn: readonly DurableInboxMessage[]; nextStep: readonly DurableInboxMessage[] }\r\n}\r\n\r\nexport type AgentStatus = 'idle' | 'running'\r\n\r\nexport interface AgentCancelOptions {\r\n keepInbox?: boolean\r\n}\r\n\r\nexport interface LiveAgent {\r\n readonly id: string\r\n readonly meta: AgentSessionMeta\r\n readonly agentType: 'general' | 'coding' | undefined\r\n readonly mode: 'auto' | 'plan' | 'execute' | undefined\r\n readonly owner: string | undefined\r\n readonly parentSessionId: string | undefined\r\n readonly status: AgentStatus\r\n readonly inbox: LiveInboxView\r\n readonly session: SessionLog\r\n readonly ctx: Context\r\n /** The scoped context setup composes before publication. */\r\n readonly agentCtx: Context\r\n followup(input: AgentInput): void\r\n steer(input: AgentInput): void\r\n replaceMessage(messageId: string, input: AgentInput): void\r\n removeMessage(messageId: string): void\r\n inject(key: string, value: unknown): void\r\n send(input: AgentInput, options?: { mode?: 'followup' | 'steer' }): void\r\n cancel(cause: AgentCancelCause, options?: AgentCancelOptions): void\r\n whenIdle(): Promise<void>\r\n /**\r\n * Drain currently queued durable work as a live event stream, one turn per\r\n * claimed inbox item. In manual-streaming mode this is the only drain; the\r\n * generator settles when the queue is empty, so callers stream a run and\r\n * stop at quiescence.\r\n */\r\n runTurns(signal?: AbortSignal): AsyncGenerator<AgentStreamEvent, void, void>\r\n runMaintenance<T>(task: (signal: AbortSignal) => Promise<T>): Promise<T>\r\n dispose(): Promise<void>\r\n}\r\n\r\nexport interface AgentHandle {\r\n agent: LiveAgent\r\n dispose(): Promise<void>\r\n}\r\n\r\nexport interface AgentCreationOptions {\r\n file: string\r\n /** Stable identity shared by this process and future resumes. */\r\n sessionId?: string\r\n agentType?: 'general' | 'coding'\r\n mode?: 'auto' | 'plan' | 'execute'\r\n title?: string\r\n owner?: string\r\n parentSessionId?: string\r\n forkedAtMessageId?: string\r\n id?: string\r\n /** Optional composition callback run before the agent is published. */\r\n setup?: AgentSetup\r\n llm?: LLMAdapter\r\n system?: string\r\n maxTurns?: number\r\n maxSteps?: number\r\n contextBudget?: AgentContextBudget\r\n hooks?: AgentHooks\r\n initial?: readonly AgentInput[]\r\n /** Disable the automatic drain; callers drive turns via `runTurns`. */\r\n manualStreaming?: boolean\r\n}\r\n\r\nexport interface AgentFactory {\r\n create(options: AgentCreationOptions): Promise<AgentHandle>\r\n resume(options: AgentCreationOptions): Promise<AgentHandle>\r\n}\r\n\r\nclass LiveAgentImpl implements LiveAgent {\r\n private _status: AgentStatus = 'idle'\r\n private _disposed = false\r\n private _controller: AbortController | undefined\r\n private _drainPromise: Promise<void> | undefined\r\n private _busy = false\r\n private _writeTail: Promise<void> = Promise.resolve()\r\n private _pendingWrite: Promise<void> | undefined\r\n private _sessionStarted = false\r\n private _maintenance:\r\n | { promise: Promise<void>; controller: AbortController }\r\n | undefined\r\n private _maintenanceBusy = false\r\n private _setupDisposers: Array<() => Promise<void> | void> = []\r\n private _scopeClosed = false\r\n private _durable: DurableInbox\r\n private _agentSystem: string | undefined\r\n private _manualStreaming = false\r\n\r\n constructor(\r\n private _ctx: Context,\r\n private _agentCtx: Context,\r\n private _service: AgentService,\r\n readonly id: string,\r\n readonly inbox: LiveInboxView,\r\n readonly session: SessionLog,\r\n durable: DurableInbox,\r\n readonly meta: AgentSessionMeta,\r\n manualStreaming = false,\r\n ) {\r\n this._durable = durable\r\n this._manualStreaming = manualStreaming\r\n }\r\n\r\n get agentType(): 'general' | 'coding' | undefined {\r\n return this.meta.agentType\r\n }\r\n\r\n get mode(): 'auto' | 'plan' | 'execute' | undefined {\r\n return this.meta.mode\r\n }\r\n\r\n get owner(): string | undefined {\r\n return this.meta.owner\r\n }\r\n\r\n get parentSessionId(): string | undefined {\r\n return this.meta.parentSessionId\r\n }\r\n\r\n get agentCtx(): Context {\r\n return this._agentCtx\r\n }\r\n\r\n trackSetupDispose(dispose: () => Promise<void> | void): void {\r\n if (this._scopeClosed) void dispose()\r\n else this._setupDisposers.push(dispose)\r\n }\r\n\r\n get status(): AgentStatus {\r\n return this._status\r\n }\r\n\r\n get ctx(): Context {\r\n return this._ctx\r\n }\r\n\r\n followup(input: AgentInput): void {\r\n this._send(input, 'followup')\r\n }\r\n\r\n /** Replace one pending inbox message by durable message id. */\r\n replaceMessage(messageId: string, input: AgentInput): void {\r\n this._mutatePending(async () => {\r\n const previous = this._durable.get(messageId)\r\n if (!previous) return\r\n const replacement = await this._durable.replace(messageId, {\r\n text: input.text ?? '',\r\n ...(input.messages !== undefined || input.context !== undefined\r\n ? { content: input.messages ?? input.context }\r\n : {}),\r\n })\r\n if (!replacement) return\r\n this._ctx.emit('agent/inbox/discarded', {\r\n id: this.id,\r\n agent: this,\r\n message: previous,\r\n })\r\n this._ctx.emit('agent/inbox/inserted', {\r\n id: this.id,\r\n agent: this,\r\n target: this._findTarget(messageId) ?? 'next-turn',\r\n input: replacement,\r\n inboxSeq: this._durable.size,\r\n })\r\n })\r\n }\r\n\r\n /** Remove one pending inbox message by durable message id. */\r\n removeMessage(messageId: string): void {\r\n this._mutatePending(async () => {\r\n const removed = await this._durable.remove(messageId)\r\n if (!removed) return\r\n this._ctx.emit('agent/inbox/discarded', {\r\n id: this.id,\r\n agent: this,\r\n message: removed,\r\n })\r\n })\r\n }\r\n\r\n steer(input: AgentInput): void {\r\n this._send(input, 'steer')\r\n }\r\n\r\n inject(key: string, value: unknown): void {\r\n if (key === 'agentSystem' && typeof value === 'string') {\r\n this._agentSystem = value\r\n }\r\n }\r\n\r\n send(input: AgentInput, options: { mode?: 'followup' | 'steer' } = {}): void {\r\n this._send(input, options.mode === 'steer' ? 'steer' : 'followup')\r\n }\r\n\r\n private _send(input: AgentInput, target: 'followup' | 'steer'): void {\r\n if (this._disposed) throw new Error(`agent disposed: ${this.id}`)\r\n const text = input.text ?? ''\r\n const content = input.messages ?? input.context\r\n const task = this._writeTail.then(async () => {\r\n const message = target === 'steer'\r\n ? await this._durable.steer({ text, ...(content !== undefined ? { content } : {}) })\r\n : await this._durable.insert({ text, ...(content !== undefined ? { content } : {}) })\r\n this._ctx.emit('agent/inbox/inserted', {\r\n id: this.id,\r\n target,\r\n input: message,\r\n inboxSeq: this._durable.size,\r\n })\r\n }).catch((error: unknown) => {\r\n this._ctx.emit('agent/error', { id: this.id, error })\r\n })\r\n this._writeTail = task\r\n this._pendingWrite = task\r\n task.finally(() => {\r\n if (this._pendingWrite === task) this._pendingWrite = undefined\r\n queueMicrotask(() => this._wake())\r\n })\r\n }\r\n\r\n private _mutatePending(task: () => Promise<void>): void {\r\n if (this._disposed) throw new Error(`agent disposed: ${this.id}`)\r\n const chained = this._writeTail.then(task).catch((error: unknown) => {\r\n this._ctx.emit('agent/error', { id: this.id, error })\r\n })\r\n this._writeTail = chained\r\n this._pendingWrite = chained\r\n chained.finally(() => {\r\n if (this._pendingWrite === chained) this._pendingWrite = undefined\r\n })\r\n }\r\n\r\n private _findTarget(messageId: string): 'next-turn' | 'next-step' | undefined {\r\n const snapshot = this._durable.snapshot()\r\n if (snapshot.nextStep.some(message => message.id === messageId)) return 'next-step'\r\n if (snapshot.nextTurn.some(message => message.id === messageId)) return 'next-turn'\r\n return undefined\r\n }\r\n\r\n cancel(cause: AgentCancelCause, options: AgentCancelOptions = {}): void {\r\n if (!options.keepInbox) {\r\n const task = this._writeTail.then(async () => {\r\n const before = this._durable.snapshot()\r\n for (const message of [...before.nextStep, ...before.nextTurn]) {\r\n this._ctx.emit('agent/inbox/discarded', { id: this.id, message })\r\n }\r\n await this._durable.clear()\r\n }).catch((error: unknown) => {\r\n this._ctx.emit('agent/error', { id: this.id, error })\r\n })\r\n this._writeTail = task\r\n this._pendingWrite = task\r\n task.finally(() => {\r\n if (this._pendingWrite === task) this._pendingWrite = undefined\r\n })\r\n }\r\n this._controller?.abort(cause)\r\n this._maintenance?.controller.abort(cause)\r\n }\r\n\r\n async whenIdle(): Promise<void> {\r\n while (this._pendingWrite) await this._pendingWrite\r\n while (true) {\r\n const maintenance = this._maintenance\r\n if (maintenance) {\r\n await maintenance.promise.catch(() => undefined)\r\n continue\r\n }\r\n const drain = this._drainPromise\r\n if (drain) {\r\n await drain.catch(() => undefined)\r\n continue\r\n }\r\n if (!this._durable.size) break\r\n await new Promise<void>(resolve => setTimeout(resolve, 0))\r\n }\r\n }\r\n\r\n /** Run one non-turn maintenance task from the true idle phase. */\r\n runMaintenance<T>(task: (signal: AbortSignal) => Promise<T>): Promise<T> {\r\n if (this._disposed) throw new Error(`agent disposed: ${this.id}`)\r\n if (this._maintenanceBusy || this._drainPromise || this._pendingWrite) {\r\n throw new Error('agent is busy; maintenance can only run while idle')\r\n }\r\n this._maintenanceBusy = true\r\n const controller = new AbortController()\r\n const result = Promise.resolve()\r\n .then(async () => {\r\n const value = await task(controller.signal)\r\n return value\r\n })\r\n .finally(() => {\r\n this._maintenanceBusy = false\r\n if (this._maintenance?.controller === controller) {\r\n this._maintenance = undefined\r\n }\r\n queueMicrotask(() => this._wake())\r\n })\r\n this._maintenance = { promise: result.then(() => undefined, () => undefined), controller }\r\n return result\r\n }\r\n\r\n async dispose(): Promise<void> {\r\n if (this._disposed) return\r\n this._disposed = true\r\n this.cancel({ type: 'disposed' })\r\n await this._writeTail.catch(() => undefined)\r\n await this._drainPromise?.catch(() => undefined)\r\n if (this._maintenance) this._maintenance.controller.abort({ type: 'disposed' })\r\n await this._maintenance?.promise.catch(() => undefined)\r\n if (!this._scopeClosed) {\r\n this._scopeClosed = true\r\n await Promise.all([...this._setupDisposers].reverse().map(dispose => dispose()))\r\n }\r\n const writeTail = this._writeTail\r\n if (writeTail !== this._drainPromise && this._pendingWrite) {\r\n this._pendingWrite = undefined\r\n await writeTail.catch(() => undefined)\r\n }\r\n this._setStatus('idle')\r\n }\r\n\r\n /** Publish the agent lifecycle session-start notification once. */\r\n async publishSessionStart(source: 'startup' | 'resume' = 'startup'): Promise<void> {\r\n if (this._sessionStarted) return\r\n this._sessionStarted = true\r\n this._ctx.emit('agent/session-start', {\r\n id: this.id,\r\n agent: this,\r\n source,\r\n })\r\n }\r\n\r\n /** Current durable turn number for a newly claimed inbox item. */\r\n private async _nextTurnNumber(): Promise<number> {\r\n const events = await this.session.read()\r\n let max = 0\r\n for (const event of events) {\r\n if (event.type === 'turn/start') max = Math.max(max, event.payload.turn)\r\n }\r\n return max + 1\r\n }\r\n\r\n /** Start draining currently pending durable work without a new input. */\r\n wakeNow(): void {\r\n this._wake()\r\n }\r\n\r\n private _wake(): void {\r\n if (\r\n this._disposed\r\n || this._manualStreaming\r\n || this._drainPromise\r\n || this._busy\r\n || this._maintenanceBusy\r\n ) return\r\n const task = this._drainAll()\r\n this._drainPromise = task\r\n task.finally(() => {\r\n if (this._drainPromise === task) this._drainPromise = undefined\r\n })\r\n }\r\n\r\n private async _drainAll(): Promise<void> {\r\n await this._writeTail.catch(() => undefined)\r\n if (this._durable.size) {\r\n // Automatic (library) drain: consume the queue, discarding the stream.\r\n for await (const _ of this._streamTurns()) void _\r\n }\r\n }\r\n\r\n /** Public drain over queued durable work (manual-streaming mode). */\r\n async *runTurns(signal?: AbortSignal): AsyncGenerator<AgentStreamEvent, void, void> {\r\n if (this._manualStreaming) await this._writeTail.catch(() => undefined)\r\n if (this._busy || this._disposed) return\r\n yield* this._streamTurns(signal)\r\n }\r\n\r\n private async *_streamTurns(\r\n signal?: AbortSignal,\r\n ): AsyncGenerator<AgentStreamEvent, void, void> {\r\n if (this._busy || this._disposed) return\r\n this._busy = true\r\n this._setStatus('running')\r\n try {\r\n while (!this._disposed) {\r\n const batch = await this._durable.claimBatch()\r\n if (!batch.length) break\r\n const input = await this._inputForBatch(batch)\r\n const turn = await this._nextTurnNumber()\r\n for (const message of batch) {\r\n this._ctx.emit('agent/inbox/claimed', {\r\n id: this.id,\r\n agent: this,\r\n message,\r\n input: { text: message.text ?? '' },\r\n turn,\r\n })\r\n }\r\n const controller = new AbortController()\r\n this._controller = controller\r\n const forward = (): void => controller.abort(signal?.reason)\r\n if (signal?.aborted) controller.abort(signal.reason)\r\n else signal?.addEventListener('abort', forward, { once: true })\r\n try {\r\n if (this._manualStreaming) {\r\n yield* this._service.runStream(input, { signal: controller.signal })\r\n } else {\r\n await this._service.run(input, { signal: controller.signal })\r\n }\r\n } catch (error) {\r\n if (!controller.signal.aborted) {\r\n const step = await this._failedStep()\r\n this._ctx.emit('agent/error', {\r\n id: this.id,\r\n agent: this,\r\n error,\r\n ...(step !== undefined ? { turn, step } : {}),\r\n })\r\n if (this._manualStreaming) throw error\r\n }\r\n } finally {\r\n signal?.removeEventListener('abort', forward)\r\n if (this._controller === controller) this._controller = undefined\r\n }\r\n }\r\n } finally {\r\n this._busy = false\r\n this._setStatus('idle')\r\n }\r\n }\r\n\r\n private async _inputForBatch(\r\n batch: readonly DurableInboxMessage[],\r\n ): Promise<AgentInput> {\r\n const history = await this.session.deriveMessages()\r\n const structured = batch.filter(message => message.content !== undefined)\r\n const plain = batch.filter(message => message.content === undefined)\r\n const plainMessages = plain\r\n .filter(message => message.text !== undefined)\r\n .map(message => ({ role: 'user' as const, content: message.text ?? '' }))\r\n if (structured.length) {\r\n return {\r\n messages: [\r\n ...history,\r\n ...structured.flatMap(message => Array.isArray(message.content)\r\n ? message.content as ModelMessage[]\r\n : [{ role: 'user' as const, content: String(message.content ?? '') }]),\r\n ],\r\n }\r\n }\r\n if (history.length || batch.length > 1) {\r\n return { messages: [...history, ...plainMessages] }\r\n }\r\n return { text: plainMessages[0]?.content ?? '' }\r\n }\r\n\r\n private _setStatus(status: AgentStatus): void {\r\n const previous = this._status\r\n if (previous === status) return\r\n this._status = status\r\n this._ctx.emit('agent/status', { id: this.id, status, previous })\r\n }\r\n\r\n private async _failedStep(): Promise<number | undefined> {\r\n const events = await this.session.read()\r\n for (let index = events.length - 1; index >= 0; index -= 1) {\r\n const event = events[index]\r\n if (event?.type === 'step/end'\r\n && (event.payload.finishReason === 'error'\r\n || event.payload.interrupted === true)) {\r\n return event.payload.step\r\n }\r\n }\r\n return undefined\r\n }\r\n}\r\n\r\nexport class AgentRegistry {\r\n private _agents = new Map<string, LiveAgent>()\r\n private _owners = new Map<string, string | undefined>()\r\n private _factory: AgentFactory | undefined\r\n\r\n constructor(private _ctx: Context) {}\r\n\r\n setFactory(factory: AgentFactory): () => void {\r\n this._factory = factory\r\n return () => {\r\n if (this._factory === factory) this._factory = undefined\r\n }\r\n }\r\n\r\n async create(options: AgentCreationOptions): Promise<AgentHandle> {\r\n if (!this._factory) throw new Error('no agent factory registered')\r\n const id = options.id ?? options.sessionId ?? randomUUID()\r\n if (this._agents.has(id)) throw new Error(`agent already registered: ${id}`)\r\n const handle = await this._factory.create({ ...options, id })\r\n this._agents.set(id, handle.agent)\r\n this._owners.set(id, handle.agent.owner)\r\n this._ctx.emit('agent/created', { id, agent: handle.agent })\r\n return {\r\n agent: handle.agent,\r\n dispose: () => this._dispose(id, handle),\r\n }\r\n }\r\n\r\n async resume(options: AgentCreationOptions): Promise<AgentHandle> {\r\n if (!this._factory) throw new Error('no agent factory registered')\r\n if (!options.id && !options.sessionId) {\r\n throw new AgentError('agent resume requires a stable session id')\r\n }\r\n const id = options.id ?? options.sessionId!\r\n if (this._agents.has(id)) throw new Error(`agent already registered: ${id}`)\r\n const handle = await this._factory.resume({ ...options, id })\r\n this._agents.set(id, handle.agent)\r\n this._owners.set(id, handle.agent.owner)\r\n this._ctx.emit('agent/created', { id, agent: handle.agent })\r\n return {\r\n agent: handle.agent,\r\n dispose: () => this._dispose(id, handle),\r\n }\r\n }\r\n\r\n get(id: string): LiveAgent | undefined {\r\n return this._agents.get(id)\r\n }\r\n\r\n list(): LiveAgent[] {\r\n return [...this._agents.values()]\r\n }\r\n\r\n roots(): LiveAgent[] {\r\n return this.list().filter(agent => this._owners.get(agent.id) === undefined)\r\n }\r\n\r\n isOwnedBy(id: string, owner: string): boolean {\r\n return this._owners.get(id) === owner\r\n }\r\n\r\n private async _dispose(id: string, handle: AgentHandle): Promise<void> {\r\n const agent = this._agents.get(id)\r\n if (!agent) return\r\n await handle.dispose()\r\n this._agents.delete(id)\r\n this._owners.delete(id)\r\n this._ctx.emit('agent/disposed', { id })\r\n }\r\n}\r\n\r\nasync function buildHandle(\r\n ctx: Context,\r\n options: AgentCreationOptions,\r\n resume = false,\r\n): Promise<AgentHandle> {\r\n const fileMeta = await readAgentMeta(options.file)\r\n if (resume && !fileMeta) {\r\n throw new AgentError(`no agent session meta found for resume: ${options.file}`)\r\n }\r\n const requestedId = options.id ?? options.sessionId ?? randomUUID()\r\n if (fileMeta?.agentId && fileMeta.agentId !== requestedId) {\r\n throw new AgentError(\r\n `agent id mismatch: session belongs to ${fileMeta.agentId}, requested ${requestedId}`,\r\n )\r\n }\r\n const agentId = fileMeta?.agentId ?? requestedId\r\n if (!agentId) throw new AgentError('agent requires a stable identity')\r\n const log = new SessionLog(\r\n options.file,\r\n (type, payload) => {\r\n if (type === 'event') ctx.emit('session/event', payload)\r\n else ctx.emit('session/flush', payload)\r\n },\r\n )\r\n await log.init()\r\n const fileEvents = await log.read()\r\n const durableMeta = readDurableAgentMeta(fileEvents)\r\n if (durableMeta) {\r\n if (durableMeta.agentId !== agentId) {\r\n throw new AgentError(\r\n `agent id mismatch: session belongs to ${durableMeta.agentId}, requested ${agentId}`,\r\n )\r\n }\r\n if (options.agentType && durableMeta.agentType !== options.agentType) {\r\n throw new AgentError(\r\n `agent type mismatch: session is ${durableMeta.agentType ?? 'untyped'}, requested ${options.agentType}`,\r\n )\r\n }\r\n if (options.mode && durableMeta.mode !== options.mode) {\r\n throw new AgentError(\r\n `agent mode mismatch: session is ${durableMeta.mode ?? 'unset'}, requested ${options.mode}`,\r\n )\r\n }\r\n }\r\n const boundMeta: AgentSessionMeta = {\r\n ...fileMeta,\r\n ...(durableMeta ?? {}),\r\n ...(options.title ? { title: options.title } : {}),\r\n ...(options.owner ? { owner: options.owner } : {}),\r\n ...(options.parentSessionId ? { parentSessionId: options.parentSessionId } : {}),\r\n ...(options.forkedAtMessageId ? { forkedAtMessageId: options.forkedAtMessageId } : {}),\r\n agentId,\r\n }\r\n const resolvedAgentType = options.agentType ?? durableMeta?.agentType\r\n if (resolvedAgentType) boundMeta.agentType = resolvedAgentType\r\n const resolvedMode = options.mode ?? durableMeta?.mode\r\n if (resolvedMode) boundMeta.mode = resolvedMode\r\n if (!durableMeta) {\r\n await log.append('meta', {\r\n kind: 'agent',\r\n agentId,\r\n ...(boundMeta.agentType ? { agentType: boundMeta.agentType } : {}),\r\n ...(boundMeta.mode ? { mode: boundMeta.mode } : {}),\r\n ...(boundMeta.title ? { title: boundMeta.title } : {}),\r\n ...(boundMeta.owner ? { owner: boundMeta.owner } : {}),\r\n ...(boundMeta.parentSessionId ? { parentSessionId: boundMeta.parentSessionId } : {}),\r\n ...(boundMeta.forkedAtMessageId ? { forkedAtMessageId: boundMeta.forkedAtMessageId } : {}),\r\n ...(boundMeta.createdAt !== undefined ? { createdAt: boundMeta.createdAt } : {}),\r\n })\r\n }\r\n const durable = resume\r\n ? await DurableInbox.restore(log)\r\n : new DurableInbox(log)\r\n const injected = new AgentInbox()\r\n const inboxView: LiveInboxView = {\r\n get size() {\r\n return durable.size\r\n },\r\n snapshot: () => durable.snapshot(),\r\n }\r\n const service = new AgentService(ctx, {\r\n session: log,\r\n inbox: injected,\r\n ...(options.llm ? { llm: options.llm } : {}),\r\n ...(options.maxTurns !== undefined ? { maxTurns: options.maxTurns } : {}),\r\n ...(options.maxSteps !== undefined ? { maxSteps: options.maxSteps } : {}),\r\n ...(options.contextBudget ? { contextBudget: options.contextBudget } : {}),\r\n ...(options.hooks ? { hooks: options.hooks } : {}),\r\n })\r\n if (options.system) injected.inject('agentSystem', options.system)\r\n const agentScope = await ctx.inject([], (scopeCtx: Context) => {\r\n scopeCtx.isolate('agentScope').provide('agentScope', scopeCtx)\r\n })\r\n await agentScope\r\n const agentCtx = agentScope.ctx\r\n const agent = new LiveAgentImpl(\r\n ctx,\r\n agentCtx,\r\n service,\r\n agentId,\r\n inboxView,\r\n log,\r\n durable,\r\n boundMeta,\r\n options.manualStreaming === true,\r\n )\r\n agent.trackSetupDispose(() => agentScope.dispose())\r\n if (options.system) agent.inject('agentSystem', options.system)\r\n let setupResult: AgentSetupCommit | void\r\n try {\r\n setupResult = await options.setup?.(agentCtx)\r\n setupResult?.commit()\r\n } catch (error) {\r\n await agent.dispose().catch(() => undefined)\r\n await log.close().catch(() => undefined)\r\n throw error\r\n }\r\n await agent.publishSessionStart(resume ? 'resume' : 'startup')\r\n for (const input of options.initial ?? []) {\r\n if (!resume) await durable.insert({ text: input.text ?? '' })\r\n }\r\n if (resume && durable.size && options.manualStreaming !== true) {\r\n setTimeout(() => agent.wakeNow(), 0)\r\n }\r\n return { agent, dispose: () => agent.dispose() }\r\n}\r\n\r\nasync function readAgentMeta(\r\n file: string,\r\n): Promise<{ agentId?: string; createdAt?: number } | undefined> {\r\n const lines = await import('node:fs/promises').then(fs => fs.readFile(file, 'utf8'))\r\n .catch((error: unknown) => {\r\n if ((error as NodeJS.ErrnoException).code === 'ENOENT') return undefined\r\n throw error\r\n })\r\n if (lines === undefined) return undefined\r\n for (const line of lines.split('\\n')) {\r\n if (!line.trim()) continue\r\n let record: Record<string, unknown>\r\n try {\r\n const parsed = JSON.parse(line) as unknown\r\n record = parsed && typeof parsed === 'object'\r\n ? parsed as Record<string, unknown>\r\n : {}\r\n } catch {\r\n continue\r\n }\r\n if (record.type !== 'meta') continue\r\n const payload = record.payload as Record<string, unknown> | undefined\r\n if (!payload || payload.kind !== 'agent') continue\r\n return {\r\n ...(typeof payload.agentId === 'string' ? { agentId: payload.agentId } : {}),\r\n ...(typeof payload.createdAt === 'number' ? { createdAt: payload.createdAt } : {}),\r\n }\r\n }\r\n return undefined\r\n}\r\n\r\nfunction readDurableAgentMeta(events: readonly SessionEvent[]): AgentSessionMeta | undefined {\r\n for (let index = events.length - 1; index >= 0; index -= 1) {\r\n const event = events[index]\r\n if (event?.type !== 'meta') continue\r\n const payload = event.payload as Record<string, unknown>\r\n if (payload.kind !== 'agent') continue\r\n const meta: AgentSessionMeta = {\r\n agentId: typeof payload.agentId === 'string' ? payload.agentId : '',\r\n }\r\n if (payload.agentType === 'general' || payload.agentType === 'coding') {\r\n meta.agentType = payload.agentType\r\n }\r\n if (payload.mode === 'auto' || payload.mode === 'plan' || payload.mode === 'execute') {\r\n meta.mode = payload.mode\r\n }\r\n if (typeof payload.title === 'string') meta.title = payload.title\r\n if (typeof payload.owner === 'string') meta.owner = payload.owner\r\n if (typeof payload.parentSessionId === 'string') {\r\n meta.parentSessionId = payload.parentSessionId\r\n }\r\n if (typeof payload.forkedAtMessageId === 'string') {\r\n meta.forkedAtMessageId = payload.forkedAtMessageId\r\n }\r\n if (typeof payload.createdAt === 'number') meta.createdAt = payload.createdAt\r\n return meta\r\n }\r\n return undefined\r\n}\r\n\r\nexport const agents = {\r\n name: 'agents',\r\n inject: ['tools'],\r\n apply: (ctx: Context) => {\r\n const registry = new AgentRegistry(ctx)\r\n ctx.provide('agents', registry)\r\n registry.setFactory({\r\n create: (options) => buildHandle(ctx, options),\r\n resume: (options) => buildHandle(ctx, options, true),\r\n })\r\n return () => {\r\n for (const agent of registry.list()) {\r\n void agent.dispose()\r\n }\r\n }\r\n },\r\n} satisfies Plugin\r\n", "import { randomUUID } from 'node:crypto'\r\nimport type { SessionLog, SessionEvent } from '@tnega/session'\r\n\r\nexport type DurableTarget = 'next-turn' | 'next-step'\r\n\r\nexport interface DurableInboxMessage {\r\n id: string\r\n text?: string\r\n content?: unknown\r\n}\r\n\r\nfunction contentOf(input: { text?: string; content?: unknown }): string {\r\n return input.text ?? ''\r\n}\r\n\r\nfunction payloadOf(input: { text?: string; content?: unknown }): unknown | undefined {\r\n return input.content !== undefined ? input.content : undefined\r\n}\r\n\r\nexport class DurableInbox {\r\n private _nextTurn: DurableInboxMessage[] = []\r\n private _nextStep: DurableInboxMessage[] = []\r\n\r\n constructor(private _session: SessionLog) {}\r\n\r\n get size(): number {\r\n return this._nextTurn.length + this._nextStep.length\r\n }\r\n\r\n async insert(input: { text?: string; content?: unknown }, target: DurableTarget = 'next-turn'): Promise<DurableInboxMessage> {\r\n const message: DurableInboxMessage = {\r\n id: randomUUID(),\r\n ...(input.text !== undefined ? { text: input.text } : {}),\r\n ...(input.content !== undefined ? { content: input.content } : {}),\r\n }\r\n const list = target === 'next-step' ? this._nextStep : this._nextTurn\r\n list.push(message)\r\n await this._session.append('agent/inbox/spliced', {\r\n target,\r\n index: list.length - 1,\r\n inserted: [{\r\n id: message.id,\r\n content: contentOf(message),\r\n ...(payloadOf(message) !== undefined ? { payload: payloadOf(message) } : {}),\r\n }],\r\n })\r\n return message\r\n }\r\n\r\n async steer(input: { text?: string; content?: unknown }): Promise<DurableInboxMessage> {\r\n const message: DurableInboxMessage = {\r\n id: randomUUID(),\r\n ...(input.text !== undefined ? { text: input.text } : {}),\r\n ...(input.content !== undefined ? { content: input.content } : {}),\r\n }\r\n this._nextStep.unshift(message)\r\n await this._session.append('agent/inbox/spliced', {\r\n target: 'next-step',\r\n index: 0,\r\n inserted: [{\r\n id: message.id,\r\n content: contentOf(message),\r\n ...(payloadOf(message) !== undefined ? { payload: payloadOf(message) } : {}),\r\n mode: 'steer',\r\n }],\r\n })\r\n return message\r\n }\r\n\r\n async claim(): Promise<DurableInboxMessage | undefined> {\r\n const steered = this._nextStep.shift()\r\n if (steered) {\r\n await this._session.append('agent/inbox/spliced', {\r\n target: 'next-step',\r\n index: 0,\r\n deleteCount: 1,\r\n })\r\n return steered\r\n }\r\n const next = this._nextTurn.shift()\r\n if (next) {\r\n await this._session.append('agent/inbox/spliced', {\r\n target: 'next-turn',\r\n index: 0,\r\n deleteCount: 1,\r\n })\r\n return next\r\n }\r\n return undefined\r\n }\r\n\r\n /**\r\n * Claim the complete proposed step batch: every pending next-step input plus\r\n * one next-turn message at a turn boundary. Returns an empty array when\r\n * nothing is pending.\r\n */\r\n async claimBatch(): Promise<DurableInboxMessage[]> {\r\n const claimed: DurableInboxMessage[] = []\r\n if (this._nextStep.length) {\r\n const removed = this._nextStep.splice(0)\r\n claimed.push(...removed)\r\n await this._session.append('agent/inbox/spliced', {\r\n target: 'next-step',\r\n index: 0,\r\n deleteCount: removed.length,\r\n })\r\n }\r\n const nextTurn = this._nextTurn.shift()\r\n if (nextTurn) {\r\n claimed.push(nextTurn)\r\n await this._session.append('agent/inbox/spliced', {\r\n target: 'next-turn',\r\n index: 0,\r\n deleteCount: 1,\r\n })\r\n }\r\n return claimed\r\n }\r\n\r\n async clear(): Promise<void> {\r\n if (this._nextTurn.length) {\r\n this._nextTurn = []\r\n await this._session.append('agent/inbox/spliced', {\r\n target: 'next-turn',\r\n index: 0,\r\n deleteCount: Number.POSITIVE_INFINITY,\r\n })\r\n }\r\n if (this._nextStep.length) {\r\n this._nextStep = []\r\n await this._session.append('agent/inbox/spliced', {\r\n target: 'next-step',\r\n index: 0,\r\n deleteCount: Number.POSITIVE_INFINITY,\r\n })\r\n }\r\n }\r\n\r\n /** Insert a message at an explicit target/index boundary. */\r\n async insertAt(\r\n input: { text?: string; content?: unknown },\r\n target: DurableTarget,\r\n index: number,\r\n mode: 'followup' | 'steer' = 'followup',\r\n ): Promise<DurableInboxMessage> {\r\n const message: DurableInboxMessage = {\r\n id: randomUUID(),\r\n ...(input.text !== undefined ? { text: input.text } : {}),\r\n ...(input.content !== undefined ? { content: input.content } : {}),\r\n }\r\n const list = target === 'next-step' ? this._nextStep : this._nextTurn\r\n const safeIndex = Math.max(0, Math.min(index, list.length))\r\n list.splice(safeIndex, 0, message)\r\n await this._session.append('agent/inbox/spliced', {\r\n target,\r\n index: safeIndex,\r\n inserted: [{\r\n id: message.id,\r\n content: contentOf(message),\r\n ...(payloadOf(message) !== undefined ? { payload: payloadOf(message) } : {}),\r\n mode,\r\n }],\r\n })\r\n return message\r\n }\r\n\r\n /**\r\n * Replace one pending message by id. The old message is emitted as\r\n * discarded and the new one as inserted, matching the DSH inbox contract.\r\n */\r\n async replace(\r\n messageId: string,\r\n input: { text?: string; content?: unknown },\r\n ): Promise<DurableInboxMessage | undefined> {\r\n const entry = this._find(messageId)\r\n if (!entry) return undefined\r\n const replacement: DurableInboxMessage = {\r\n id: randomUUID(),\r\n ...(input.text !== undefined ? { text: input.text } : {}),\r\n ...(input.content !== undefined ? { content: input.content } : {}),\r\n }\r\n const target = entry.target\r\n const index = entry.index\r\n entry.list.splice(index, 1, replacement)\r\n await this._session.append('agent/inbox/spliced', {\r\n target,\r\n index,\r\n deleteCount: 1,\r\n inserted: [{\r\n id: replacement.id,\r\n content: contentOf(replacement),\r\n ...(payloadOf(replacement) !== undefined\r\n ? { payload: payloadOf(replacement) }\r\n : {}),\r\n }],\r\n })\r\n return replacement\r\n }\r\n\r\n /** Remove one pending message by id. */\r\n async remove(messageId: string): Promise<DurableInboxMessage | undefined> {\r\n const entry = this._find(messageId)\r\n if (!entry) return undefined\r\n entry.list.splice(entry.index, 1)\r\n await this._session.append('agent/inbox/spliced', {\r\n target: entry.target,\r\n index: entry.index,\r\n deleteCount: 1,\r\n })\r\n return entry.message\r\n }\r\n\r\n /** Return the first pending message by id across both queues. */\r\n get(messageId: string): DurableInboxMessage | undefined {\r\n return this._find(messageId)?.message\r\n }\r\n\r\n snapshot(): { nextTurn: readonly DurableInboxMessage[]; nextStep: readonly DurableInboxMessage[] } {\r\n return {\r\n nextTurn: [...this._nextTurn],\r\n nextStep: [...this._nextStep],\r\n }\r\n }\r\n\r\n private _find(messageId: string):\r\n | { list: DurableInboxMessage[]; target: DurableTarget; index: number; message: DurableInboxMessage }\r\n | undefined {\r\n for (const target of ['next-step', 'next-turn'] as const) {\r\n const list = target === 'next-step' ? this._nextStep : this._nextTurn\r\n const index = list.findIndex(message => message.id === messageId)\r\n if (index >= 0) return { list, target, index, message: list[index]! }\r\n }\r\n return undefined\r\n }\r\n\r\n static async restore(session: SessionLog): Promise<DurableInbox> {\r\n const inbox = new DurableInbox(session)\r\n inbox._applyAll(await session.read())\r\n return inbox\r\n }\r\n\r\n private _applyAll(events: readonly SessionEvent[]): void {\r\n for (const event of events) {\r\n if (event.type !== 'agent/inbox/spliced') continue\r\n const payload = event.payload\r\n const list = payload.target === 'next-step' ? this._nextStep : this._nextTurn\r\n const count = payload.deleteCount ?? 0\r\n if (count === Number.POSITIVE_INFINITY) {\r\n list.length = 0\r\n } else if (count > 0 && payload.index === 0) {\r\n list.splice(0, Math.min(count, list.length))\r\n } else if (count > 0 && payload.index !== undefined) {\r\n list.splice(payload.index, Math.min(count, list.length - payload.index))\r\n }\r\n let insertedOffset = 0\r\n for (const item of payload.inserted ?? []) {\r\n const message: DurableInboxMessage = {\r\n id: item.id,\r\n ...(item.content !== undefined ? { text: item.content } : {}),\r\n ...(item.payload !== undefined ? { content: item.payload } : {}),\r\n }\r\n if (item.mode === 'steer') {\r\n list.unshift(message)\r\n } else {\r\n const at = payload.index === undefined\r\n ? list.length\r\n : Math.min(list.length, payload.index + insertedOffset)\r\n list.splice(at, 0, message)\r\n insertedOffset += 1\r\n }\r\n }\r\n }\r\n }\r\n}\r\n", "import type { Context, Plugin } from '@tnega/core'\r\n\r\nexport interface PromptSection {\r\n name: string\r\n order?: number\r\n content: string\r\n}\r\n\r\nexport interface SystemPromptAssemblyOptions {\r\n scope?: unknown\r\n [key: string]: unknown\r\n}\r\n\r\nexport interface PromptAssembly {\r\n sections: readonly PromptSection[]\r\n text: string\r\n context?: SystemPromptAssemblyOptions\r\n variables?: Record<string, string>\r\n tools?: readonly { name: string; description: string; parameters?: Record<string, unknown> }[]\r\n}\r\n\r\nexport type ToolSchemaSnapshot = {\r\n name: string\r\n description: string\r\n parameters?: Record<string, unknown>\r\n}\r\n\r\nexport type ToolSchemaProvider = (\r\n context: SystemPromptAssemblyOptions,\r\n) => readonly ToolSchemaSnapshot[] | Promise<readonly ToolSchemaSnapshot[]>\r\n\r\nexport type PromptVariableProvider = (\r\n context: SystemPromptAssemblyOptions,\r\n) => string | undefined | Promise<string | undefined>\r\n\r\nexport interface PromptContextProvider {\r\n name: string\r\n order?: number\r\n content: PromptVariableProvider\r\n}\r\n\r\nexport class SystemPromptService {\r\n private _sections = new Map<string, PromptSection>()\r\n private _toolProviders: ToolSchemaProvider[] = []\r\n private _variables = new Map<string, PromptVariableProvider>()\r\n private _contexts: PromptContextProvider[] = []\r\n private _ctx: Context | undefined\r\n\r\n constructor(ctx?: Context) {\r\n this._ctx = ctx\r\n }\r\n\r\n registerSection(section: PromptSection): () => void {\r\n const name = section.name.trim()\r\n if (!name) throw new TypeError('prompt section requires a non-empty name')\r\n if (this._sections.has(name)) {\r\n throw new Error(`prompt section already registered: ${name}`)\r\n }\r\n this._sections.set(name, { ...section, name })\r\n this._emitChange()\r\n return () => {\r\n this._sections.delete(name)\r\n this._emitChange()\r\n }\r\n }\r\n\r\n sections(): readonly PromptSection[] {\r\n return [...this._sections.values()]\r\n .sort((left, right) => (left.order ?? 0) - (right.order ?? 0))\r\n }\r\n\r\n registerTools(provider: ToolSchemaProvider): () => void {\r\n if (typeof provider !== 'function') throw new TypeError('tool provider must be a function')\r\n this._toolProviders.push(provider)\r\n this._emitChange()\r\n return () => {\r\n const index = this._toolProviders.indexOf(provider)\r\n if (index >= 0) this._toolProviders.splice(index, 1)\r\n this._emitChange()\r\n }\r\n }\r\n\r\n async toolSchemas(options: SystemPromptAssemblyOptions = {}): Promise<ToolSchemaSnapshot[]> {\r\n const seen = new Set<string>()\r\n const tools: ToolSchemaSnapshot[] = []\r\n for (const provider of this._toolProviders) {\r\n for (const schema of await provider(options)) {\r\n if (!seen.has(schema.name)) {\r\n seen.add(schema.name)\r\n tools.push(schema)\r\n }\r\n }\r\n }\r\n return tools\r\n }\r\n\r\n registerVariable(name: string, provider: PromptVariableProvider): () => void {\r\n const key = name.trim()\r\n if (!/^[a-zA-Z][a-zA-Z0-9_]*$/.test(key)) {\r\n throw new TypeError(`invalid prompt variable name: ${name}`)\r\n }\r\n if (typeof provider !== 'function') throw new TypeError('variable provider must be a function')\r\n if (this._variables.has(key)) throw new Error(`prompt variable already registered: ${key}`)\r\n this._variables.set(key, provider)\r\n this._emitChange()\r\n return () => {\r\n this._variables.delete(key)\r\n this._emitChange()\r\n }\r\n }\r\n\r\n registerContext(context: PromptContextProvider): () => void {\r\n const name = context.name.trim()\r\n if (!name) throw new TypeError('prompt context requires a non-empty name')\r\n if (this._contexts.some(entry => entry.name === name)) {\r\n throw new Error(`prompt context already registered: ${name}`)\r\n }\r\n this._contexts.push({ ...context, name })\r\n this._emitChange()\r\n return () => {\r\n this._contexts = this._contexts.filter(entry => entry.name !== name)\r\n this._emitChange()\r\n }\r\n }\r\n\r\n async assemble(\r\n options: SystemPromptAssemblyOptions = {},\r\n ctx?: Context,\r\n ): Promise<PromptAssembly> {\r\n const activeCtx = ctx ?? this._ctx\r\n const sections = this.sections()\r\n const variables = await this._resolveVariables(options)\r\n const renderedSections = sections.map(section => ({\r\n ...section,\r\n content: renderTemplate(section.content, variables),\r\n }))\r\n const dynamicContexts = await this._resolveContexts(options)\r\n const contextText = dynamicContexts\r\n .map(context => renderTemplate(context.content, variables))\r\n .filter(Boolean)\r\n const base: PromptAssembly = {\r\n sections: renderedSections,\r\n text: [\r\n ...renderedSections.map(section => section.content).filter(Boolean),\r\n ...contextText,\r\n ].join('\\n\\n'),\r\n ...(Object.keys(variables).length ? { variables } : {}),\r\n ...(Object.keys(options).length ? { context: options } : {}),\r\n }\r\n const tools = await this.toolSchemas(options)\r\n if (tools.length) base.tools = tools\r\n if (!activeCtx) return base\r\n const resolved = await activeCtx.waterfallAsync(\r\n 'system-prompt/assemble',\r\n base,\r\n async (assembly: PromptAssembly) => assembly,\r\n )\r\n return resolved ?? base\r\n }\r\n\r\n private async _resolveVariables(\r\n options: SystemPromptAssemblyOptions,\r\n ): Promise<Record<string, string>> {\r\n const result: Record<string, string> = {}\r\n for (const [name, provider] of this._variables) {\r\n const value = await provider(options)\r\n if (value !== undefined) result[name] = value\r\n }\r\n return result\r\n }\r\n\r\n private async _resolveContexts(\r\n options: SystemPromptAssemblyOptions,\r\n ): Promise<readonly { name: string; content: string }[]> {\r\n const contexts = this._contexts.slice()\r\n .sort((left, right) => (left.order ?? 0) - (right.order ?? 0))\r\n const result: Array<{ name: string; content: string }> = []\r\n for (const context of contexts) {\r\n const value = await context.content(options)\r\n if (value) result.push({ name: context.name, content: value })\r\n }\r\n return result\r\n }\r\n\r\n private _emitChange(): void {\r\n this._ctx?.emit('system-prompt/change')\r\n }\r\n}\r\n\r\nfunction renderTemplate(text: string, variables: Record<string, string>): string {\r\n return text.replace(/\\$\\{([a-zA-Z][a-zA-Z0-9_]*)\\}/g, (match, name: string) => {\r\n return variables[name] ?? match\r\n })\r\n}\r\n\r\nexport const systemPrompt = {\r\n name: 'system-prompt',\r\n apply: (ctx: Context) => {\r\n const service = new SystemPromptService(ctx)\r\n ctx.provide('systemPrompt', service)\r\n return () => {}\r\n },\r\n} satisfies Plugin\r\n", "import type { Context, Plugin } from '@tnega/core'\r\nimport type { LLMAdapter } from './types.js'\r\n\r\nexport interface LlmRouteCapacity {\r\n provider: string\r\n model: string\r\n contextWindow?: number\r\n}\r\n\r\nexport class LlmService {\r\n private _adapters = new Map<string, LLMAdapter>()\r\n private _current: LLMAdapter | undefined\r\n private _defaultName: string | undefined\r\n\r\n register(name: string, adapter: LLMAdapter): () => void {\r\n const key = name.trim()\r\n if (!key) throw new TypeError('llm provider requires a non-empty name')\r\n if (this._adapters.has(key)) throw new Error(`llm provider already registered: ${key}`)\r\n this._adapters.set(key, adapter)\r\n if (!this._current) {\r\n this._current = adapter\r\n this._defaultName = key\r\n }\r\n return () => {\r\n this._adapters.delete(key)\r\n if (this._defaultName === key) {\r\n this._defaultName = undefined\r\n this._current = this._adapters.values().next().value\r\n }\r\n }\r\n }\r\n\r\n setCurrent(name: string): LLMAdapter {\r\n const adapter = this._adapters.get(name.trim())\r\n if (!adapter) throw new Error(`llm provider not found: ${name}`)\r\n this._current = adapter\r\n this._defaultName = name.trim()\r\n return adapter\r\n }\r\n\r\n current(): LLMAdapter | undefined {\r\n return this._current\r\n }\r\n\r\n list(): readonly { name: string; adapter: LLMAdapter }[] {\r\n return [...this._adapters.entries()].map(([name, adapter]) => ({ name, adapter }))\r\n }\r\n\r\n /**\r\n * Report provider/model/contextWindow for the current route. The adapter\r\n * may be registered with an optional capacity provider by callers that own\r\n * the model catalog (for example the CLI runtime).\r\n */\r\n routeCapacity(): LlmRouteCapacity | undefined {\r\n if (!this._current || !this._defaultName) return undefined\r\n const provider = this._defaultName\r\n const model = (this._current as unknown as { model?: string }).model\r\n const contextWindow = this._capacityFor?.(model)\r\n const result: LlmRouteCapacity = { provider, model: model ?? '' }\r\n if (contextWindow !== undefined) result.contextWindow = contextWindow\r\n return result\r\n }\r\n\r\n private _capacityFor: ((model: string | undefined) => number | undefined) | undefined\r\n\r\n /** Install a catalog-backed contextWindow resolver (optional). */\r\n setCapacityResolver(resolver: (model: string | undefined) => number | undefined): void {\r\n this._capacityFor = resolver\r\n }\r\n}\r\n\r\nexport const llmService = {\r\n name: 'llm-service',\r\n apply: (ctx: Context) => {\r\n ctx.provide('llm', new LlmService())\r\n return () => {}\r\n },\r\n} satisfies Plugin\r\n"],
5
- "mappings": "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",
6
- "names": ["randomUUID", "previous", "stringify", "resolve", "randomUUID", "llmService", "systemPrompt", "name", "randomUUID", "randomUUID", "resolve", "randomUUID", "agent", "name", "name"]
3
+ "sources": ["../packages/agent/src/service.ts", "../packages/session/src/index.ts", "../packages/session/src/invariant.ts", "../packages/agent/src/definition.ts", "../packages/agent/src/live.ts", "../packages/core/src/utils.ts", "../packages/core/src/events.ts", "../packages/core/src/fiber.ts", "../packages/core/src/logger.ts", "../packages/core/src/reflect.ts", "../packages/core/src/registry.ts", "../packages/core/src/context.ts", "../packages/core/src/service.ts", "../packages/agent/src/inbox-durable.ts", "../packages/agent/src/prompt.ts", "../packages/agent/src/llm-service.ts"],
4
+ "sourcesContent": ["import type { Context } from '@tnega/core'\r\nimport { randomUUID } from 'node:crypto'\r\n\r\nimport {\r\n DEFAULT_CONTEXT_LIMIT,\r\n estimateContextUsage,\n type AssistantMessagePayload,\n type AssistantStreamChunk,\n type AssistantStreamRecord,\n type ModelMessage,\r\n type RequestContextPayload,\r\n type SessionLog,\r\n type ToolResultPayload,\r\n type TurnEndReason,\r\n} from '@tnega/session'\r\nimport type { ToolDefinition, ToolError, ToolResult } from '@tnega/tools'\r\nimport type { ToolSchemaSnapshot } from './prompt.js'\r\nimport type { ToolsService } from '@tnega/tools'\r\n\r\nimport type {\r\n AgentContextBudget,\n AgentAssistantStreamEvent,\n AgentCancelCause,\r\n AgentFinishReason,\r\n AgentHooks,\r\n AgentInput,\r\n AgentNextStepClaimer,\r\n AgentPreStepEvent,\r\n AgentRequestErrorEvent,\r\n AgentRequestEvent,\r\n AgentRequestRetryDecision,\r\n AgentRunOptions,\r\n AgentRunResult,\r\n AgentStep,\r\n AgentStreamEvent,\r\n LLMStreamRequestEvent,\r\n AgentTurnStoppingEvent,\r\n CompleteOptions,\r\n LLMAdapter,\r\n LLMCompletion,\r\n LLMStreamEvent,\r\n LLMToolCall,\r\n} from './types.js'\r\n\r\nexport class AgentError extends Error {\r\n override name = 'AgentError'\r\n}\r\n\r\nexport class AgentInbox {\r\n private _queue: AgentInput[] = []\r\n private _steerQueue: AgentInput[] = []\r\n private _injected = new Map<string, unknown>()\r\n\r\n get size(): number {\r\n return this._queue.length + this._steerQueue.length\r\n }\r\n\r\n get steerSize(): number {\r\n return this._steerQueue.length\r\n }\r\n\r\n push(input: AgentInput): AgentInput {\r\n this._queue.push(input)\r\n return input\r\n }\r\n\r\n followup(input: AgentInput): AgentInput {\r\n return this.push(input)\r\n }\r\n\r\n steer(input: AgentInput): AgentInput {\r\n this._steerQueue.push(input)\r\n return input\r\n }\r\n\r\n send(\r\n input: AgentInput,\r\n options: { mode?: 'followup' | 'steer'; wake?: boolean } = {},\r\n ): AgentInput {\r\n if (options.mode === 'steer') return this.steer(input)\r\n return this.followup(input)\r\n }\r\n\r\n claim(): AgentInput | undefined {\r\n return this._steerQueue.shift() ?? this._queue.shift()\r\n }\r\n\r\n peek(): AgentInput | undefined {\r\n return this._steerQueue[0] ?? this._queue[0]\r\n }\r\n\r\n inject(key: string, value: unknown): void {\r\n this._injected.set(key, value)\r\n }\r\n\r\n injected(): ReadonlyMap<string, unknown> {\r\n return new Map(this._injected)\r\n }\r\n}\r\n\r\nexport interface AgentConfig {\r\n llm?: LLMAdapter\r\n /** Bind the loop to a specific session instead of the ctx-provided singleton. */\r\n session?: SessionLog\r\n /** Compatibility diagnostic flag; request replayability is always enforced. */\r\n assertReplayable?: boolean\r\n maxTurns?: number\r\n maxSteps?: number\r\n inbox?: AgentInbox\r\n hooks?: AgentHooks\r\n contextBudget?: AgentContextBudget\r\n /** Optional live-agent seam for work admitted after the first step. */\r\n claimNextStep?: AgentNextStepClaimer\r\n}\r\n\r\nfunction copyMessages(messages: readonly ModelMessage[]): ModelMessage[] {\r\n return messages.map((message) => {\r\n const copy: ModelMessage = {\r\n role: message.role,\r\n content: message.content,\r\n }\r\n if (message.name) copy.name = message.name\r\n if (message.tool_call_id) copy.tool_call_id = message.tool_call_id\r\n if (message.toolOk !== undefined) copy.toolOk = message.toolOk\r\n if (message.toolError) copy.toolError = { ...message.toolError }\r\n if (message.tool_calls) {\r\n copy.tool_calls = message.tool_calls.map(call => ({\r\n id: call.id,\r\n name: call.name,\r\n arguments: structuredClone(call.arguments),\r\n }))\r\n }\r\n return copy\r\n })\r\n}\r\n\r\nfunction isUserOrSystemMessage(\r\n message: ModelMessage,\r\n): message is ModelMessage & { role: 'system' | 'user' } {\r\n return message.role === 'system' || message.role === 'user'\r\n}\r\n\r\nfunction stringify(value: unknown): string {\r\n if (typeof value === 'string') return value\r\n try {\r\n return JSON.stringify(value) ?? String(value)\r\n } catch {\r\n return String(value)\r\n }\r\n}\r\n\r\nfunction copyCompletion(completion: LLMCompletion): LLMCompletion {\r\n const copy: LLMCompletion = {\r\n finishReason: completion.finishReason,\r\n }\r\n if (completion.content !== undefined) copy.content = completion.content\r\n if (completion.toolCalls) {\r\n copy.toolCalls = completion.toolCalls.map(call => ({\r\n id: call.id,\r\n name: call.name,\r\n arguments: call.arguments,\r\n }))\r\n }\r\n return copy\r\n}\r\n\r\nfunction canonicalMessages(messages: readonly ModelMessage[]): string {\r\n return JSON.stringify(messages.map(message => ({\r\n role: message.role,\r\n content: message.content,\r\n ...(message.name ? { name: message.name } : {}),\r\n ...(message.tool_call_id ? { tool_call_id: message.tool_call_id } : {}),\r\n ...(message.tool_calls?.length ? { tool_calls: message.tool_calls } : {}),\r\n ...(message.toolOk !== undefined ? { toolOk: message.toolOk } : {}),\r\n ...(message.toolError ? {\r\n toolError: { name: message.toolError.name, message: message.toolError.message },\r\n } : {}),\r\n })))\r\n}\r\n\r\nfunction freezeRequestData(data: unknown): void {\r\n const visited = new Set<object>()\r\n const freeze = (value: unknown): void => {\r\n if (typeof value !== 'object' || value === null || visited.has(value)) return\r\n visited.add(value)\r\n for (const child of Object.values(value)) freeze(child)\r\n Object.freeze(value)\r\n }\r\n freeze(data)\r\n}\r\n\r\nfunction lockStreamRequest(request: LLMStreamRequestEvent): void {\r\n freezeRequestData(request.messages)\r\n request.tools = Object.freeze(request.tools.map(tool => {\r\n // Tool definitions belong to the registry. Lock a request-local schema\r\n // snapshot so later requests can still update the registered definition.\r\n const schema = structuredClone(tool.schema)\r\n freezeRequestData(schema)\r\n return Object.freeze({ ...tool, schema })\r\n }))\r\n // The signal remains live; only the request's option bindings are locked.\r\n Object.freeze(request.options)\r\n Object.freeze(request)\r\n}\r\n\r\nfunction requestHeaderFor(\r\n request: Pick<AgentRequestEvent, 'tools' | 'options'>,\r\n input: readonly ModelMessage[],\r\n): {\r\n config?: { provider?: string; model?: string; temperature?: number }\r\n system?: string\r\n tools?: ToolSchemaSnapshot[]\r\n} {\r\n const system = input.find(message => message.role === 'system')?.content\r\n const tools = request.tools.map(tool => ({\r\n name: tool.schema.name,\r\n description: tool.schema.description,\r\n ...(tool.schema.parameters ? { parameters: tool.schema.parameters } : {}),\r\n }))\r\n const config = {\r\n ...(request.options.provider ? { provider: request.options.provider } : {}),\r\n ...(request.options.model ? { model: request.options.model } : {}),\r\n ...(request.options.temperature !== undefined\r\n ? { temperature: request.options.temperature }\r\n : {}),\r\n }\r\n return {\r\n ...(Object.keys(config).length ? { config } : {}),\r\n ...(system !== undefined ? { system } : {}),\r\n ...(tools.length ? { tools } : {}),\r\n }\r\n}\r\n\r\nasync function* completeAsStream(\r\n llm: LLMAdapter,\r\n messages: readonly ModelMessage[],\r\n tools: readonly ToolDefinition[],\r\n options: CompleteOptions,\r\n): AsyncGenerator<LLMStreamEvent, void, void> {\r\n const id = randomUUID()\r\n yield { type: 'message_start', id }\r\n const completion = await llm.complete(messages, tools, options)\r\n if (completion.content) yield { type: 'message_delta', id, delta: completion.content }\r\n for (let index = 0; index < (completion.toolCalls?.length ?? 0); index += 1) {\r\n const call = completion.toolCalls![index]!\r\n yield { type: 'toolcall_start', id: call.id, index, name: call.name }\r\n yield {\r\n type: 'toolcall_end',\r\n id: call.id,\r\n index,\r\n name: call.name,\r\n arguments: call.arguments,\r\n }\r\n }\r\n yield { type: 'message_stop', id, finishReason: completion.finishReason }\r\n}\r\n\r\nfunction isCancelCause(value: unknown): value is AgentCancelCause {\r\n if (typeof value !== 'object' || value === null) return false\r\n const record = value as Record<string, unknown>\r\n if (record.type === 'user' || record.type === 'parent' || record.type === 'disposed') {\r\n return true\r\n }\r\n if (\r\n record.type === 'abort'\r\n && (record.message === undefined || typeof record.message === 'string')\r\n ) {\r\n return true\r\n }\r\n if (record.type === 'timeout' && typeof record.timeoutMs === 'number') {\r\n return true\r\n }\r\n return false\r\n}\r\n\r\nfunction cancelCauseFromSignal(signal?: AbortSignal): AgentCancelCause | undefined {\r\n if (!signal?.aborted) return undefined\r\n const reason = signal.reason\r\n if (isCancelCause(reason)) return reason\r\n return { type: 'abort' }\r\n}\r\n\r\nfunction abortedToolError(signal?: AbortSignal): ToolError {\r\n const cause = cancelCauseFromSignal(signal)\r\n return {\r\n name: 'AbortError',\r\n message: `tool call aborted: ${cause?.type ?? 'abort'}`,\r\n }\r\n}\r\n\r\n/** Map a completed loop to the typed durable reason a `turn/end` records. */\r\nfunction toTurnEndReason(fields: {\r\n cancelled: boolean\r\n turnError: unknown\r\n finishReason: AgentFinishReason\r\n cancelCause?: AgentCancelCause\r\n}): TurnEndReason {\r\n const { cancelled, turnError, finishReason, cancelCause } = fields\r\n if (cancelled || finishReason === 'cancelled') {\r\n return { kind: 'aborted', cause: cancelCause ?? { type: 'user' } }\r\n }\r\n if (turnError || finishReason === 'error') {\r\n return {\r\n kind: 'error',\r\n error: turnError\r\n ? toToolError(turnError)\r\n : { name: 'TurnError', message: finishReason },\r\n }\r\n }\r\n switch (finishReason) {\r\n case 'length':\r\n return { kind: 'max-tokens' }\r\n case 'max_steps':\r\n return { kind: 'max-steps' }\r\n case 'max_turns':\r\n return { kind: 'max-turns' }\r\n default:\r\n return { kind: 'completed' }\r\n }\r\n}\r\n\r\nfunction partialStreamContent(events: readonly LLMStreamEvent[]): string {\r\n let content = ''\r\n for (const event of events) {\r\n if (event.type === 'message_delta') content += event.delta\r\n }\r\n return content\r\n}\r\n\r\nasync function cancellableDelay(ms: number, signal?: AbortSignal): Promise<boolean> {\r\n if (ms <= 0) return !signal?.aborted\r\n if (signal?.aborted) return false\r\n return new Promise(resolve => {\r\n const timer = setTimeout(() => {\r\n signal?.removeEventListener('abort', onAbort)\r\n resolve(true)\r\n }, ms)\r\n const onAbort = (): void => {\r\n clearTimeout(timer)\r\n resolve(false)\r\n }\r\n signal?.addEventListener('abort', onAbort, { once: true })\r\n })\r\n}\r\n\r\n/** Owns accumulation, transient framing and exactly one durable settlement. */\nclass AssistantStreamAttempt {\n private readonly attemptId = randomUUID()\n private readonly records: AssistantStreamRecord[] = []\n private ended = false\n\n constructor(\n private readonly session: SessionLog,\n private readonly turn: number,\n private readonly step: number,\n private readonly nextRevision: () => number,\n ) {}\n\n start(): AgentAssistantStreamEvent {\n return { type: 'assistant/stream', frame: {\n type: 'start', attemptId: this.attemptId, revision: this.nextRevision(),\n turn: this.turn, step: this.step,\n } }\n }\n\n push(chunk: AssistantStreamChunk): AgentAssistantStreamEvent {\n if (this.ended) throw new AgentError('assistant attempt is already settled')\n const record = { time: Date.now(), chunk: structuredClone(chunk) }\n const index = this.records.length\n this.records.push(record)\n return { type: 'assistant/stream', frame: {\n type: 'chunk', attemptId: this.attemptId, revision: this.nextRevision(), index,\n ...structuredClone(record),\n } }\n }\n\n async settle(message?: AssistantMessagePayload): Promise<AgentAssistantStreamEvent> {\n if (this.ended) throw new AgentError('assistant attempt is already settled')\n const eventType = message ? 'assistant/message' : 'assistant/attempt'\n let event\n try {\n event = message\n ? await this.session.append('assistant/message', { ...message, stream: this.records })\n : await this.session.append('assistant/attempt', { turn: this.turn, step: this.step, stream: this.records })\n } catch (cause) {\n this.ended = true\n const frame: AgentAssistantStreamEvent = { type: 'assistant/stream', frame: {\n type: 'end', attemptId: this.attemptId, revision: this.nextRevision(), index: this.records.length,\n outcome: { kind: 'abandoned' },\n } }\n throw new AttemptSettlementError(cause, frame)\n }\n this.ended = true\n return { type: 'assistant/stream', frame: {\n type: 'end', attemptId: this.attemptId, revision: this.nextRevision(), index: this.records.length,\n outcome: { kind: 'committed', eventType, seq: event.seq },\n } }\n }\n}\n\nclass AttemptSettlementError extends Error {\n constructor(override readonly cause: unknown, readonly frame: AgentAssistantStreamEvent) {\n super('assistant attempt settlement failed')\n }\n}\n\nexport class AgentService {\n private async *settleAttempt(\n attempt: AssistantStreamAttempt,\n message?: AssistantMessagePayload,\n ): AsyncGenerator<AgentAssistantStreamEvent, void, void> {\n try {\n yield await attempt.settle(message)\n } catch (error) {\n if (error instanceof AttemptSettlementError) {\n yield error.frame\n throw error.cause\n }\n throw error\n }\n }\n\n readonly inbox: AgentInbox\r\n private _seriesStarted = false\r\n private _persistedRequest = false\n private _streamRevision = 0\n\n private _attempt(session: SessionLog, turn: number, step: number): AssistantStreamAttempt {\n return new AssistantStreamAttempt(session, turn, step, () => ++this._streamRevision)\n }\n\r\n constructor(\r\n private ctx: Context,\r\n private config: AgentConfig = {},\r\n ) {\r\n this.inbox = config.inbox ?? new AgentInbox()\r\n }\r\n\r\n /** Call when a request begins an explicit new model-message series. */\r\n startSeries(): void {\r\n this._seriesStarted = true\r\n }\r\n\r\n /** Clear any pending series marker after a completed run. */\r\n endSeriesBoundary(): void {\r\n this._seriesStarted = false\r\n }\r\n\r\n /** True when this service instance has already persisted a model-visible step. */\r\n get hasPersistedRequest(): boolean {\r\n return this._persistedRequest\r\n }\r\n\r\n async run(input?: AgentInput, options: AgentRunOptions = {}): Promise<AgentRunResult> {\r\n return consumeAgentStream(this._stream(input, options))\r\n }\r\n\r\n async *runStream(\r\n input?: AgentInput,\r\n options: AgentRunOptions = {},\r\n ): AsyncGenerator<AgentStreamEvent, AgentRunResult, void> {\r\n const iterator = this._stream(input, options)[Symbol.asyncIterator]()\r\n while (true) {\r\n const next = await iterator.next()\r\n if (next.done) return next.value\r\n yield next.value\r\n }\r\n }\r\n\r\n private async *_stream(\r\n input?: AgentInput,\r\n options: AgentRunOptions = {},\r\n ): AsyncGenerator<AgentStreamEvent, AgentRunResult, void> {\r\n const claimed = input ?? this.inbox.claim()\r\n if (!claimed) throw new AgentError('no agent input available')\r\n await this.config.hooks?.beforeRun?.(claimed, options)\r\n\r\n const session = this._session()\r\n const tools = this._tools()\r\n const llm = this._llm()\r\n if (!llm) throw new AgentError('no LLM adapter available')\r\n const streamAdapter = llm.stream\r\n const persistChunks = streamAdapter !== undefined\r\n\r\n const maxTurns = options.maxTurns ?? this.config.maxTurns ?? 64\r\n const maxSteps = options.maxSteps ?? this.config.maxSteps ?? 64\r\n const contextBudget = options.contextBudget ?? this.config.contextBudget\r\n const injected = this.inbox.injected()\r\n this.ctx.emit('agent/start', { input: claimed, options, injected })\r\n\r\n let messages = await this._initialMessages(claimed)\n let claimedMessages = messages.filter(message => message.role === 'user')\n const steps: AgentStep[] = []\r\n let output = ''\r\n let finishReason: AgentFinishReason = 'stop'\n let lengthReached = false\n\r\n this.ctx.emit('agent/turn-start', {\r\n input: claimed,\r\n messages: copyMessages(messages),\r\n injected,\r\n })\r\n\r\n const turn = options.turn ?? await session.nextTurn()\n if (options.turn === undefined) {\n await session.append('turn/start', {\n turn,\n input: claimed.text ?? claimed,\n reason: 'user',\n })\n }\n\r\n let index = 0\r\n let finalTurnGranted = false\r\n let currentStepIndex: number | undefined\r\n let turnError: unknown\r\n try {\r\n while (index < maxTurns + (finalTurnGranted ? 1 : 0)) {\r\n if (options.signal?.aborted) {\r\n finishReason = 'cancelled'\r\n break\r\n }\r\n if (steps.length >= maxSteps) {\r\n finishReason = 'max_steps'\r\n break\r\n }\r\n if (contextBudget) {\r\n messages = await this._enforceContextBudget(session, contextBudget, messages)\r\n }\r\n\r\n const stepInput = copyMessages(messages)\r\n const preStep = await this.ctx.waterfallAsync('agent/pre-step', {\n index,\r\n turn,\r\n step: index,\n messages: stepInput,\n claimedMessages: copyMessages(claimedMessages),\n ...(options.signal ? { signal: options.signal } : {}),\r\n }, (payload: AgentPreStepEvent) => payload)\r\n if (\n !preStep\n || preStep.admission === 'reject'\n || !Array.isArray(preStep.messages)\n || !preStep.messages.length\n ) {\n break\r\n }\r\n if (preStep.startsRequestSeries) this._seriesStarted = true\r\n\r\n await session.append('step/start', { turn, step: index })\r\n currentStepIndex = index\r\n\r\n const requestedInput = copyMessages(preStep.messages)\r\n // Request rewrites may replace the current surface, but retries retain\r\n // the durable owners present when this step was admitted.\r\n const admittedHistory = await session.deriveMessages()\r\n this.ctx.emit('agent/step', {\r\n index,\r\n turn,\r\n step: index,\r\n input: copyMessages(requestedInput),\r\n })\r\n const availableTools = finalTurnGranted ? [] : await this._resolveAvailableTools()\r\n const completeOptions: CompleteOptions = {\r\n maxSteps: maxSteps - steps.length,\r\n }\r\n if (options.signal) completeOptions.signal = options.signal\r\n\r\n let llmMessages = copyMessages(requestedInput)\r\n\r\n let completion: LLMCompletion | undefined\n let activeAttempt: AssistantStreamAttempt | undefined\n let attempt = 0\r\n while (true) {\r\n if (options.signal?.aborted) {\r\n finishReason = 'cancelled'\r\n break\r\n }\r\n const streamEvents: LLMStreamEvent[] = []\n activeAttempt = this._attempt(session, turn, index)\n yield activeAttempt.start()\n const streamRequest: LLMStreamRequestEvent = {\r\n index,\r\n messages: copyMessages(requestedInput),\r\n tools: [...availableTools],\r\n options: { ...completeOptions },\r\n }\r\n try {\r\n const request = await this.ctx.waterfallAsync('agent/request', {\n index,\r\n messages: copyMessages(requestedInput),\r\n tools: streamRequest.tools,\r\n options: streamRequest.options,\r\n }, (payload: AgentRequestEvent) => payload)\r\n if (!request || !request.options || !request.tools) {\r\n throw new AgentError('agent/request must return a request payload')\r\n }\r\n streamRequest.tools = request.tools\r\n streamRequest.options = request.options\r\n let preparation: Promise<void> | undefined\r\n const prepareRequest = (): Promise<void> => preparation ??= (async () => {\r\n // Waterfalls may rewrite the envelope until consumption begins.\r\n // Lazy streams must dispatch the same request that is persisted.\r\n lockStreamRequest(streamRequest)\r\n llmMessages = copyMessages(streamRequest.messages)\r\n await this._persistStepInput(session, streamRequest, llmMessages, admittedHistory)\r\n await this._assertReplayable(session, streamRequest, llmMessages)\r\n })()\r\n const stream = await this.ctx.waterfallAsync(\r\n 'llm/stream',\r\n streamRequest,\r\n (payload: LLMStreamRequestEvent) => (async function* () {\r\n // A listener can consume next() itself. Guard that dispatch too.\r\n await prepareRequest()\r\n yield* streamAdapter\r\n ? streamAdapter.call(llm, payload.messages, payload.tools, payload.options)\r\n : completeAsStream(llm, payload.messages, payload.tools, payload.options)\r\n })(),\r\n )\r\n if (!stream || typeof stream[Symbol.asyncIterator] !== 'function') {\r\n throw new AgentError('llm/stream must return an async iterable stream')\r\n }\r\n // Short-circuit streams must obey the same request invariant.\r\n await prepareRequest()\r\n let chunkIndex = 0\r\n for await (const event of stream) {\n streamEvents.push(structuredClone(event))\n yield activeAttempt.push(event)\n if (persistChunks && event.type === 'message_delta') {\r\n await session.append('assistant/chunk', {\r\n id: event.id,\r\n content: event.delta,\r\n index: chunkIndex,\r\n })\r\n chunkIndex += 1\r\n }\r\n yield event\r\n }\n completion = completionFromStreamEvents(streamEvents)\n if (completion.finishReason === 'error' || completion.finishReason === 'cancelled') {\n const terminalReason = completion.finishReason\n completion = undefined\n throw new AgentError(`LLM stream finished with ${terminalReason}`)\n }\n break\n } catch (error) {\n yield activeAttempt.push({ type: 'stream_error', error: toToolError(error) })\n if (options.signal?.aborted) {\n const content = partialStreamContent(streamEvents)\n yield* this.settleAttempt(activeAttempt, content ? { content, interrupted: true } : undefined)\n finishReason = 'cancelled'\n break\n }\n yield* this.settleAttempt(activeAttempt)\n attempt += 1\r\n const failure = toToolError(error)\r\n const decision = await this.ctx.waterfallAsync(\r\n 'agent/request-error',\r\n {\r\n index,\r\n turn,\r\n step: index,\r\n messages: copyMessages(streamRequest.messages),\r\n tools: [...streamRequest.tools],\r\n options: { ...streamRequest.options },\r\n attempt,\r\n error,\r\n failure,\r\n ...(streamRequest.options.provider ? { provider: streamRequest.options.provider } : {}),\r\n ...(streamRequest.options.model ? { model: streamRequest.options.model } : {}),\r\n ...(options.signal ? { signal: options.signal } : {}),\r\n } satisfies AgentRequestErrorEvent,\r\n () => undefined,\r\n ) as AgentRequestRetryDecision\r\n if (options.signal?.aborted) {\r\n finishReason = 'cancelled'\r\n break\r\n }\r\n if (decision?.kind !== 'retry') throw error\r\n const retryId = randomUUID()\r\n const delayMs = decision.delayMs ?? 0\r\n await session.append('llm/retry', {\r\n retryId,\r\n retry: attempt,\r\n ...(delayMs > 0 ? { delayMs } : {}),\r\n failure: toToolError(error),\r\n })\r\n if (!await cancellableDelay(delayMs, options.signal)) {\r\n finishReason = 'cancelled'\r\n break\r\n }\r\n await session.append('llm/retry-started', { retryId, retry: attempt })\r\n }\r\n }\r\n if (!completion || !activeAttempt) {\n if (options.signal?.aborted) {\r\n finishReason = 'cancelled'\r\n break\r\n }\r\n throw new AgentError('LLM adapter did not produce a completion')\r\n }\r\n\r\n const toolCalls = completion.toolCalls ?? []\n if (completion.finishReason === 'length') lengthReached = true\n if (options.signal?.aborted && toolCalls.length === 0) {\n yield activeAttempt.push({ type: 'stream_error', error: { name: 'AbortError', message: 'stream aborted' } })\n yield* this.settleAttempt(activeAttempt)\n finishReason = 'cancelled'\n break\r\n }\r\n if (finalTurnGranted && toolCalls.length && !options.signal?.aborted) {\n yield activeAttempt.push({ type: 'stream_error', error: { name: 'AgentError', message: 'maximum turns reached' } })\n yield* this.settleAttempt(activeAttempt)\n finishReason = 'max_turns'\r\n break\r\n }\r\n const toolResults: ToolResult[] = []\r\n if (toolCalls.length) {\n yield* this.settleAttempt(activeAttempt, {\n content: completion.content ?? '',\r\n toolCalls: toolCalls.map(call => ({\r\n id: call.id,\r\n name: call.name,\r\n arguments: call.arguments,\r\n })),\r\n })\n }\r\n for (const call of toolCalls) {\r\n this.ctx.emit('agent/tool-call', { index, turn, step: index, call })\r\n yield { type: 'tool/start', index, turn, step: index, call }\r\n await session.append('tool/call', {\r\n id: call.id,\r\n name: call.name,\r\n arguments: call.arguments,\r\n })\r\n const toolOptions: { callId: string; signal?: AbortSignal } = { callId: call.id }\r\n if (options.signal) toolOptions.signal = options.signal\r\n const startedAt = Date.now()\r\n let result: ToolResult\r\n if (options.signal?.aborted) {\r\n result = {\r\n ok: false,\r\n name: call.name,\r\n callId: call.id,\r\n input: call.arguments,\r\n error: abortedToolError(options.signal),\r\n startedAt,\r\n durationMs: Date.now() - startedAt,\r\n }\r\n } else {\r\n try {\r\n result = await tools.execute(call.name, call.arguments, toolOptions)\r\n } catch (error) {\r\n result = {\r\n ok: false,\r\n name: call.name,\r\n callId: call.id,\r\n input: call.arguments,\r\n error: toToolError(error),\r\n startedAt,\r\n durationMs: Date.now() - startedAt,\r\n }\r\n }\r\n }\r\n toolResults.push(result)\r\n const toolResultPayload: ToolResultPayload = {\r\n id: call.id,\r\n toolCallId: call.id,\r\n name: call.name,\r\n ok: result.ok,\r\n durationMs: result.durationMs,\r\n }\r\n if (result.output !== undefined) toolResultPayload.output = result.output\r\n if (result.error) {\r\n toolResultPayload.error = {\r\n name: result.error.name,\r\n message: result.error.message,\r\n }\r\n if (result.error.stack) toolResultPayload.error.stack = result.error.stack\r\n }\r\n await session.append('tool/result', toolResultPayload)\r\n yield { type: 'tool/end', index, turn, step: index, call, result }\r\n this.ctx.emit('agent/tool-result', {\r\n index,\r\n turn,\r\n step: index,\r\n call,\r\n result,\r\n })\r\n }\r\n if (options.signal?.aborted) {\r\n finishReason = 'cancelled'\r\n break\r\n }\r\n\r\n steps.push({\r\n index,\r\n input: copyMessages(llmMessages),\r\n completion,\r\n toolResults,\r\n })\r\n\r\n if (completion.content) {\r\n output = completion.content\r\n }\r\n if (!toolCalls.length) {\n yield* this.settleAttempt(activeAttempt, { content: completion.content ?? '' })\n }\r\n\r\n await session.append('step/end', {\r\n turn,\r\n step: index,\r\n finishReason: completion.finishReason,\r\n toolCalls: toolCalls.length,\r\n })\r\n currentStepIndex = undefined\r\n\r\n const nextMessages = this._extendMessages(llmMessages, completion, toolResults)\n const concludesTurn = toolResults.some(result => result.concludesTurn === true)\n let nextStepMessages = await this._claimNextStepMessages()\n if ((toolCalls.length === 0 || concludesTurn) && nextStepMessages.length === 0) {\n finishReason = lengthReached\n ? 'length'\n : completion.finishReason === 'error'\r\n ? 'error'\r\n : 'stop'\r\n const keepGoing = await this.ctx.serial('agent/turn-stopping', {\r\n index,\r\n turn,\r\n steps: copySteps(steps),\r\n finishReason,\r\n } satisfies AgentTurnStoppingEvent) as unknown\r\n if (!keepGoing) {\r\n nextStepMessages = await this._claimNextStepMessages()\r\n if (nextStepMessages.length === 0) break\r\n }\r\n }\r\n if (index + 1 >= maxTurns && !finalTurnGranted) {\r\n finalTurnGranted = true\r\n } else if (index + 1 >= maxTurns + (finalTurnGranted ? 1 : 0)) {\r\n finishReason = 'max_turns'\r\n break\r\n }\r\n if (toolCalls.length) finishReason = 'tool_calls'\r\n index += 1\r\n messages = [...nextMessages, ...nextStepMessages]\n claimedMessages = nextStepMessages.filter(message => message.role === 'user')\n }\r\n } catch (error) {\r\n turnError = error\r\n throw error\r\n } finally {\r\n const cancelCause = cancelCauseFromSignal(options.signal)\r\n if (currentStepIndex !== undefined) {\r\n const cancelled = options.signal?.aborted\r\n await session.append('step/end', {\r\n turn,\r\n step: currentStepIndex,\r\n finishReason: cancelled\r\n ? 'cancelled'\r\n : turnError\r\n ? 'error'\r\n : 'interrupted',\r\n interrupted: true,\r\n ...(cancelCause ? { cancelCause } : {}),\r\n ...(turnError ? { error: toToolError(turnError) } : {}),\r\n })\r\n }\r\n await session.append('turn/end', {\r\n turn,\r\n finishReason: turnError\r\n ? (options.signal?.aborted ? 'cancelled' : 'error')\r\n : finishReason,\r\n reason: toTurnEndReason({\r\n cancelled: options.signal?.aborted ?? false,\r\n turnError,\r\n finishReason: turnError\r\n ? (options.signal?.aborted ? 'cancelled' : 'error')\r\n : finishReason,\r\n ...(cancelCause ? { cancelCause } : {}),\r\n }),\r\n ...(cancelCause ? { cancelCause } : {}),\r\n ...(output ? { output } : {}),\r\n ...(steps.length ? { steps: steps.length } : {}),\r\n ...(turnError ? { interrupted: true, error: toToolError(turnError) } : {}),\r\n })\r\n }\r\n\r\n const runResult: AgentRunResult = {\r\n input: claimed,\r\n output,\r\n finishReason,\r\n turn,\r\n steps,\r\n messages: copyMessages(messages),\r\n }\r\n this.ctx.emit('agent/turn-end', {\r\n input: claimed,\r\n steps: copySteps(steps),\r\n messages: copyMessages(messages),\r\n output,\r\n finishReason,\r\n })\r\n this.ctx.emit('agent/end', {\r\n input: claimed,\r\n steps: copySteps(steps),\r\n messages: copyMessages(messages),\r\n output,\r\n finishReason,\r\n })\r\n await this.config.hooks?.afterRun?.(runResult, options)\r\n\r\n yield { type: 'run/end', run: runResult }\r\n return runResult\r\n }\r\n\r\n private async _enforceContextBudget(\r\n session: SessionLog,\r\n budget: AgentContextBudget,\r\n messages: readonly ModelMessage[],\r\n ): Promise<ModelMessage[]> {\r\n const limit = budget.limit ?? DEFAULT_CONTEXT_LIMIT\r\n const compactRatio = budget.compactRatio ?? 0.9\r\n if (limit <= 0 || compactRatio <= 0 || compactRatio > 1) {\r\n throw new AgentError('invalid context budget: limit must be positive and compactRatio must be in (0, 1]')\r\n }\r\n const usage = estimateContextUsage(messages, limit)\r\n if (usage.ratio < compactRatio) return copyMessages(messages)\r\n const keepTokens = budget.keepTokens ?? Math.max(1, Math.floor(limit * 0.5))\r\n const compactMessages = budget.summarize\r\n ? await budget.summarize(messages, usage)\r\n : [{ role: 'system' as const, content: defaultContextSummary(messages, usage) }]\r\n const summary = compactMessages\r\n .map(message => `${message.role}: ${message.content}`)\r\n .join('\\n')\r\n await session.compact({\r\n keepTokens,\r\n summary,\r\n tokensBefore: usage.tokens,\r\n messages: compactMessages.map(message => copyMessages([message])[0]!),\r\n })\r\n this.ctx.emit('agent/context-compact', {\r\n type: 'agent/context-compact',\r\n messagesBefore: messages.length,\r\n tokensBefore: usage.tokens,\r\n limit,\r\n keepTokens,\r\n messagesAfter: compactMessages.length,\r\n })\r\n return compactMessages.map(message => copyMessages([message])[0]!)\r\n }\r\n\r\n private async _persistStepInput(\r\n session: SessionLog,\r\n request: Pick<AgentRequestEvent, 'tools' | 'options'>,\r\n input: readonly ModelMessage[],\r\n admittedHistory: readonly ModelMessage[],\r\n ): Promise<void> {\r\n const surface = await session.deriveMessages()\r\n const owned = admittedHistory.filter(message => !isUserOrSystemMessage(message))\r\n let ownerIndex = 0\r\n for (const message of input) {\r\n if (isUserOrSystemMessage(message)) continue\r\n const actual = canonicalMessages([message])\r\n while (ownerIndex < owned.length && canonicalMessages([owned[ownerIndex]!]) !== actual) {\r\n ownerIndex += 1\r\n }\r\n if (ownerIndex === owned.length) {\r\n throw new AgentError('request is not reconstructable from session log: unowned or reordered assistant/tool message')\r\n }\r\n ownerIndex += 1\r\n }\r\n const nextHeader = requestHeaderFor(request, input)\r\n const previousHeader = session.requestHeader()\r\n const isFirstRequest = !this._persistedRequest\r\n const isResume = isFirstRequest && previousHeader !== undefined\r\n this._persistedRequest = true\r\n const changedHeader = previousHeader && (\r\n previousHeader.system !== nextHeader.system\r\n || JSON.stringify(previousHeader.tools ?? []) !== JSON.stringify(nextHeader.tools ?? [])\r\n || JSON.stringify(previousHeader.config ?? {}) !== JSON.stringify(nextHeader.config ?? {})\r\n )\r\n if (isFirstRequest) {\r\n await session.append('request/header', {\r\n reason: this._seriesStarted\r\n ? 'series'\r\n : isResume\r\n ? 'resume'\r\n : 'initial',\r\n ...nextHeader,\r\n ...(this._seriesStarted ? { startsSeries: true } : {}),\r\n })\r\n } else if (changedHeader) {\r\n await session.append('request/header', {\r\n reason: this._seriesStarted ? 'change-series' : 'change',\r\n ...nextHeader,\r\n startsSeries: true,\r\n })\r\n } else if (this._seriesStarted) {\r\n await session.append('request/header', {\r\n reason: 'series',\r\n ...nextHeader,\r\n startsSeries: true,\r\n })\r\n }\r\n this._seriesStarted = false\r\n\r\n const nextContext: RequestContextPayload = {\n ...(request.options.provider ? { provider: request.options.provider } : {}),\r\n ...(request.options.model ? { model: request.options.model } : {}),\r\n }\n if (request.options.contextWindow !== undefined) {\n nextContext.contextWindow = request.options.contextWindow\n }\n const llmService = this.ctx.reflect.get('llm', false) as\r\n | { routeCapacity(): unknown }\r\n | undefined\r\n const routeCapacity = llmService?.routeCapacity?.() as\r\n | { provider?: string; model?: string; contextWindow?: number }\r\n | undefined\r\n if (nextContext.contextWindow === undefined && routeCapacity?.contextWindow !== undefined) {\n nextContext.contextWindow = routeCapacity.contextWindow\r\n }\r\n const previousContext = session.requestContext()\r\n if (\r\n previousContext?.provider !== nextContext.provider\r\n || previousContext?.model !== nextContext.model\r\n || previousContext?.contextWindow !== nextContext.contextWindow\r\n || (previousContext === undefined)\r\n ) {\r\n await session.append('request/context', nextContext)\r\n }\r\n const isSurfacePrefix = (messages: readonly ModelMessage[]): boolean =>\r\n canonicalMessages(messages.slice(0, surface.length)) === canonicalMessages(surface)\r\n // A run-scoped leading system may be owned by the effective header. Remove\r\n // exactly that prefix when the remaining transcript extends the surface.\r\n const requested = surface.length > 0\r\n && input[0]?.role === 'system'\r\n && input[0].content === nextHeader.system\r\n && isSurfacePrefix(input.slice(1))\r\n ? input.slice(1)\r\n : input\r\n const tail = requested.slice(surface.length)\r\n if (isSurfacePrefix(requested) && tail.every(isUserOrSystemMessage)) {\r\n for (const message of tail) {\r\n if (message.role === 'user') {\r\n await session.append('user/message', {\r\n content: message.content,\r\n ...(message.name ? { name: message.name } : {}),\r\n })\r\n } else {\r\n await session.append('system/message', {\r\n content: message.content,\r\n ...(message.name ? { name: message.name } : {}),\r\n })\r\n }\r\n }\r\n return\r\n }\r\n // Rewrites replace the model surface through the existing append-only\r\n // checkpoint operation. Prior raw history and its message owners remain.\r\n const nodes = await session.surfaceEvents()\r\n await session.append('checkpoint', {\r\n messages: copyMessages(requested),\r\n surfaceOp: { op: 'replace', start: nodes[0]!.seq, end: nodes.at(-1)!.seq },\r\n })\r\n }\r\n\r\n private async _assertReplayable(\r\n session: SessionLog,\r\n request: Pick<AgentRequestEvent, 'tools' | 'options'>,\r\n input: readonly ModelMessage[],\r\n ): Promise<void> {\r\n const reconstructed = await session.deriveMessages()\r\n const actual = canonicalMessages(input)\r\n const replay = canonicalMessages(reconstructed)\r\n const header = session.requestHeader()\r\n const headerOwnsPrefix = input[0]?.role === 'system'\r\n && input[0].content === header?.system\r\n && canonicalMessages(input.slice(1)) === replay\r\n if (actual !== replay && !headerOwnsPrefix) {\r\n throw new AgentError(\r\n `request is not reconstructable from session log: actual=${actual} replay=${replay}`,\r\n )\r\n }\r\n const expected = requestHeaderFor(request, input)\r\n if (\r\n header?.system !== expected.system\r\n || JSON.stringify(header?.tools ?? []) !== JSON.stringify(expected.tools ?? [])\r\n || JSON.stringify(header?.config ?? {}) !== JSON.stringify(expected.config ?? {})\r\n ) {\r\n throw new AgentError('request envelope is not reconstructable from session log')\r\n }\r\n }\r\n\r\n private async _claimNextStepMessages(): Promise<ModelMessage[]> {\r\n const inputs = await this.config.claimNextStep?.() ?? []\r\n return inputs.flatMap(input => input.messages?.length\r\n ? copyMessages(input.messages)\r\n : input.text\r\n ? [{ role: 'user' as const, content: input.text }]\r\n : input.context !== undefined\r\n ? [{ role: 'user' as const, content: stringify(input.context) }]\r\n : [])\r\n }\r\n\r\n private async _initialMessages(input: AgentInput): Promise<ModelMessage[]> {\r\n const promptService = this.ctx.reflect.get('systemPrompt', false) as\r\n | { assemble(options?: object, ctx?: Context): Promise<{ text: string }> }\r\n | undefined\r\n const assembled = promptService\r\n ? (await promptService.assemble({}, this.ctx)).text.trim()\r\n : undefined\r\n const systemPrompt = assembled || this.inbox.injected().get('agentSystem')\r\n const systemMessage = typeof systemPrompt === 'string' && systemPrompt\r\n ? [{ role: 'system' as const, content: systemPrompt }]\r\n : []\r\n if (input.messages?.length) {\r\n const first = input.messages[0]\r\n if (first?.role === 'system') return copyMessages(input.messages)\r\n return [...systemMessage, ...copyMessages(input.messages)]\r\n }\r\n if (input.text) return [...systemMessage, { role: 'user', content: input.text }]\r\n return systemMessage\r\n }\r\n\r\n private _extendMessages(\r\n messages: readonly ModelMessage[],\r\n completion: LLMCompletion,\r\n toolResults: readonly ToolResult[],\r\n ): ModelMessage[] {\r\n const next = copyMessages(messages)\r\n const assistant: ModelMessage = {\r\n role: 'assistant',\r\n content: completion.content ?? '',\r\n }\r\n const toolCalls = completion.toolCalls ?? []\r\n if (toolCalls.length) {\r\n assistant.tool_calls = toolCalls.map(call => ({\r\n id: call.id,\r\n name: call.name,\r\n arguments: call.arguments,\r\n }))\r\n }\r\n if (assistant.content || toolCalls.length) next.push(assistant)\r\n\r\n for (const call of toolCalls) {\r\n const result = toolResults.find(candidate => candidate.callId === call.id)\r\n const content = result\r\n ? result.ok\r\n ? stringify(result.output)\r\n : `error: ${result.error?.message ?? 'unknown'}`\r\n : 'error: missing tool result'\r\n const message: ModelMessage = {\r\n role: 'tool',\r\n content,\r\n tool_call_id: call.id,\r\n }\r\n message.name = result?.name ?? call.name\r\n if (result && !result.ok) {\r\n message.toolOk = false\r\n if (result.error) {\r\n message.toolError = {\r\n name: result.error.name,\r\n message: result.error.message,\r\n }\r\n }\r\n }\r\n next.push(message)\r\n }\r\n return next\r\n }\r\n\r\n private _session(): SessionLog {\r\n if (this.config.session) return this.config.session\r\n const session = (this.ctx as unknown as { session?: SessionLog }).session\r\n if (!session) throw new AgentError('session service is required')\r\n return session\r\n }\r\n\r\n private _tools(): ToolsService {\r\n const scoped = this.ctx.reflect.get('tools', false) as ToolsService | undefined\r\n const tools = scoped ?? (this.ctx as unknown as { tools?: ToolsService }).tools\r\n if (!tools) throw new AgentError('tools service is required')\r\n return tools\r\n }\r\n\r\n private async _resolveAvailableTools(): Promise<readonly ToolDefinition[]> {\r\n // Executable tools are the single source of truth. When a system-prompt\r\n // service is mounted, its assembled schema list narrows what the model\r\n // sees \u2014 but only to tools that are actually registered, so a declared\r\n // schema can never advertise an un-executable stub.\r\n const executable = this._tools().list()\r\n const promptService = this.ctx.reflect.get('systemPrompt', false) as\r\n | { toolSchemas(options?: object): Promise<readonly ToolSchemaSnapshot[]> }\r\n | undefined\r\n if (!promptService) return executable\r\n const schemas = await promptService.toolSchemas()\r\n if (!schemas.length) return executable\r\n const byName = new Map(executable.map(tool => [tool.schema.name, tool] as const))\r\n return schemas\r\n .map(schema => byName.get(schema.name))\r\n .filter((tool): tool is ToolDefinition => tool !== undefined)\r\n }\r\n\r\n private _llm(): LLMAdapter | undefined {\r\n if (this.config.llm) return this.config.llm\r\n const service = this.ctx.reflect.get('llm', false) as\r\n | { current(): LLMAdapter | undefined }\r\n | undefined\r\n return service?.current()\r\n }\r\n}\r\n\r\nfunction defaultContextSummary(\r\n messages: readonly ModelMessage[],\r\n usage: { tokens: number },\r\n): string {\r\n const latest = messages.at(-1)\r\n const latestText = latest ? `${latest.role}: ${latest.content}` : 'none'\r\n return [\r\n 'Earlier context was compacted.',\r\n `Messages before compaction: ${messages.length}.`,\r\n `Tokens before compaction: ${usage.tokens}.`,\r\n `Latest message: ${latestText}`,\r\n ].join(' ')\r\n}\r\n\r\nfunction copySteps(steps: readonly AgentStep[]): readonly AgentStep[] {\r\n return steps.map(step => ({\r\n index: step.index,\r\n input: copyMessages(step.input),\r\n completion: copyCompletion(step.completion),\r\n toolResults: step.toolResults.map(result => ({ ...result })),\r\n }))\r\n}\r\n\r\nfunction toToolError(error: unknown): ToolError {\r\n if (error instanceof Error) {\r\n const result: ToolError = {\r\n name: error.name,\r\n message: error.message,\r\n }\r\n if (error.stack) result.stack = error.stack\r\n return result\r\n }\r\n return {\r\n name: 'ToolExecutionError',\r\n message: String(error),\r\n }\r\n}\r\n\r\nfunction completionFromStreamEvents(events: readonly LLMStreamEvent[]): LLMCompletion {\r\n let content = ''\r\n const calls = new Map<number, LLMToolCall>()\r\n let finishReason: AgentFinishReason = 'error'\r\n for (const event of events) {\r\n if (event.type === 'message_delta') {\r\n content += event.delta\r\n } else if (event.type === 'toolcall_end') {\r\n calls.set(event.index, {\r\n id: event.id,\r\n name: event.name,\r\n arguments: event.arguments,\r\n })\r\n } else if (event.type === 'message_stop') {\r\n finishReason = event.finishReason\r\n }\r\n }\r\n const completion: LLMCompletion = { finishReason }\r\n if (content) completion.content = content\r\n if (calls.size) completion.toolCalls = [...calls.values()]\r\n return completion\r\n}\r\n\r\nasync function consumeAgentStream(\r\n stream: AsyncGenerator<AgentStreamEvent, AgentRunResult, void>,\r\n): Promise<AgentRunResult> {\r\n const iterator = stream[Symbol.asyncIterator]()\r\n while (true) {\r\n const next = await iterator.next()\r\n if (next.done) return next.value\r\n }\r\n}\r\n\r\nexport const agent = {\r\n name: 'agent',\r\n inject: ['session', 'tools'],\r\n apply: (ctx: Context, config: AgentConfig = {}) => {\r\n const service = new AgentService(ctx, config)\r\n ctx.provide('agent', service)\r\n ctx.provide('agentLoop', (input?: AgentInput, options?: AgentRunOptions) => service.run(input, options))\r\n ctx.provide('inbox', service.inbox)\r\n return () => {}\r\n },\r\n}\r\n\r\nexport const name = '@tnega/agent'\r\n", "import { randomUUID } from 'node:crypto'\r\nimport { appendFile, mkdir, readFile, writeFile } from 'node:fs/promises'\r\nimport { dirname, resolve } from 'node:path'\r\nimport type { Context } from '@tnega/core'\r\nimport { checkSessionInvariants, type SessionInvariantFailure } from './invariant.js'\r\n\r\n/**\r\n * v7 derives model-visible messages from the *folded surface* instead of from\r\n * raw file order, so compaction can stay strictly append-only.\r\n *\r\n * v6 rewrote the log on every real compaction: the kept tail was physically\r\n * reordered after the checkpoint (and every seq renumbered) purely so that a\r\n * file-order projection would equal the surface. v7 removes that coupling:\r\n * `deriveMessages()` walks the surface nodes in surface position order (a\r\n * replacement node may carry a *higher* seq than the nodes that follow it),\r\n * so compaction appends `compaction/start` \u2192 `checkpoint` (prefix +\r\n * `surfaceOp.replace` range) \u2192 `compaction/end` and never rewrites history.\r\n * To keep every surface node self-describing, `assistant/message` now carries\r\n * its own `toolCalls` (the assistant turn is not reassembled from separate\r\n * `tool/call` events at projection time).\r\n *\r\n * v10 extends the all-queue splice with explicit prefix delete counts, so a\n * mixed next-step/next-turn claim commits as one fact. v9 and older logs are\n * rejected without in-place migration.\n *\n * v9 adds an atomic `agent/inbox/spliced` clear target for both pending inbox\n * queues, so cancellation cannot durably remove only one queue.\n *\n * v8 adds terminal, log-only `assistant/attempt` records for attempts without\n * a surface message. Stream chunks are normalized before entering Session.\n */\nexport const SESSION_FORMAT_VERSION = 10\n\r\n/** Serialized tool schema, structurally compatible with @tnega/tools ToolSchema. */\r\nexport interface ToolSchemaSnapshot {\r\n name: string\r\n description: string\r\n parameters?: Record<string, unknown>\r\n}\r\n\r\n/** Call configuration recorded beside a request so it can be reconstructed. */\r\nexport interface LlmCallConfig {\r\n provider?: string\r\n model?: string\r\n maxTokens?: number\r\n temperature?: number\r\n reasoningEffort?: string\r\n}\r\n\r\nexport class SessionFormatError extends Error {\r\n override name = 'SessionFormatError'\r\n}\r\n\r\nconst liveSessions = new Map<string, SessionLog>()\r\n\r\nfunction sessionFileKey(file: string): string {\r\n return resolve(file)\r\n}\r\n\r\nexport type ModelRole = 'system' | 'user' | 'assistant' | 'tool'\r\n\r\nexport interface ModelToolCall {\r\n id: string\r\n name: string\r\n arguments: unknown\r\n}\r\n\r\nexport interface ModelMessage {\r\n role: ModelRole\r\n content: string\r\n name?: string\r\n tool_call_id?: string\r\n tool_calls?: ModelToolCall[]\r\n toolOk?: boolean\r\n toolError?: ToolResultErrorPayload\r\n}\r\n\r\nexport interface UserMessagePayload {\r\n content: string\r\n name?: string\r\n parentId?: string\r\n}\r\n\r\nexport interface AssistantMessagePayload {\n content: string\n /** Committed normalized stream for reconnect consumers; not model history. */\n stream?: AssistantStreamRecord[]\n name?: string\r\n parentId?: string\r\n interrupted?: boolean\r\n /**\r\n * The tool requests this assistant turn made, when it made any. The model\r\n * transcript is derived node-by-node from the surface, so an assistant turn\r\n * must carry its calls itself rather than being reassembled from the\r\n * separate (log-only) `tool/call` events that follow it.\r\n */\r\n toolCalls?: ModelToolCall[]\r\n}\r\n\r\nexport interface AssistantChunkPayload {\n id: string\r\n content: string\r\n index?: number\r\n}\n\n/** Session-owned normalized model output; never a provider wire payload. */\nexport type AssistantStreamChunk =\n | { type: 'message_start'; id: string; model?: string }\n | { type: 'message_delta'; id: string; delta: string }\n | { type: 'toolcall_start'; id: string; index: number; name: string }\n | { type: 'toolcall_end'; id: string; index: number; name: string; arguments: unknown }\n | { type: 'message_stop'; id: string; finishReason: AssistantStreamFinishReason }\n | { type: 'stream_error'; error: ToolResultErrorPayload }\n\nexport type AssistantStreamFinishReason =\n | 'stop'\n | 'tool_calls'\n | 'length'\n | 'max_turns'\n | 'max_steps'\n | 'error'\n | 'cancelled'\n\n/** One delivered chunk with its timestamp; array order preserves delivery order. */\nexport interface AssistantStreamRecord {\n time: number\n chunk: AssistantStreamChunk\n}\n\n/** Terminal settlement of an attempt that committed no assistant/message. */\nexport interface AssistantAttemptPayload {\n turn: number\n step: number\n /** May be empty when the request fails before delivering any chunks. */\n stream: AssistantStreamRecord[]\n}\n\r\nexport interface SystemMessagePayload {\r\n content: string\r\n name?: string\r\n parentId?: string\r\n}\r\n\r\nexport type MessageEventPayload =\r\n | UserMessagePayload\r\n | AssistantMessagePayload\r\n | SystemMessagePayload\r\n\r\nexport type MessageEventType = 'user/message' | 'assistant/message' | 'system/message'\r\n\r\nexport interface CompactionStartPayload {\r\n boundary?: number\r\n keep?: number\r\n tokensBefore?: number\r\n}\r\n\r\nexport interface CompactionEndPayload {\r\n checkpointId?: string\r\n keep?: number\r\n}\r\n\r\nexport interface ToolCallPayload {\r\n id: string\r\n name: string\r\n arguments: unknown\r\n /** Exact raw arguments JSON as produced by the model; preserves serialization. */\r\n argRaw?: string\r\n turn?: number\r\n step?: number\r\n}\r\n\r\nexport interface ToolResultErrorPayload {\r\n name?: string\r\n message: string\r\n stack?: string\r\n}\r\n\r\nexport interface ToolResultPayload {\r\n id: string\r\n toolCallId: string\r\n name: string\r\n ok: boolean\r\n durationMs?: number\r\n output?: unknown\r\n error?: ToolResultErrorPayload\r\n argRaw?: string\r\n turn?: number\r\n step?: number\r\n}\r\n\r\nexport type CancelCause =\r\n | { type: 'user' }\r\n | { type: 'parent' }\r\n | { type: 'disposed' }\r\n | { type: 'abort'; message?: string }\r\n | { type: 'timeout'; timeoutMs: number }\r\n\r\n/**\r\n * Why a turn ended \u2014 the durable machine outcome, distinct from the\r\n * per-step model `finishReason`. Written on `turn/end`.\r\n */\r\nexport type TurnEndReason =\r\n | { kind: 'completed' }\r\n | { kind: 'aborted'; cause: CancelCause }\r\n | { kind: 'blocked' }\r\n | { kind: 'error'; error: ToolResultErrorPayload }\r\n | { kind: 'max-tokens' }\r\n | { kind: 'max-steps' }\r\n | { kind: 'max-turns' }\r\n | { kind: 'interrupted' }\r\n\r\nexport interface TurnStartPayload {\r\n turn: number\r\n input?: unknown\r\n reason?: string\r\n}\r\n\r\nexport interface TurnEndPayload {\r\n turn: number\r\n finishReason?: string\r\n /** The typed durable reason this turn ended. Supersedes `finishReason`. */\r\n reason?: TurnEndReason\r\n output?: string\r\n steps?: number\r\n interrupted?: boolean\r\n cancelCause?: CancelCause\r\n error?: ToolResultErrorPayload\r\n}\r\n\r\nexport interface StepStartPayload {\r\n turn: number\r\n step: number\r\n}\r\n\r\nexport interface StepEndPayload {\r\n turn: number\r\n step: number\r\n finishReason?: string\r\n toolCalls?: number\r\n interrupted?: boolean\r\n cancelCause?: CancelCause\r\n error?: ToolResultErrorPayload\r\n}\r\n\r\nexport interface LLMRetryPayload {\r\n retryId: string\r\n retry: number\r\n delayMs?: number\r\n failure?: ToolResultErrorPayload\r\n}\r\n\r\nexport interface LLMRetryStartedPayload {\r\n retryId: string\r\n retry: number\r\n}\r\n\r\n/** How a `request/header` snapshot enters the log. */\r\nexport type RequestHeaderReason =\r\n | 'initial'\r\n | 'resume'\r\n | 'change'\r\n | 'series'\r\n | 'change-series'\r\n\r\nexport interface RequestHeaderPayload {\r\n reason: RequestHeaderReason\r\n config?: LlmCallConfig\r\n /** Rendered system prompt; absent for a system-less request. */\r\n system?: string\r\n /** Assembled tool schemas; absent for a tool-less request. */\r\n tools?: ToolSchemaSnapshot[]\r\n /** True when this snapshot also begins a new model-message series. */\r\n startsSeries?: boolean\r\n}\r\n\r\nexport interface RequestContextPayload {\r\n provider?: string\r\n model?: string\r\n contextWindow?: number\r\n}\r\n\r\nexport interface CheckpointPayload {\r\n /** The compacted prefix: messages the model keeps seeing after compaction. */\r\n messages: ModelMessage[]\r\n summary?: string\r\n tokensBefore?: number\r\n /**\r\n * The surface span this checkpoint shadows, when written by a v7\r\n * compaction: `start`/`end` are the seqs of the first and last *surface\r\n * nodes* being replaced (surface positions, so `start` may be numerically\r\n * greater than `end` after an earlier compaction). The fold removes every\r\n * live node between those two positions and inserts this checkpoint there;\r\n * the kept tail stays in place and the log is never rewritten.\r\n * `'replace'` (bare string) is the legacy v5 form and shadows nothing\r\n * structurally; projection treats it as a full-surface seed.\r\n */\r\n surfaceOp?: { op: 'replace'; start: number; end: number } | 'replace'\r\n /** @deprecated v0.2 keeps raw events in place; use messages instead. */\r\n snapshot?: SessionEvent[]\r\n}\r\n\r\nexport type PlanItemStatus = 'pending' | 'done' | 'failed'\r\n\r\nexport interface PlanItemPayload {\r\n id: string\r\n title: string\r\n status: PlanItemStatus\r\n detail?: string\r\n}\r\n\r\nexport interface PlanPayload {\r\n items: PlanItemPayload[]\r\n status?: 'pending' | 'running' | 'done' | 'failed'\r\n summary?: string\r\n}\r\n\r\nexport type InboxSplicePayload = {\n target: 'all'\n /** Prefix removals from both queues; omitted means clear both queues. */\n deleteCounts?: { nextTurn: number; nextStep: number }\n} | {\n target: 'next-turn' | 'next-step'\n index?: number\r\n deleteCount?: number\r\n inserted?: Array<{\r\n id: string\r\n content: string\r\n /** Structured message payload preserved across restart when present. */\r\n payload?: unknown\r\n mode?: 'followup' | 'steer'\r\n }>\r\n}\r\n\r\n/** A durable change to session display metadata (title, mode, agentType). */\r\nexport interface MetaPatchPayload {\r\n /** Keys changed by this event; only present keys are touched. */\r\n fields: Array<'title' | 'agentType' | 'mode'>\r\n title?: string\r\n agentType?: AgentType\r\n mode?: SessionMode\r\n}\r\n\r\nexport type AgentType = 'general' | 'coding'\r\n\r\nexport type SessionMode = 'auto' | 'plan' | 'execute'\r\n\r\nexport type SessionEventType =\r\n | MessageEventType\r\n | 'assistant/chunk'\n | 'assistant/attempt'\n | 'tool/call'\r\n | 'tool/result'\r\n | 'request/header'\r\n | 'request/context'\r\n | 'agent/inbox/spliced'\r\n | 'plan'\r\n | 'checkpoint'\r\n | 'compaction/start'\r\n | 'compaction/end'\r\n | 'meta'\r\n | 'meta/patch'\r\n | 'llm/retry'\r\n | 'llm/retry-started'\r\n | 'turn/start'\r\n | 'turn/end'\r\n | 'step/start'\r\n | 'step/end'\r\n\r\nexport interface SessionEventBase<T extends SessionEventType, P> {\r\n id: string\r\n seq: number\r\n ts: number\r\n type: T\r\n payload: P\r\n /** Surface placement; required on message-producing events. */\r\n surfaceOp?: SurfaceOp\r\n /** Seqs of earlier raw events this event derives from. */\r\n sourceEventSeqs?: number[]\r\n}\r\n\r\n/**\r\n * The message-producing subset of event types. Every variant is a surface\r\n * node that carries `surfaceOp` and participates in the ordered fold.\r\n * `system/message` is included because tnega keeps the system prompt on the\r\n * transcript (OpenAI-style), so it must be replaceable and derivable like any\r\n * other message rather than living only in `request/header`.\r\n */\r\nexport type SurfaceEventType =\r\n | 'user/message'\r\n | 'system/message'\r\n | 'assistant/message'\r\n | 'tool/result'\r\n\r\nexport type SurfaceOp = 'append' | { op: 'replace'; start: number; end: number }\r\n\r\nexport type SessionEvent =\r\n | SessionEventBase<'user/message', UserMessagePayload>\r\n | SessionEventBase<'assistant/message', AssistantMessagePayload>\r\n | SessionEventBase<'assistant/chunk', AssistantChunkPayload>\n | SessionEventBase<'assistant/attempt', AssistantAttemptPayload>\n | SessionEventBase<'system/message', SystemMessagePayload>\r\n | SessionEventBase<'tool/call', ToolCallPayload>\r\n | SessionEventBase<'tool/result', ToolResultPayload>\r\n | SessionEventBase<'request/header', RequestHeaderPayload>\r\n | SessionEventBase<'request/context', RequestContextPayload>\r\n | SessionEventBase<'agent/inbox/spliced', InboxSplicePayload>\r\n | SessionEventBase<'plan', PlanPayload>\r\n | SessionEventBase<'checkpoint', CheckpointPayload>\r\n | SessionEventBase<'compaction/start', CompactionStartPayload>\r\n | SessionEventBase<'compaction/end', CompactionEndPayload>\r\n | SessionEventBase<'meta', Record<string, unknown>>\r\n | SessionEventBase<'meta/patch', MetaPatchPayload>\r\n | SessionEventBase<'llm/retry', LLMRetryPayload>\r\n | SessionEventBase<'llm/retry-started', LLMRetryStartedPayload>\r\n | SessionEventBase<'turn/start', TurnStartPayload>\r\n | SessionEventBase<'turn/end', TurnEndPayload>\r\n | SessionEventBase<'step/start', StepStartPayload>\r\n | SessionEventBase<'step/end', StepEndPayload>\r\n\r\nfunction isMessageEventType(type: SessionEventType): type is MessageEventType {\r\n return type === 'user/message'\r\n || type === 'assistant/message'\r\n || type === 'system/message'\r\n}\r\n\r\nfunction isMessageEvent(\r\n event: SessionEvent,\r\n): event is Extract<SessionEvent, { type: MessageEventType }> {\r\n return isMessageEventType(event.type)\r\n}\r\n\r\nexport interface SessionConfig {\r\n file: string\r\n broadcast?: SessionBroadcast\r\n}\r\n\r\nexport interface CompactOptions {\r\n keep?: number\r\n keepTokens?: number\r\n summary?: string\r\n tokensBefore?: number\r\n messages?: ModelMessage[]\r\n}\r\n\r\nexport type ReplayReducer<T> = (state: T, event: SessionEvent) => T | Promise<T>\r\n\r\nexport type SessionBroadcast = (\r\n type: 'event' | 'flush',\r\n payload: unknown,\r\n) => void\r\n\r\nexport interface ContextUsage {\r\n tokens: number\r\n limit: number\r\n ratio: number\r\n}\r\n\r\nexport const DEFAULT_CONTEXT_LIMIT = 128_000\r\n\r\nfunction isSessionEvent(value: unknown): value is SessionEvent {\r\n if (typeof value !== 'object' || value === null) return false\r\n const record = value as Record<string, unknown>\r\n return typeof record.id === 'string'\r\n && typeof record.seq === 'number'\r\n && typeof record.ts === 'number'\r\n && typeof record.type === 'string'\r\n && 'payload' in record\r\n}\r\n\r\n/** Replay committed streams in raw durable order, including shadowed messages. */\nexport function assistantStreams(events: readonly SessionEvent[]): AssistantStreamRecord[][] {\n return events.flatMap(event => {\n if (event.type !== 'assistant/message' && event.type !== 'assistant/attempt') return []\n return event.payload.stream === undefined ? [] : [clone(event.payload.stream)]\n })\n}\n\nfunction clone<T>(value: T): T {\n return structuredClone(value)\r\n}\r\n\r\nfunction previousSurfaceSeq(nodes: readonly number[]): number | undefined {\r\n return nodes.at(-1)\r\n}\r\n\r\n/**\r\n * Project an event list to model messages, in the list's own order. Each\r\n * surface event is mapped through {@link deriveEventMessage}; a `checkpoint`\r\n * splices its compacted prefix in at its position. This is the building block\r\n * both {@link deriveSurfaceMessages} (surface order) and callers holding a\r\n * compact slice (e.g. the events a summarizer will read) share.\r\n */\r\nexport function projectEvents(events: readonly SessionEvent[]): ModelMessage[] {\r\n const messages: ModelMessage[] = []\r\n for (const event of events) {\r\n if (event.type === 'checkpoint') {\r\n messages.splice(0, messages.length, ...clone(event.payload.messages))\r\n continue\r\n }\r\n const message = deriveEventMessage(event)\r\n if (message) messages.push(message)\r\n }\r\n return messages\r\n}\r\n\r\nexport function isAppendSurfaceEvent(event: SessionEvent): boolean {\r\n return isSurfaceEventType(event.type) && event.surfaceOp === 'append'\r\n}\r\n\r\nexport function isSurfaceEventType(type: SessionEventType): type is SurfaceEventType {\r\n return type === 'user/message'\r\n || type === 'system/message'\r\n || type === 'assistant/message'\r\n || type === 'tool/result'\r\n}\r\n\r\n/** A v7 checkpoint shadows a surface span; legacy ('replace') shadows nothing structurally. */\r\nexport function checkpointShadowRange(\r\n event: SessionEvent,\r\n): { start: number; end: number } | undefined {\r\n if (event.type !== 'checkpoint') return undefined\r\n const op = event.payload.surfaceOp\r\n if (typeof op === 'object' && op !== null && op.op === 'replace') {\r\n return { start: op.start, end: op.end }\r\n }\r\n return undefined\r\n}\r\n\r\n/** Detached current surface nodes plus every replacement's shadowed ranges. */\r\nexport interface SurfaceFoldReplacement {\r\n seq: number\r\n start: number\r\n end: number\r\n shadowedSeqs: number[]\r\n}\r\n\r\nexport interface SurfaceFoldResult {\r\n nodes: number[]\r\n replacements: SurfaceFoldReplacement[]\r\n}\r\n\r\n/**\r\n * Fold a log's surface operations into the current surface node order.\r\n *\r\n * The surface is *positional*: a replacement removes the live nodes between\r\n * the positions of `start`/`end` and inserts the replacing event's seq there,\r\n * so surface order is independent of raw seq order \u2014 after compaction the\r\n * checkpoint node may carry a higher seq than the kept tail that follows it.\r\n */\r\nexport function foldSurface(events: readonly SessionEvent[]): SurfaceFoldResult {\r\n const nodes: number[] = []\r\n const replacements: SurfaceFoldReplacement[] = []\r\n\r\n const applyReplace = (seq: number, start: number, end: number): void => {\r\n const startIndex = nodes.indexOf(start)\r\n if (startIndex < 0) {\r\n // The shadowed head is already gone (defensive; our writer always\r\n // shadows live nodes). Keep the prefix visible by anchoring at the tail.\r\n nodes.push(seq)\r\n return\r\n }\r\n const endIndex = nodes.indexOf(end, startIndex)\r\n if (endIndex < 0) {\r\n nodes.push(seq)\r\n return\r\n }\r\n const shadowed = nodes.splice(startIndex, endIndex - startIndex + 1)\r\n nodes.splice(startIndex, 0, seq)\r\n replacements.push({ seq, start, end, shadowedSeqs: shadowed })\r\n }\r\n\r\n for (const event of events) {\r\n if (event.type === 'checkpoint') {\r\n const range = checkpointShadowRange(event)\r\n if (!range) {\r\n // A range-less checkpoint is a prefix seed: it contributes its own\r\n // node at its surface position (used when compaction runs before any\r\n // durable history exists to shadow).\r\n nodes.push(event.seq)\r\n continue\r\n }\r\n applyReplace(event.seq, range.start, range.end)\r\n continue\r\n }\r\n if (!isSurfaceEventType(event.type)) continue\r\n const op = event.surfaceOp ?? 'append'\r\n if (op === 'append') {\r\n nodes.push(event.seq)\r\n continue\r\n }\r\n applyReplace(event.seq, op.start, op.end)\r\n }\r\n return { nodes, replacements }\r\n}\r\n\r\n/**\r\n * Derive one surface node's model-visible message. A content-less assistant\r\n * turn (e.g. a max-token cutoff with no output and no tool calls) is skipped\r\n * so it never enters a provider transcript; `tool/result` yields the `tool`\r\n * role message that pairs with the assistant's `toolCalls`.\r\n */\r\nexport function deriveEventMessage(event: SessionEvent): ModelMessage | null {\r\n switch (event.type) {\r\n case 'user/message': {\r\n const message: ModelMessage = { role: 'user', content: event.payload.content }\r\n if (event.payload.name) message.name = event.payload.name\r\n return message\r\n }\r\n case 'system/message': {\r\n const message: ModelMessage = { role: 'system', content: event.payload.content }\r\n if (event.payload.name) message.name = event.payload.name\r\n return message\r\n }\r\n case 'assistant/message': {\r\n const toolCalls = event.payload.toolCalls\r\n if (!event.payload.content && !(toolCalls && toolCalls.length)) return null\r\n const message: ModelMessage = { role: 'assistant', content: event.payload.content }\r\n if (event.payload.name) message.name = event.payload.name\r\n if (toolCalls?.length) message.tool_calls = clone(toolCalls)\r\n return message\r\n }\r\n case 'tool/result': {\r\n const failed = !event.payload.ok\r\n const message: ModelMessage = {\r\n role: 'tool',\r\n content: failed\r\n ? `error: ${event.payload.error?.message ?? 'unknown'}`\r\n : stringify(event.payload.output),\r\n tool_call_id: event.payload.toolCallId,\r\n }\r\n message.name = event.payload.name\r\n if (failed) {\r\n message.toolOk = false\r\n if (event.payload.error) message.toolError = event.payload.error\r\n }\r\n return message\r\n }\r\n default:\r\n return null\r\n }\r\n}\r\n\r\n/**\r\n * Derive the model transcript strictly from the folded surface: walk the\r\n * surface nodes in surface position order (so a checkpoint's prefix is placed\r\n * where it replaced history, whatever its raw seq), mapping each node through\r\n * {@link deriveEventMessage}. This is the single source of the model's view;\r\n * raw log order never influences it.\r\n */\r\nexport function deriveSurfaceMessages(events: readonly SessionEvent[]): ModelMessage[] {\r\n const { nodes } = foldSurface(events)\r\n const bySeq = new Map(events.map(event => [event.seq, event] as const))\r\n const messages: ModelMessage[] = []\r\n for (const seq of nodes) {\r\n const event = bySeq.get(seq)\r\n if (!event) continue\r\n if (event.type === 'checkpoint') {\r\n messages.splice(0, messages.length, ...clone(event.payload.messages))\r\n continue\r\n }\r\n const message = deriveEventMessage(event)\r\n if (message) messages.push(message)\r\n }\r\n return messages\r\n}\r\n\r\n/**\r\n * Project the log into a human-facing transcript (the web view). Unlike the\r\n * model surface, a compaction does **not** hide the history it summarized:\r\n * shadowed messages are kept in place, and each live checkpoint is retained\r\n * as a marker exactly where it replaced them (with nested checkpoints\r\n * expanded recursively). Readers see the full conversation; the model keeps\r\n * deriving from the folded surface via {@link deriveSurfaceMessages}.\r\n */\r\nexport function transcriptEvents(events: readonly SessionEvent[]): SessionEvent[] {\r\n const bySeq = new Map(events.map(event => [event.seq, event] as const))\r\n const { nodes, replacements } = foldSurface(events)\r\n\r\n const shadowedOf = new Map<number, SessionEvent[]>()\r\n for (const replacement of replacements) {\r\n shadowedOf.set(replacement.seq, replacement.shadowedSeqs\r\n .map(seq => bySeq.get(seq))\r\n .filter((event): event is SessionEvent => event !== undefined))\r\n }\r\n\r\n const isVisible = (event: SessionEvent): boolean => (\r\n event.type !== 'system/message' && isSurfaceEventType(event.type)\r\n )\r\n\r\n const skeleton: SessionEvent[] = []\r\n const appendHistory = (checkpointSeq: number): void => {\r\n for (const shadowed of shadowedOf.get(checkpointSeq) ?? []) {\r\n if (shadowed.type === 'checkpoint') appendHistory(shadowed.seq)\r\n else if (isVisible(shadowed)) skeleton.push(shadowed)\r\n }\r\n }\r\n for (const seq of nodes) {\r\n const event = bySeq.get(seq)\r\n if (!event) continue\r\n if (event.type === 'checkpoint') appendHistory(event.seq)\r\n skeleton.push(event)\r\n }\r\n\r\n // Declared tool calls travel on their assistant message, so the matching\r\n // log-only `tool/call` records would double-render: drop those, keep the\r\n // legacy ones that have no assistant declaration.\r\n const declaredCalls = new Set<string>()\r\n for (const event of events) {\r\n if (event.type === 'assistant/message') {\r\n for (const call of event.payload.toolCalls ?? []) declaredCalls.add(call.id)\r\n }\r\n }\r\n const inSkeleton = new Set(skeleton.map(event => event.id))\r\n const structure = events\r\n .filter(event => !inSkeleton.has(event.id))\r\n .filter(event => event.type !== 'compaction/start' && event.type !== 'compaction/end')\r\n .filter(event => event.type !== 'checkpoint') // superseded markers: history shown via the live chain\r\n .filter(event => !(event.type === 'tool/call' && declaredCalls.has(event.payload.id)))\r\n\r\n const ordered = [...skeleton]\n for (const event of structure) {\n let index = 0\n for (let cursor = ordered.length - 1; cursor >= 0; cursor -= 1) {\r\n if (ordered[cursor]!.seq <= event.seq) {\r\n index = cursor + 1\r\n break\r\n }\r\n }\r\n ordered.splice(index, 0, event)\r\n }\r\n return ordered\r\n}\r\n\r\nexport function foldRequestHeader(events: readonly SessionEvent[]): RequestHeaderPayload | undefined {\r\n let header: RequestHeaderPayload | undefined\r\n for (const event of events) {\r\n if (event.type === 'request/header') header = clone(event.payload)\r\n }\r\n return header\r\n}\r\n\r\nexport function foldRequestContext(events: readonly SessionEvent[]): RequestContextPayload | undefined {\r\n let context: RequestContextPayload | undefined\r\n for (const event of events) {\r\n if (event.type === 'request/context') context = clone(event.payload)\r\n }\r\n return context\r\n}\r\n\r\n/**\r\n * Session display metadata, rebuilt from the immutable events: the head\r\n * `meta` base followed by every `meta/patch` in seq order. No mutable\r\n * side file or in-place rewrite is involved, so title/mode/agentType stay\r\n * replayable and fork-clean like every other durable fact.\r\n */\r\nexport function foldSessionMeta(events: readonly SessionEvent[]): {\r\n title?: string\r\n agentType?: AgentType\r\n mode?: SessionMode\r\n} {\r\n const meta: { title?: string; agentType?: AgentType; mode?: SessionMode } = {}\r\n for (const event of events) {\r\n if (event.type === 'meta') {\r\n const payload = event.payload as Record<string, unknown>\r\n if (typeof payload.title === 'string') meta.title = payload.title\r\n if (payload.agentType === 'general' || payload.agentType === 'coding') {\r\n meta.agentType = payload.agentType\r\n }\r\n if (payload.mode === 'auto' || payload.mode === 'plan' || payload.mode === 'execute') {\r\n meta.mode = payload.mode\r\n }\r\n continue\r\n }\r\n if (event.type === 'meta/patch') {\r\n const patch = event.payload\r\n if (patch.fields.includes('title') && typeof patch.title === 'string') {\r\n meta.title = patch.title\r\n }\r\n if (patch.fields.includes('agentType') && patch.agentType !== undefined) {\r\n meta.agentType = patch.agentType\r\n }\r\n if (patch.fields.includes('mode') && patch.mode !== undefined) {\r\n meta.mode = patch.mode\r\n }\r\n }\r\n }\r\n return meta\r\n}\r\n\r\n/** Convenience wrapper: fold session metadata from a `SessionLog`'s events. */\r\nexport function foldMetaFromLog(log: { read(): Promise<SessionEvent[]> }): Promise<{\r\n title?: string\r\n agentType?: AgentType\r\n mode?: SessionMode\r\n}> {\r\n return log.read().then(foldSessionMeta)\r\n}\r\n\r\nfunction stringify(value: unknown): string {\r\n if (typeof value === 'string') return value\r\n try {\r\n return JSON.stringify(value) ?? String(value)\r\n } catch {\r\n return String(value)\r\n }\r\n}\r\n\r\nexport function estimateMessageTokens(messages: readonly ModelMessage[]): number {\r\n let tokens = 0\r\n for (const message of messages) {\r\n tokens += Math.ceil(message.content.length / 4)\r\n for (const call of message.tool_calls ?? []) {\r\n const raw = JSON.stringify(call.arguments ?? {}) ?? ''\r\n tokens += Math.ceil(raw.length / 4)\r\n }\r\n }\r\n return tokens\r\n}\r\n\r\nexport function estimateEventTokens(event: SessionEvent): number {\r\n switch (event.type) {\r\n case 'user/message':\r\n case 'system/message':\r\n return Math.ceil(event.payload.content.length / 4)\r\n case 'assistant/message': {\r\n let tokens = Math.ceil(event.payload.content.length / 4)\r\n for (const call of event.payload.toolCalls ?? []) {\r\n const raw = JSON.stringify(call.arguments ?? {}) ?? ''\r\n tokens += Math.ceil(raw.length / 4)\r\n }\r\n return tokens\r\n }\r\n case 'assistant/chunk':\r\n return Math.ceil(event.payload.content.length / 4)\r\n case 'tool/call': {\r\n const raw = JSON.stringify(event.payload.arguments ?? {}) ?? ''\r\n return Math.ceil(raw.length / 4)\r\n }\r\n case 'tool/result': {\r\n const raw = event.payload.ok\r\n ? stringify(event.payload.output)\r\n : event.payload.error?.message ?? 'error'\r\n return Math.ceil(raw.length / 4)\r\n }\r\n case 'plan':\n case 'assistant/attempt':\n return 0\n case 'checkpoint':\r\n return estimateMessageTokens(event.payload.messages)\r\n case 'compaction/start':\r\n case 'compaction/end':\r\n case 'meta':\r\n case 'meta/patch':\r\n return 0\r\n case 'llm/retry':\r\n case 'llm/retry-started':\r\n return 0\r\n case 'request/header':\r\n case 'request/context':\r\n case 'agent/inbox/spliced':\r\n return 0\r\n case 'turn/start':\r\n case 'turn/end':\r\n case 'step/start':\r\n case 'step/end':\r\n return 0\r\n }\r\n}\r\n\r\nexport function suffixStartIndexForTokens(\r\n events: readonly SessionEvent[],\r\n targetTokens: number,\r\n): number {\r\n if (!events.length || targetTokens <= 0) return 0\r\n let tokens = 0\r\n let candidate = events.length\r\n for (let index = events.length - 1; index >= 0; index -= 1) {\r\n tokens += estimateEventTokens(events[index]!)\r\n if (tokens >= targetTokens) {\r\n candidate = index\r\n break\r\n }\r\n }\r\n if (candidate === events.length) return 0\r\n let cut = candidate\r\n while (cut < events.length) {\r\n const event = events[cut]\r\n if (event?.type === 'user/message') return cut\r\n cut += 1\r\n }\r\n return candidate\r\n}\r\n\r\nexport function safeCompactSplit(\r\n events: readonly SessionEvent[],\r\n splitIndex: number,\r\n): number {\r\n const index = Math.max(0, Math.min(splitIndex, events.length))\r\n const first = events[index]\r\n if (first?.type === 'tool/result') {\r\n const callId = first.payload.toolCallId\r\n for (let cursor = index - 1; cursor >= 0; cursor -= 1) {\r\n const candidate = events[cursor]\r\n if (candidate?.type === 'tool/call' && candidate.payload.id === callId) {\r\n return cursor\r\n }\r\n }\r\n }\r\n\r\n let openCalls = 0\r\n for (let cursor = 0; cursor <= events.length; cursor += 1) {\r\n if (cursor >= index && openCalls === 0) return cursor\r\n const event = events[cursor]\r\n if (!event) continue\r\n if (event.type === 'tool/call') openCalls += 1\r\n if (event.type === 'tool/result') openCalls = Math.max(0, openCalls - 1)\r\n }\r\n return index\r\n}\r\n\r\nexport function repairUnclosed(\r\n events: readonly SessionEvent[],\r\n): SessionEvent[] {\r\n const openCalls: Extract<SessionEvent, { type: 'tool/call' }>[] = []\r\n const openSteps: Extract<SessionEvent, { type: 'step/start' }>[] = []\r\n const openTurns: Extract<SessionEvent, { type: 'turn/start' }>[] = []\r\n for (const event of events) {\r\n switch (event.type) {\r\n case 'tool/call':\r\n openCalls.push(event)\r\n break\r\n case 'tool/result': {\r\n const callIndex = openCalls.findIndex(\r\n call => call.payload.id === event.payload.toolCallId,\r\n )\r\n if (callIndex >= 0) openCalls.splice(callIndex, 1)\r\n else openCalls.pop()\r\n break\r\n }\r\n case 'step/start':\r\n openSteps.push(event)\r\n break\r\n case 'step/end':\r\n openSteps.pop()\r\n break\r\n case 'turn/start':\r\n openTurns.push(event)\r\n break\r\n case 'turn/end':\r\n openTurns.pop()\r\n break\r\n }\r\n }\r\n\r\n if (!openCalls.length && !openSteps.length && !openTurns.length) return []\r\n\r\n const synthetic: SessionEvent[] = []\r\n let nextSeq = (events.at(-1)?.seq ?? 0) + 1\r\n let nextTs = (events.at(-1)?.ts ?? Date.now()) + 1\r\n const push = (type: SessionEventType, payload: SessionEvent['payload']): void => {\r\n synthetic.push({\r\n id: randomUUID(),\r\n seq: nextSeq,\r\n ts: nextTs,\r\n type: type as SessionEvent['type'],\r\n payload: clone(payload),\r\n } as SessionEvent)\r\n nextSeq += 1\r\n nextTs += 1\r\n }\r\n\r\n for (const call of openCalls) {\r\n push('tool/result', {\r\n id: call.payload.id,\r\n toolCallId: call.payload.id,\r\n name: call.payload.name,\r\n ok: false,\r\n error: {\r\n name: 'SessionInterruptedError',\r\n message: 'session interrupted before tool result was recorded',\r\n },\r\n })\r\n }\r\n for (const step of openSteps) {\r\n push('step/end', {\r\n turn: step.payload.turn,\r\n step: step.payload.step,\r\n finishReason: 'interrupted',\r\n interrupted: true,\r\n })\r\n }\r\n for (let i = 0; i < openTurns.length; i++) {\r\n const turn = openTurns[i]!.payload.turn\r\n push('turn/end', {\r\n turn,\r\n finishReason: 'interrupted',\r\n interrupted: true,\r\n })\r\n }\r\n return synthetic\r\n}\r\n\r\nexport function resolveCompactKeep(\r\n events: readonly SessionEvent[],\r\n options: CompactOptions,\r\n): number {\r\n if (\r\n typeof options.keepTokens === 'number'\r\n && Number.isFinite(options.keepTokens)\r\n && options.keepTokens > 0\r\n ) {\r\n return events.length - suffixStartIndexForTokens(events, options.keepTokens)\r\n }\r\n const keep = typeof options.keep === 'number' && Number.isFinite(options.keep) && options.keep > 0\r\n ? Math.floor(options.keep)\r\n : 0\r\n return Math.min(keep, events.length)\r\n}\r\n\r\nexport function estimateContextUsage(\r\n messages: readonly ModelMessage[],\r\n limit = DEFAULT_CONTEXT_LIMIT,\r\n): ContextUsage {\r\n const tokens = estimateMessageTokens(messages)\r\n return {\r\n tokens,\r\n limit,\r\n ratio: limit > 0 ? tokens / limit : 0,\r\n }\r\n}\r\n\r\nexport class SessionLog {\r\n private _events: SessionEvent[] = []\r\n private _surface: ModelMessage[] = []\r\n private _surfaceNodes: number[] = []\r\n private _requestHeader: RequestHeaderPayload | undefined\r\n private _requestContext: RequestContextPayload | undefined\r\n private _loaded = false\r\n private _nextSeq = 1\r\n private _queue: Promise<unknown> = Promise.resolve()\r\n private _writeTail: Promise<void> = Promise.resolve()\r\n private _pending: SessionEvent[] = []\r\n private _drainScheduled = false\r\n private _writeError: unknown\r\n\r\n constructor(\n readonly file: string,\n private _broadcast?: SessionBroadcast,\n publicationContext?: Context,\n ) {\n if (!this._broadcast && publicationContext) {\n this._broadcast = (type, payload) => {\n if (type === 'event') publicationContext.emit('session/event', payload)\n else publicationContext.emit('session/flush', payload)\n }\n }\n }\n\r\n init(): Promise<void> {\r\n return this._run(async () => {\r\n const key = sessionFileKey(this.file)\r\n if (!liveSessions.has(key)) liveSessions.set(key, this)\r\n try {\r\n await this._ensureLoaded()\r\n await this._drainWrite()\r\n if (this._writeError) {\r\n const error = this._writeError\r\n this._writeError = undefined\r\n throw error\r\n }\r\n } catch (error) {\r\n if (liveSessions.get(key) === this) liveSessions.delete(key)\r\n throw error\r\n }\r\n })\r\n }\r\n\r\n append(type: 'user/message', payload: UserMessagePayload): Promise<SessionEvent>\r\n append(type: 'assistant/message', payload: AssistantMessagePayload): Promise<SessionEvent>\r\n append(type: 'assistant/chunk', payload: AssistantChunkPayload): Promise<SessionEvent>\n append(type: 'assistant/attempt', payload: AssistantAttemptPayload): Promise<SessionEvent>\n append(type: 'system/message', payload: SystemMessagePayload): Promise<SessionEvent>\r\n append(type: 'tool/call', payload: ToolCallPayload): Promise<SessionEvent>\r\n append(type: 'tool/result', payload: ToolResultPayload): Promise<SessionEvent>\r\n append(type: 'request/header', payload: RequestHeaderPayload): Promise<SessionEvent>\r\n append(type: 'request/context', payload: RequestContextPayload): Promise<SessionEvent>\r\n append(type: 'agent/inbox/spliced', payload: InboxSplicePayload): Promise<SessionEvent>\r\n append(type: 'plan', payload: PlanPayload): Promise<SessionEvent>\r\n append(type: 'checkpoint', payload: CheckpointPayload): Promise<SessionEvent>\r\n append(type: 'compaction/start', payload: CompactionStartPayload): Promise<SessionEvent>\r\n append(type: 'compaction/end', payload: CompactionEndPayload): Promise<SessionEvent>\r\n append(type: 'meta', payload: Record<string, unknown>): Promise<SessionEvent>\r\n append(type: 'meta/patch', payload: MetaPatchPayload): Promise<SessionEvent>\r\n append(type: 'llm/retry', payload: LLMRetryPayload): Promise<SessionEvent>\r\n append(type: 'llm/retry-started', payload: LLMRetryStartedPayload): Promise<SessionEvent>\r\n append(type: 'turn/start', payload: TurnStartPayload): Promise<SessionEvent>\r\n append(type: 'turn/end', payload: TurnEndPayload): Promise<SessionEvent>\r\n append(type: 'step/start', payload: StepStartPayload): Promise<SessionEvent>\r\n append(type: 'step/end', payload: StepEndPayload): Promise<SessionEvent>\r\n append(type: SessionEventType, payload: SessionEvent['payload']): Promise<SessionEvent> {\r\n return this._run(async () => {\r\n await this._ensureLoaded()\r\n const event = this._buildEvent(type, payload)\r\n this._commitEvent(event)\r\n return event\r\n })\r\n }\r\n\r\n private _buildEvent(\r\n type: SessionEventType,\r\n payload: SessionEvent['payload'],\r\n ): SessionEvent {\r\n const eventPayload = clone(payload)\r\n const event = {\r\n id: randomUUID(),\r\n seq: this._nextSeq,\r\n ts: Date.now(),\r\n type: type as SessionEvent['type'],\r\n payload: eventPayload,\r\n } as SessionEvent\r\n if (isMessageEventType(type)) {\r\n for (let index = this._events.length - 1; index >= 0; index -= 1) {\r\n const previous = this._events[index]\r\n if (previous && isMessageEvent(previous)) {\r\n const messagePayload = eventPayload as MessageEventPayload\r\n messagePayload.parentId ??= previous.id\r\n break\r\n }\r\n }\r\n event.surfaceOp ??= 'append'\r\n const previous = previousSurfaceSeq(this._surfaceNodes)\r\n event.sourceEventSeqs ??= previous === undefined ? [] : [previous]\r\n } else if (type === 'request/header') {\r\n event.sourceEventSeqs ??= []\r\n } else if (type === 'request/context') {\r\n event.sourceEventSeqs ??= []\r\n } else if (type === 'agent/inbox/spliced') {\r\n event.sourceEventSeqs ??= []\r\n }\r\n this._nextSeq += 1\r\n return event\r\n }\r\n\r\n private _commitEvent(event: SessionEvent): void {\r\n this._events.push(event)\r\n this._refreshSurface()\r\n if (event.type === 'request/header') this._requestHeader = clone(event.payload)\r\n if (event.type === 'request/context') this._requestContext = clone(event.payload)\r\n this._broadcast?.('event', event)\r\n this._enqueue(event)\r\n }\r\n\r\n /**\r\n * Rebuild both surface views from the committed log. The nodes come from the\r\n * positional {@link foldSurface} fold; the messages come from\r\n * {@link deriveSurfaceMessages}, which walks those nodes in surface order \u2014\r\n * the model view is a pure function of the surface, never of raw file order.\r\n */\r\n private _refreshSurface(): void {\r\n this._surfaceNodes = foldSurface(this._events).nodes\r\n this._surface = deriveSurfaceMessages(this._events)\r\n }\r\n\r\n private _enqueue(event: SessionEvent): void {\r\n this._pending.push(event)\r\n if (this._drainScheduled) return\r\n this._drainScheduled = true\r\n setImmediate(() => {\r\n this._drainScheduled = false\r\n void this._drainWrite()\r\n })\r\n }\r\n\r\n private _drainWrite(): Promise<void> {\r\n const events = this._pending.splice(0)\r\n if (!events.length) return this._writeTail\r\n const write = this._writeTail.then(() => appendFile(\r\n this.file,\r\n `${events.map(event => JSON.stringify(event)).join('\\n')}\\n`,\r\n 'utf8',\r\n ))\r\n this._writeTail = write.catch((error) => {\r\n this._writeError ??= error\r\n })\r\n return write.then(() => undefined, () => undefined)\r\n }\r\n\r\n flush(): Promise<number> {\r\n return this._run(async () => {\r\n await this._ensureLoaded()\r\n await this._drainWrite()\r\n if (this._writeError) {\r\n const error = this._writeError\r\n this._writeError = undefined\r\n throw error\r\n }\r\n const seq = this._nextSeq - 1\r\n this._broadcast?.('flush', { file: this.file, seq })\r\n return seq\r\n })\r\n }\r\n\r\n async lineage(messageId: string): Promise<SessionEvent[]> {\r\n return this._run(async () => {\r\n await this._ensureLoaded()\r\n return this._resolveLineage(messageId)\r\n })\r\n }\r\n\r\n /** The next turn number: one more than the highest recorded `turn/start`. */\r\n async nextTurn(): Promise<number> {\r\n return this._run(async () => {\r\n await this._ensureLoaded()\r\n let max = 0\r\n for (const event of this._events) {\r\n if (event.type === 'turn/start') max = Math.max(max, event.payload.turn)\r\n }\r\n return max + 1\r\n })\r\n }\r\n\r\n async forkAt(messageId: string): Promise<SessionEvent[]> {\r\n return this._run(async () => {\r\n await this._ensureLoaded()\r\n const lineage = this._resolveLineage(messageId)\r\n const lineageIds = new Set(lineage.map(event => event.id))\r\n const targetIndex = this._events.findIndex(\r\n event => event.id === messageId && isMessageEvent(event),\r\n )\r\n if (targetIndex < 0) {\r\n throw new Error(`message not found: ${messageId}`)\r\n }\r\n const selected: SessionEvent[] = []\r\n let skippedMessage = false\r\n for (let index = 0; index <= targetIndex; index += 1) {\r\n const event = this._events[index]!\r\n if (isMessageEvent(event)) {\r\n if (!lineageIds.has(event.id)) {\r\n skippedMessage = true\r\n continue\r\n }\r\n skippedMessage = false\r\n selected.push(clone(event))\r\n continue\r\n }\r\n if (\r\n event.type === 'meta'\r\n || event.type === 'llm/retry'\r\n || event.type === 'llm/retry-started'\n // Message forks omit the owning lifecycle, including its attempt ledger.\n || event.type === 'assistant/attempt'\n || event.type.startsWith('turn/')\n || event.type.startsWith('step/')\r\n ) {\r\n continue\r\n }\r\n if (event.type === 'checkpoint') {\r\n selected.push(clone(event))\r\n continue\r\n }\r\n if (!skippedMessage) {\r\n selected.push(clone(event))\r\n }\r\n }\r\n return selected\r\n })\r\n }\r\n\r\n read(): Promise<SessionEvent[]> {\r\n return this._run(async () => {\r\n await this._ensureLoaded()\r\n return this._events.map(event => clone(event))\r\n })\r\n }\r\n\r\n deriveMessages(): Promise<ModelMessage[]> {\r\n return this._run(async () => {\r\n await this._ensureLoaded()\r\n return clone(this._surface)\r\n })\r\n }\r\n\r\n /** The ordered surface events, after compaction replacements are applied. */\r\n surfaceEvents(): Promise<SessionEvent[]> {\r\n return this._run(async () => {\r\n await this._ensureLoaded()\r\n const bySeq = new Map(this._events.map(event => [event.seq, event] as const))\r\n return this._surfaceNodes\r\n .map(seq => bySeq.get(seq))\r\n .filter((event): event is SessionEvent => event !== undefined)\r\n .map(event => clone(event))\r\n })\r\n }\r\n\r\n /** The latest `request/header` snapshot, or undefined before the first one. */\r\n requestHeader(): RequestHeaderPayload | undefined {\r\n return this._requestHeader ? clone(this._requestHeader) : undefined\r\n }\r\n\r\n /** The latest resolved route metadata, or undefined before the first one. */\r\n requestContext(): RequestContextPayload | undefined {\r\n return this._requestContext ? clone(this._requestContext) : undefined\r\n }\r\n\r\n /** Display metadata folded from the durable `meta` + `meta/patch` events. */\r\n meta(): Promise<{ title?: string; agentType?: AgentType; mode?: SessionMode }> {\r\n return this._run(async () => {\r\n await this._ensureLoaded()\r\n return foldSessionMeta(this._events)\r\n })\r\n }\r\n\r\n estimateContext(limit = DEFAULT_CONTEXT_LIMIT): Promise<ContextUsage> {\r\n return this._run(async () => {\r\n await this._ensureLoaded()\r\n return estimateContextUsage(this._surface, limit)\r\n })\r\n }\r\n\r\n replay(): Promise<SessionEvent[]>\r\n replay<T>(reduce: ReplayReducer<T>, initial: T): Promise<T>\r\n replay<T>(reduce?: ReplayReducer<T>, initial?: T): Promise<SessionEvent[] | T> {\r\n return this.read().then((events) => {\r\n if (!reduce) return events\r\n let state = initial as T\r\n let pending: Promise<void> = Promise.resolve()\r\n for (const event of events) {\r\n pending = pending.then(async () => {\r\n state = await reduce(state, event)\r\n })\r\n }\r\n return pending.then(() => state)\r\n })\r\n }\r\n\r\n /** Structural violations in the loaded event stream (empty = balanced). */\r\n runInvariants(): Promise<SessionInvariantFailure[]> {\r\n return this._run(async () => {\r\n await this._ensureLoaded()\r\n return checkSessionInvariants(this._events)\r\n })\r\n }\r\n\r\n /**\r\n * Compact the session without ever rewriting history.\r\n *\r\n * The surface (not the raw log) is the unit of compaction. A kept suffix \u2014\r\n * measured in tokens via `keepTokens`, or in nodes via `keep`, and always\r\n * snapped to start on a fresh `user/message` turn so a tool result never\r\n * outlives the assistant call it answers \u2014 stays visible; every earlier\r\n * surface node is shadowed by the checkpoint's `surfaceOp.replace` range.\r\n * The three compaction events are appended like any other event, so seqs\r\n * stay immutable, live observers see the transition, and a crash can only\r\n * leave an orphaned `compaction/start` rather than a torn rewrite.\r\n *\r\n * Returns the new event count, or the unchanged count when there is no\r\n * useful surface span to shadow.\r\n */\r\n compact(options: CompactOptions = {}): Promise<number> {\r\n return this._run(async () => {\r\n await this._ensureLoaded()\r\n const events = this._events\r\n const bySeq = new Map(events.map(event => [event.seq, event] as const))\r\n const surfaceEvents = foldSurface(events).nodes\r\n .map(seq => bySeq.get(seq))\r\n .filter((event): event is SessionEvent => event !== undefined)\r\n\r\n const keep = resolveCompactKeep(surfaceEvents, options)\r\n let split = Math.max(0, surfaceEvents.length - keep)\r\n // The retained tail must open on a fresh user turn: shadowing an\r\n // assistant step while keeping its tool results would leave an orphan\r\n // tool message at the head of the transcript. Prefer the next user\r\n // boundary; when the candidate sits inside the final turn, keep that\r\n // whole turn instead of cutting it.\r\n if (split < surfaceEvents.length && surfaceEvents[split]!.type !== 'user/message') {\r\n let next = split\r\n while (next < surfaceEvents.length && surfaceEvents[next]!.type !== 'user/message') next += 1\r\n if (next < surfaceEvents.length) {\r\n split = next\r\n } else {\r\n let lastUser = surfaceEvents.length - 1\r\n while (lastUser >= 0 && surfaceEvents[lastUser]!.type !== 'user/message') lastUser -= 1\r\n split = lastUser >= 0 ? lastUser : surfaceEvents.length\r\n }\r\n }\r\n const shadowed = surfaceEvents.slice(0, split)\r\n if (!options.messages?.length) return this._events.length\r\n\r\n // A compaction needs a summary to write. When there is history to\r\n // shadow the checkpoint replaces that head span; when there is none (a\r\n // budget trip before anything is durable) the checkpoint seeds the\r\n // surface with the compacted prefix instead.\r\n const range = shadowed.length\r\n ? { start: shadowed[0]!.seq, end: shadowed[shadowed.length - 1]!.seq }\r\n : undefined\r\n const boundary = split\r\n this._commitEvent(this._buildEvent('compaction/start', {\r\n ...(boundary > 0 ? { boundary } : {}),\r\n ...(options.keep !== undefined ? { keep: options.keep } : {}),\r\n ...(options.tokensBefore !== undefined ? { tokensBefore: options.tokensBefore } : {}),\r\n }))\r\n const checkpoint = this._buildEvent('checkpoint', {\r\n messages: clone(options.messages),\r\n ...(range ? { surfaceOp: { op: 'replace', start: range.start, end: range.end } } : {}),\r\n ...(options.summary ? { summary: options.summary } : {}),\r\n ...(options.tokensBefore !== undefined ? { tokensBefore: options.tokensBefore } : {}),\r\n })\r\n this._commitEvent(checkpoint)\r\n this._commitEvent(this._buildEvent('compaction/end', {\r\n checkpointId: checkpoint.id,\r\n ...(options.keep !== undefined ? { keep: options.keep } : {}),\r\n }))\r\n return this._events.length\r\n })\r\n }\r\n\r\n close(): Promise<void> {\r\n return this._queue.then(async () => {\r\n await this._drainWrite()\r\n if (this._writeError) {\r\n const error = this._writeError\r\n this._writeError = undefined\r\n throw error\r\n }\r\n const key = sessionFileKey(this.file)\r\n if (liveSessions.get(key) === this) liveSessions.delete(key)\r\n })\r\n }\r\n\r\n private _run<T>(task: () => Promise<T>): Promise<T> {\r\n const next = this._queue.then(task, task)\r\n this._queue = next.then(() => undefined, () => undefined)\r\n return next\r\n }\r\n\r\n private async _ensureLoaded(): Promise<void> {\r\n if (this._loaded) return\r\n const key = sessionFileKey(this.file)\r\n const owner = liveSessions.get(key)\r\n if (owner && owner !== this && owner._loaded) {\r\n this._events = owner._events.map(event => clone(event))\r\n this._surface = clone(owner._surface)\r\n this._surfaceNodes = [...owner._surfaceNodes]\r\n this._requestHeader = owner._requestHeader ? clone(owner._requestHeader) : undefined\r\n this._requestContext = owner._requestContext ? clone(owner._requestContext) : undefined\r\n this._nextSeq = owner._nextSeq\r\n this._loaded = true\r\n return\r\n }\r\n await mkdir(dirname(resolve(this.file)), { recursive: true })\r\n const read = await this._read()\r\n if (!read.existing) {\r\n const meta: SessionEvent = {\r\n id: randomUUID(),\r\n seq: 1,\r\n ts: Date.now(),\r\n type: 'meta',\r\n payload: { formatVersion: SESSION_FORMAT_VERSION },\r\n }\r\n await writeFile(this.file, `${JSON.stringify(meta)}\\n`, 'utf8')\r\n this._events = [meta]\r\n this._refreshSurface()\r\n this._nextSeq = 2\r\n this._loaded = true\r\n return\r\n }\r\n this._events = read.events\r\n this._refreshSurface()\r\n this._requestHeader = foldRequestHeader(this._events)\r\n this._requestContext = foldRequestContext(this._events)\r\n this._nextSeq = (this._events.at(-1)?.seq ?? 0) + 1\r\n this._loaded = true\r\n }\r\n\r\n private async _read(): Promise<{ existing: boolean; events: SessionEvent[] }> {\r\n let text: string\r\n try {\r\n text = await readFile(this.file, 'utf8')\r\n } catch (error) {\r\n if ((error as NodeJS.ErrnoException).code === 'ENOENT') {\r\n return { existing: false, events: [] }\r\n }\r\n throw error\r\n }\r\n if (!text.trim()) return { existing: false, events: [] }\r\n\r\n const lines = text.split('\\n')\r\n const events: SessionEvent[] = []\r\n let torn = false\r\n for (const line of lines) {\r\n if (!line.trim()) continue\r\n if (torn) continue\r\n let parsed: unknown\r\n try {\r\n parsed = JSON.parse(line)\r\n } catch {\r\n torn = true\r\n continue\r\n }\r\n if (!isSessionEvent(parsed)) {\r\n torn = true\r\n continue\r\n }\r\n events.push(parsed)\r\n }\r\n\r\n this._assertFormat(events)\r\n\r\n const key = sessionFileKey(this.file)\r\n const owner = liveSessions.get(key)\r\n if (owner && owner !== this) {\r\n // A live writer owns this log; never synthesize closures over its active turn.\r\n return { existing: true, events }\r\n }\r\n\r\n const synthetic = repairUnclosed(events)\r\n if (!torn && !synthetic.length) return { existing: true, events }\r\n\r\n const repaired = [...events, ...synthetic]\r\n await writeFile(\r\n this.file,\r\n `${repaired.map(event => JSON.stringify(event)).join('\\n')}\\n`,\r\n 'utf8',\r\n )\r\n return { existing: true, events: repaired }\r\n }\r\n\r\n private _assertFormat(events: readonly SessionEvent[]): void {\r\n let version: number | undefined\r\n for (const event of events) {\r\n if (event.type !== 'meta') continue\r\n const value = (event.payload as Record<string, unknown>).formatVersion\r\n if (typeof value === 'number') version = value\r\n }\r\n if (version === undefined) {\r\n throw new SessionFormatError(\r\n `session log is missing formatVersion; expected ${SESSION_FORMAT_VERSION}`,\r\n )\r\n }\r\n if (version !== SESSION_FORMAT_VERSION) {\r\n throw new SessionFormatError(\r\n `unsupported session format version ${version}; expected ${SESSION_FORMAT_VERSION}`,\r\n )\r\n }\r\n }\r\n\r\n private _resolveLineage(messageId: string): SessionEvent[] {\r\n const messages = this._events.filter(\r\n (event): event is Extract<SessionEvent, { type: MessageEventType }> => isMessageEvent(event),\r\n )\r\n const byId = new Map<string, Extract<SessionEvent, { type: MessageEventType }>>(\r\n messages.map(event => [event.id, event] as const),\r\n )\r\n if (!byId.has(messageId)) {\r\n throw new Error(`message not found: ${messageId}`)\r\n }\r\n const chain: SessionEvent[] = []\r\n const seen = new Set<string>()\r\n let cursorId: string | undefined = messageId\r\n while (cursorId && byId.has(cursorId) && !seen.has(cursorId)) {\r\n seen.add(cursorId)\r\n const event: Extract<SessionEvent, { type: MessageEventType }> = byId.get(cursorId)!\r\n chain.unshift(clone(event))\r\n const parentId: string | undefined = event.payload.parentId\r\n if (parentId && byId.has(parentId)) {\r\n cursorId = parentId\r\n continue\r\n }\r\n const index = messages.findIndex(message => message.id === cursorId)\r\n cursorId = index > 0 ? messages[index - 1]!.id : undefined\r\n }\r\n return chain\r\n }\r\n}\r\n\r\nexport const session = {\r\n name: 'session',\r\n apply: async (ctx: Context, config: SessionConfig) => {\r\n const log = new SessionLog(config.file, config.broadcast ?? ((type, payload) => {\r\n if (type === 'event') ctx.emit('session/event', payload)\r\n else ctx.emit('session/flush', payload)\r\n }))\r\n await log.init()\r\n ctx.provide('session', log)\r\n return () => log.close()\r\n },\r\n}\r\n\r\nexport * from './invariant.js'\r\n\r\nexport const name = '@tnega/session'\r\n", "/**\r\n * Session invariant companion.\r\n *\r\n * Pure structural checks over a session event stream, mirroring the DSH\r\n * \"each package ships a ./invariant\" discipline. They assert the relationships\r\n * the event-sourcing layer promises:\r\n *\r\n * - durable lifecycle structures (turn / step / tool call) stay balanced \u2014\r\n * every `turn/start` has a `turn/end`, every `tool/call` a `tool/result`;\r\n * - seq stays strictly monotonic;\r\n * - message events that reach the model surface stay append-only unless they\r\n * belong to a compaction replacement.\r\n *\r\n * The checks are pure over `SessionEvent[]`, so they run equally on a full\r\n * log, on a single newly-committed event, or in tests. Recovery (repairing an\r\n * interrupted log into a closed one) is `repairUnclosed`; these checks assert\r\n * that the result is actually legal.\r\n */\r\n\r\nimport type { SessionEvent, ToolResultPayload } from './index.js'\r\n\r\nexport interface SessionInvariantFailure {\r\n name: string\r\n detail: string\r\n}\r\n\r\n/** Balanced `turn/start` \u2194 `turn/end` per turn number. */\r\nexport function checkBalancedTurns(events: readonly SessionEvent[]): SessionInvariantFailure[] {\r\n const opens = new Map<number, number>()\r\n const failures: SessionInvariantFailure[] = []\r\n for (const event of events) {\r\n if (event.type === 'turn/start') {\r\n opens.set(event.payload.turn, (opens.get(event.payload.turn) ?? 0) + 1)\r\n } else if (event.type === 'turn/end') {\r\n const remaining = opens.get(event.payload.turn) ?? 0\r\n if (remaining <= 0) {\r\n failures.push({\r\n name: 'turn/end-without-start',\r\n detail: `turn/end for turn ${event.payload.turn} has no matching turn/start`,\r\n })\r\n } else {\r\n opens.set(event.payload.turn, remaining - 1)\r\n }\r\n }\r\n }\r\n for (const [turn, count] of opens) {\r\n for (let index = 0; index < count; index += 1) {\r\n failures.push({\r\n name: 'turn/start-without-end',\r\n detail: `turn/start ${turn} has no matching turn/end`,\r\n })\r\n }\r\n }\r\n return failures\r\n}\r\n\r\n/** Balanced `step/start` \u2194 `step/end` per (turn, step). */\r\nexport function checkBalancedSteps(events: readonly SessionEvent[]): SessionInvariantFailure[] {\r\n const open = new Set<string>()\r\n const failures: SessionInvariantFailure[] = []\r\n for (const event of events) {\r\n if (event.type === 'step/start') {\r\n const key = `${event.payload.turn}:${event.payload.step}`\r\n if (open.has(key)) {\r\n failures.push({\r\n name: 'duplicate-step-start',\r\n detail: `step/start for ${key} appears twice without a matching step/end`,\r\n })\r\n }\r\n open.add(key)\r\n } else if (event.type === 'step/end') {\r\n const key = `${event.payload.turn}:${event.payload.step}`\r\n if (!open.delete(key)) {\r\n failures.push({\r\n name: 'step/end-without-start',\r\n detail: `step/end for ${key} has no matching step/start`,\r\n })\r\n }\r\n }\r\n }\r\n for (const key of open) {\r\n failures.push({\r\n name: 'step/start-without-end',\r\n detail: `step/start ${key} has no matching step/end`,\r\n })\r\n }\r\n return failures\r\n}\r\n\r\n/** Balanced `tool/call` \u2194 `tool/result` per call id. */\r\nexport function checkBalancedToolCalls(events: readonly SessionEvent[]): SessionInvariantFailure[] {\r\n const open = new Set<string>()\r\n const failures: SessionInvariantFailure[] = []\r\n for (const event of events) {\r\n if (event.type === 'tool/call') {\r\n open.add(event.payload.id)\r\n } else if (event.type === 'tool/result') {\r\n const payload = event.payload as ToolResultPayload\r\n const id = payload.toolCallId\r\n if (!open.delete(id)) {\r\n failures.push({\r\n name: 'tool/result-without-call',\r\n detail: `tool/result for call ${id} has no matching tool/call`,\r\n })\r\n }\r\n }\r\n }\r\n for (const id of open) {\r\n failures.push({\r\n name: 'tool/call-without-result',\r\n detail: `tool/call ${id} has no matching tool/result`,\r\n })\r\n }\r\n return failures\r\n}\r\n\r\n/** seq is strictly monotonic (an append-only log never rewinds). */\r\nexport function checkMonotonicSeq(events: readonly SessionEvent[]): SessionInvariantFailure[] {\n const failures: SessionInvariantFailure[] = []\r\n for (let index = 1; index < events.length; index += 1) {\r\n const previous = events[index - 1]\r\n const current = events[index]\r\n if (current && previous && current.seq <= previous.seq) {\r\n failures.push({\r\n name: 'non-monotonic-seq',\r\n detail: `seq ${current.seq} follows ${previous.seq} out of order at index ${index}`,\r\n })\r\n }\r\n }\r\n return failures\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null\n && (Object.getPrototypeOf(value) === Object.prototype || Object.getPrototypeOf(value) === null)\n}\n\nfunction isNonNegativeInteger(value: unknown): value is number {\n return typeof value === 'number' && Number.isSafeInteger(value) && value >= 0\n}\n\n/** Tool arguments must survive JSONL persistence without losing values. */\nfunction isJsonValue(value: unknown, ancestors = new Set<object>()): boolean {\n if (value === null || typeof value === 'string' || typeof value === 'boolean') return true\n if (typeof value === 'number') return Number.isFinite(value)\n if (typeof value !== 'object' || ancestors.has(value)) return false\n if (!Array.isArray(value) && Object.getPrototypeOf(value) !== Object.prototype\n && Object.getPrototypeOf(value) !== null) return false\n ancestors.add(value)\n const valid = (Array.isArray(value) ? Array.from(value) : Object.values(value))\n .every(member => isJsonValue(member, ancestors))\n ancestors.delete(value)\n return valid\n}\n\nfunction isStreamRecord(value: unknown): boolean {\n if (!isRecord(value) || !isNonNegativeInteger(value.time) || !isRecord(value.chunk)) return false\n const chunk = value.chunk\n if (chunk.type === 'stream_error') {\n return isRecord(chunk.error)\n && typeof chunk.error.message === 'string'\n && (chunk.error.name === undefined || typeof chunk.error.name === 'string')\n && (chunk.error.stack === undefined || typeof chunk.error.stack === 'string')\n }\n if (typeof chunk.id !== 'string') return false\n switch (chunk.type) {\n case 'message_start':\n return chunk.model === undefined || typeof chunk.model === 'string'\n case 'message_delta':\n return typeof chunk.delta === 'string'\n case 'toolcall_start':\n case 'toolcall_end':\n return isNonNegativeInteger(chunk.index) && typeof chunk.name === 'string'\n && (chunk.type === 'toolcall_start' || isJsonValue(chunk.arguments))\n case 'message_stop':\n return chunk.finishReason === 'stop' || chunk.finishReason === 'tool_calls'\n || chunk.finishReason === 'length' || chunk.finishReason === 'max_turns'\n || chunk.finishReason === 'max_steps' || chunk.finishReason === 'error'\n || chunk.finishReason === 'cancelled'\n default:\n return false\n }\n}\n\n/** A terminal attempt belongs to an open durable step, never to a live attempt id. */\nexport function checkAssistantAttempts(events: readonly SessionEvent[]): SessionInvariantFailure[] {\n const turns = new Set<number>()\n const steps = new Map<string, number>()\n const failures: SessionInvariantFailure[] = []\n for (const event of events) {\n if (event.type === 'turn/start') turns.add(event.payload.turn)\n if (event.type === 'turn/end') {\n turns.delete(event.payload.turn)\n for (const [key, turn] of steps) {\n if (turn === event.payload.turn) steps.delete(key)\n }\n }\n if (event.type === 'step/start' && turns.has(event.payload.turn)) {\n steps.set(`${event.payload.turn}:${event.payload.step}`, event.payload.turn)\n }\n if (event.type === 'step/end') steps.delete(`${event.payload.turn}:${event.payload.step}`)\n if (event.type !== 'assistant/attempt') continue\n const payload: unknown = event.payload\n if (!isRecord(payload) || !isNonNegativeInteger(payload.turn) || !isNonNegativeInteger(payload.step)\n || !turns.has(payload.turn) || !steps.has(`${payload.turn}:${payload.step}`)) {\n failures.push({\n name: 'assistant/attempt-without-open-step',\n detail: `assistant/attempt at seq ${event.seq} has no matching open turn and step`,\n })\n }\n if (!isRecord(payload) || !Array.isArray(payload.stream) || !payload.stream.every(isStreamRecord)) {\n failures.push({\n name: 'assistant/attempt-invalid-stream',\n detail: `assistant/attempt at seq ${event.seq} must contain an ordered array of normalized stream records`,\n })\n }\n }\n return failures\n}\n\r\n/** Aggregate all structural session checks over an event stream. */\r\nexport function checkSessionInvariants(\r\n events: readonly SessionEvent[],\r\n): SessionInvariantFailure[] {\r\n return [\r\n ...checkBalancedTurns(events),\r\n ...checkBalancedSteps(events),\r\n ...checkBalancedToolCalls(events),\r\n ...checkMonotonicSeq(events),\n ...checkAssistantAttempts(events),\n ]\r\n}\r\n", "import type { Context, Plugin } from '@tnega/core'\r\nimport type { ModelMessage } from '@tnega/session'\r\nimport type { ToolDefinition } from '@tnega/tools'\r\n\r\nimport { agent, AgentService, type AgentConfig } from './service.js'\r\nimport type { AgentHooks, AgentInput, AgentLoop } from './types.js'\r\nimport type { SystemPromptService } from './prompt.js'\r\n\r\nexport type AgentDefinitionHooks = AgentHooks\r\n\r\nexport interface AgentDefinition {\r\n name: string\r\n version?: string\r\n system?: string | ((ctx: Context) => string)\r\n tools?: readonly ToolDefinition[]\r\n loop?: AgentLoop\r\n hooks?: AgentDefinitionHooks\r\n}\r\n\r\nexport interface DefineAgentConfig extends Partial<\r\n Pick<AgentConfig, 'llm' | 'maxTurns' | 'maxSteps' | 'inbox' | 'contextBudget'>\r\n> {\r\n [key: string]: unknown\r\n}\r\n\r\nfunction resolveSystemPrompt(\r\n ctx: Context,\r\n system: string | ((ctx: Context) => string) | undefined,\r\n): string | undefined {\r\n if (!system) return undefined\r\n return typeof system === 'function' ? system(ctx) : system\r\n}\r\n\r\nfunction withSystemPrompt(\r\n input: AgentInput | undefined,\r\n system: string | undefined,\r\n): AgentInput | undefined {\r\n if (!system) return input\r\n const messages: ModelMessage[] = [\r\n { role: 'system', content: system },\r\n ...(input?.messages ?? []),\r\n ]\r\n if (input?.text) messages.push({ role: 'user', content: input.text })\r\n return { ...(input ?? {}), messages }\r\n}\r\n\r\nexport function defineAgent(\r\n definition: AgentDefinition,\r\n): Plugin {\r\n const name = definition.name.trim()\r\n if (!name) throw new TypeError('agent definition requires a non-empty name')\r\n\r\n return {\r\n name: `agent:${name}`,\r\n inject: ['session', 'tools'],\r\n apply: async (ctx: Context, config: DefineAgentConfig = {}) => {\r\n const dynamic = ctx as unknown as {\r\n tools: { register(tool: ToolDefinition): () => void }\r\n }\r\n const system = resolveSystemPrompt(ctx, definition.system)\r\n let agentService: AgentService | undefined\r\n\r\n if (definition.loop) {\r\n const loop: AgentLoop = async (input, options) => {\r\n await definition.hooks?.beforeRun?.(input ?? {}, options ?? {})\r\n const result = await definition.loop!(\r\n withSystemPrompt(input, system),\r\n options,\r\n )\r\n await definition.hooks?.afterRun?.(result, options ?? {})\r\n return result\r\n }\r\n ctx.provide('agentLoop', loop)\r\n } else {\r\n const agentConfig: AgentConfig = {}\r\n if (definition.hooks) agentConfig.hooks = definition.hooks\r\n if (config.llm) agentConfig.llm = config.llm\r\n if (config.maxTurns !== undefined) agentConfig.maxTurns = config.maxTurns\r\n if (config.maxSteps !== undefined) agentConfig.maxSteps = config.maxSteps\r\n if (config.inbox) agentConfig.inbox = config.inbox\r\n if (config.contextBudget) agentConfig.contextBudget = config.contextBudget\r\n const agentFiber = ctx.plugin(agent, agentConfig)\r\n await agentFiber\r\n agentService = ctx.reflect.get('agent') as AgentService\r\n if (system) agentService.inbox.inject('agentSystem', system)\r\n }\r\n\r\n if (system) {\r\n const prompt = ctx.reflect.get('systemPrompt') as SystemPromptService | undefined\r\n if (prompt) {\r\n ctx.fiber.effect(() => prompt.registerSection({\r\n name: `${name}:persona`,\r\n content: system,\r\n }), `ctx.systemPrompt.section(${JSON.stringify(name)})`)\r\n }\r\n }\r\n\r\n for (const tool of definition.tools ?? []) {\r\n dynamic.tools.register(tool)\r\n }\r\n\r\n ctx.provide('agentDefinition', definition)\r\n ctx.provide('agentSystem', system)\r\n ctx.emit('agent/definition', {\r\n name,\r\n version: definition.version,\r\n system,\r\n toolCount: (definition.tools ?? []).length,\r\n })\r\n },\r\n }\r\n}\r\n", "import { randomUUID } from 'node:crypto'\r\nimport { Context, symbols, type Plugin } from '@tnega/core'\r\nimport { SessionLog, type SessionEvent } from '@tnega/session'\r\nimport type { ModelMessage } from '@tnega/session'\r\nimport { AgentInbox, AgentService } from './service.js'\r\nimport { AgentError } from './service.js'\r\nimport {\n DurableInbox,\n type DurableInboxMessage,\n type DurableTarget,\n} from './inbox-durable.js'\nimport type {\r\n AgentCancelCause,\r\n AgentContextBudget,\r\n AgentHooks,\n AgentInput,\n AgentLoop,\n AgentRunResult,\n AgentStreamEvent,\r\n LLMAdapter,\r\n} from './types.js'\r\n\r\nexport interface AgentSessionMeta {\r\n agentId: string\r\n agentType?: 'general' | 'coding'\r\n mode?: 'auto' | 'plan' | 'execute'\r\n title?: string\r\n owner?: string\r\n parentSessionId?: string\r\n forkedAtMessageId?: string\r\n createdAt?: number\r\n}\r\n\r\n/** Synchronous finalizer invoked immediately before agent publication. */\r\nexport interface AgentSetupCommit {\r\n commit(): void\r\n}\r\n\r\n/** Compose an unpublished agent scope; a throw rejects the whole creation. */\r\nexport type AgentSetup = (\r\n agentCtx: Context,\r\n) => AgentSetupCommit | Promise<AgentSetupCommit | void> | void\r\n\r\nexport interface LiveInboxView {\r\n readonly size: number\r\n snapshot(): { nextTurn: readonly DurableInboxMessage[]; nextStep: readonly DurableInboxMessage[] }\r\n}\r\n\r\nexport type AgentStatus = 'idle' | 'running'\r\n\r\nexport interface AgentCancelOptions {\n keepInbox?: boolean\n}\n\n/** Public API intent for a newly inserted inbox message. */\nexport type AgentInboxInsertionIntent = 'followup' | 'steer' | 'inject'\n\n/** Target carried by an inbox insertion observation. */\nexport type AgentInboxInsertedTarget = AgentInboxInsertionIntent | DurableTarget\n\nexport interface AgentInboxInsertedEvent {\n id: string\n agent: LiveAgent\n /**\n * New messages report their public API intent. Replacements report the\n * durable queue target that contained the replaced message.\n */\n target: AgentInboxInsertedTarget\n input: DurableInboxMessage\n inboxSeq: number\n}\n\nexport interface LiveAgent {\n readonly id: string\r\n readonly meta: AgentSessionMeta\r\n readonly agentType: 'general' | 'coding' | undefined\r\n readonly mode: 'auto' | 'plan' | 'execute' | undefined\r\n readonly owner: string | undefined\r\n readonly parentSessionId: string | undefined\r\n readonly status: AgentStatus\r\n readonly inbox: LiveInboxView\r\n readonly session: SessionLog\r\n readonly ctx: Context\r\n /** The scoped context setup composes before publication. */\r\n readonly agentCtx: Context\r\n followup(input: AgentInput): Promise<void>\n steer(input: AgentInput): Promise<void>\n replaceMessage(messageId: string, input: AgentInput): Promise<void>\n removeMessage(messageId: string): Promise<void>\n /** Durably stage model-visible input for the next step without waking idle work. */\n inject(input: AgentInput): Promise<void>\n send(input: AgentInput, options?: { mode?: 'followup' | 'steer' }): Promise<void>\n cancel(cause: AgentCancelCause, options?: AgentCancelOptions): void\r\n whenIdle(): Promise<void>\r\n /**\r\n * Drain currently queued durable work as a live event stream, one turn per\r\n * claimed inbox item. In manual-streaming mode this is the only drain; the\r\n * generator settles when the queue is empty, so callers stream a run and\r\n * stop at quiescence.\r\n */\r\n runTurns(signal?: AbortSignal): AsyncGenerator<AgentStreamEvent, void, void>\r\n runMaintenance<T>(task: (signal: AbortSignal) => Promise<T>): Promise<T>\r\n dispose(): Promise<void>\r\n}\r\n\r\nexport interface AgentHandle {\r\n agent: LiveAgent\r\n dispose(): Promise<void>\r\n}\r\n\r\nexport interface AgentCreationOptions {\r\n file: string\r\n /** Stable identity shared by this process and future resumes. */\r\n sessionId?: string\r\n agentType?: 'general' | 'coding'\r\n mode?: 'auto' | 'plan' | 'execute'\r\n title?: string\r\n owner?: string\r\n parentSessionId?: string\r\n forkedAtMessageId?: string\r\n id?: string\r\n /** Optional composition callback run before the agent is published. */\r\n setup?: AgentSetup\r\n llm?: LLMAdapter\r\n system?: string\r\n maxTurns?: number\r\n maxSteps?: number\r\n contextBudget?: AgentContextBudget\r\n hooks?: AgentHooks\r\n initial?: readonly AgentInput[]\r\n /** Disable the automatic drain; callers drive turns via `runTurns`. */\r\n manualStreaming?: boolean\r\n}\r\n\r\nexport interface AgentFactory {\r\n create(options: AgentCreationOptions): Promise<AgentHandle>\r\n resume(options: AgentCreationOptions): Promise<AgentHandle>\r\n}\r\n\r\nfunction createAgentRuntimeContext(agentCtx: Context): Context {\r\n const runtimeCtx = agentCtx.extend()\r\n Object.defineProperty(runtimeCtx, Context.filter, {\r\n value: (target: Context) => {\r\n const targetScope = target[symbols.isolate]!.agentScope\r\n let ancestor = agentCtx\r\n while (true) {\r\n if (targetScope === ancestor[symbols.isolate]!.agentScope) return true\r\n if (ancestor.fiber.parent.fiber === ancestor.fiber) return false\r\n ancestor = ancestor.fiber.parent\r\n }\r\n },\r\n })\r\n const events = agentCtx.events as unknown as Record<\r\n string,\r\n (...args: unknown[]) => unknown\r\n >\r\n for (const method of ['emit', 'parallel', 'serial', 'bail', 'waterfall', 'waterfallAsync']) {\r\n Object.defineProperty(runtimeCtx, method, {\r\n value: (...args: unknown[]) => events[method]!(runtimeCtx, ...args),\r\n })\r\n }\r\n return runtimeCtx\r\n}\r\n\r\nclass LiveAgentImpl implements LiveAgent {\n private _status: AgentStatus = 'idle'\r\n private _disposed = false\r\n private _controller: AbortController | undefined\r\n private _drainPromise: Promise<void> | undefined\r\n private _busy = false\r\n private _writeTail: Promise<void> = Promise.resolve()\r\n private _pendingWrite: Promise<void> | undefined\r\n private _sessionStarted = false\r\n private _maintenance:\r\n | { promise: Promise<void>; controller: AbortController }\r\n | undefined\r\n private _maintenanceBusy = false\r\n private _setupDisposers: Array<() => Promise<void> | void> = []\r\n private _scopeClosed = false\r\n private _durable: DurableInbox\r\n private _manualStreaming = false\r\n private _wakeReserved = false\n private _loop: AgentLoop | undefined\n\r\n constructor(\r\n private _ctx: Context,\r\n private _agentCtx: Context,\r\n private _service: AgentService,\r\n readonly id: string,\r\n readonly inbox: LiveInboxView,\r\n readonly session: SessionLog,\r\n durable: DurableInbox,\r\n readonly meta: AgentSessionMeta,\r\n manualStreaming = false,\r\n wakeReserved = false,\r\n ) {\r\n this._durable = durable\r\n this._manualStreaming = manualStreaming\r\n this._wakeReserved = wakeReserved\r\n }\r\n\r\n get agentType(): 'general' | 'coding' | undefined {\r\n return this.meta.agentType\r\n }\r\n\r\n get mode(): 'auto' | 'plan' | 'execute' | undefined {\r\n return this.meta.mode\r\n }\r\n\r\n get owner(): string | undefined {\r\n return this.meta.owner\r\n }\r\n\r\n get parentSessionId(): string | undefined {\r\n return this.meta.parentSessionId\r\n }\r\n\r\n get agentCtx(): Context {\r\n return this._agentCtx\r\n }\r\n\r\n trackSetupDispose(dispose: () => Promise<void> | void): void {\n if (this._scopeClosed) void dispose()\r\n else this._setupDisposers.push(dispose)\r\n }\r\n\r\n get status(): AgentStatus {\r\n return this._status\r\n }\r\n\r\n get ctx(): Context {\r\n return this._ctx\r\n }\r\n\r\n followup(input: AgentInput): Promise<void> {\n return this._send(input, 'followup')\n }\n\n setLoop(loop: AgentLoop | undefined): void {\n this._loop = loop\n }\n\n private async _closeCustomTurn(turn: number, run: AgentRunResult): Promise<void> {\n const events = await this.session.read()\n if (events.some(event => event.type === 'turn/end' && event.payload.turn === turn)) return\n const reason = run.finishReason === 'length'\n ? { kind: 'max-tokens' as const }\n : run.finishReason === 'max_steps'\n ? { kind: 'max-steps' as const }\n : run.finishReason === 'max_turns'\n ? { kind: 'max-turns' as const }\n : run.finishReason === 'cancelled'\n ? { kind: 'interrupted' as const }\n : run.finishReason === 'error'\n ? { kind: 'interrupted' as const }\n : { kind: 'completed' as const }\n await this.session.append('turn/end', {\n turn,\n finishReason: run.finishReason,\n reason,\n ...(run.output ? { output: run.output } : {}),\n ...(run.steps.length ? { steps: run.steps.length } : {}),\n })\n }\n\n private async _closeFailedCustomTurn(turn: number, error: unknown): Promise<void> {\n const events = await this.session.read()\n if (events.some(event => event.type === 'turn/end' && event.payload.turn === turn)) return\n const failure = error instanceof Error\n ? { name: error.name, message: error.message, ...(error.stack ? { stack: error.stack } : {}) }\n : { name: 'Error', message: String(error) }\n await this.session.append('turn/end', {\n turn,\n finishReason: 'error',\n reason: { kind: 'error', error: failure },\n interrupted: true,\n error: failure,\n })\n }\n\n /** Replace one pending inbox message by durable message id. */\n replaceMessage(messageId: string, input: AgentInput): Promise<void> {\n return this._mutatePending(async () => {\n const previous = this._durable.get(messageId)\n const target = this._findTarget(messageId)\n if (!previous || !target) return\n const replacement = await this._durable.replace(messageId, {\n text: input.text ?? '',\r\n ...(input.messages !== undefined || input.context !== undefined\r\n ? { content: input.messages ?? input.context }\r\n : {}),\r\n })\r\n if (!replacement) return\r\n this._ctx.emit('agent/inbox/discarded', {\r\n id: this.id,\r\n agent: this,\r\n message: previous,\r\n })\r\n const event: AgentInboxInsertedEvent = {\n id: this.id,\n agent: this,\n target,\n input: replacement,\n inboxSeq: this._durable.size,\n }\n this._ctx.emit('agent/inbox/inserted', event)\n })\n }\n\n /** Remove one pending inbox message by durable message id. */\n removeMessage(messageId: string): Promise<void> {\n return this._mutatePending(async () => {\n const removed = await this._durable.remove(messageId)\r\n if (!removed) return\r\n this._ctx.emit('agent/inbox/discarded', {\r\n id: this.id,\r\n agent: this,\r\n message: removed,\r\n })\r\n })\r\n }\r\n\r\n steer(input: AgentInput): Promise<void> {\n return this._send(input, 'steer')\n }\n\n inject(input: AgentInput): Promise<void> {\n return this._send(input, 'inject')\n }\n\n send(input: AgentInput, options: { mode?: 'followup' | 'steer' } = {}): Promise<void> {\n return this._send(input, options.mode === 'steer' ? 'steer' : 'followup')\n }\n\n private _send(\n input: AgentInput,\n target: AgentInboxInsertionIntent,\n ): Promise<void> {\n const text = input.text ?? ''\n const content = input.messages ?? input.context\n const steeredAfterAbort = target === 'steer' && this._controller?.signal.aborted === true\n return this._mutatePending(async () => {\n const message = target === 'followup'\n ? await this._durable.insert({ text, ...(content !== undefined ? { content } : {}) })\r\n : target === 'steer'\r\n ? steeredAfterAbort\r\n ? await this._durable.insert({ text, ...(content !== undefined ? { content } : {}) })\r\n : await this._durable.steer({ text, ...(content !== undefined ? { content } : {}) })\r\n : await this._durable.insert({ text, ...(content !== undefined ? { content } : {}) }, 'next-step')\r\n if (target !== 'inject') this._wakeReserved = true\n const event: AgentInboxInsertedEvent = {\n id: this.id,\n agent: this,\n target,\n input: message,\n inboxSeq: this._durable.size,\n }\n this._ctx.emit('agent/inbox/inserted', event)\n }, target !== 'inject')\n }\n\n private _mutatePending(\n task: () => Promise<void>,\n wakes = false,\n allowDisposed = false,\n ): Promise<void> {\n if (this._disposed && !allowDisposed) {\n return Promise.reject(new Error(`agent disposed: ${this.id}`))\n }\n const result = this._writeTail.then(task)\n const recovered = result.catch((error: unknown) => {\n try {\n this._ctx.emit('agent/error', { id: this.id, error })\n } catch {\n // Observers must not poison the durable mutation queue.\n }\n })\n this._writeTail = recovered\n this._pendingWrite = recovered\n void result.then(\n () => {\n if (this._pendingWrite === recovered) this._pendingWrite = undefined\n if (wakes) queueMicrotask(() => this._wake())\n },\n () => {\n if (this._pendingWrite === recovered) this._pendingWrite = undefined\n },\n )\n return result\n }\n\r\n private _findTarget(messageId: string): 'next-turn' | 'next-step' | undefined {\r\n const snapshot = this._durable.snapshot()\r\n if (snapshot.nextStep.some(message => message.id === messageId)) return 'next-step'\r\n if (snapshot.nextTurn.some(message => message.id === messageId)) return 'next-turn'\r\n return undefined\r\n }\r\n\r\n cancel(cause: AgentCancelCause, options: AgentCancelOptions = {}): void {\n if (!options.keepInbox) {\n void this._mutatePending(async () => {\n const before = this._durable.snapshot()\n await this._durable.clear()\n for (const message of [...before.nextStep, ...before.nextTurn]) {\n this._ctx.emit('agent/inbox/discarded', { id: this.id, message })\n }\n this._wakeReserved = false\n }, false, true)\n }\n this._controller?.abort(cause)\r\n this._maintenance?.controller.abort(cause)\r\n }\r\n\r\n async whenIdle(): Promise<void> {\r\n while (true) {\r\n while (this._pendingWrite) await this._pendingWrite\r\n const maintenance = this._maintenance\r\n if (maintenance) {\r\n await maintenance.promise.catch(() => undefined)\r\n continue\r\n }\r\n const drain = this._drainPromise\r\n if (drain) {\r\n await drain.catch(() => undefined)\r\n continue\r\n }\r\n if (!this._hasQueuedWork()) break\r\n await new Promise<void>(resolve => setTimeout(resolve, 0))\r\n }\r\n }\r\n\r\n /** Run one non-turn maintenance task from the true idle phase. */\r\n runMaintenance<T>(task: (signal: AbortSignal) => Promise<T>): Promise<T> {\r\n if (this._disposed) throw new Error(`agent disposed: ${this.id}`)\r\n if (this._maintenanceBusy || this._drainPromise || this._pendingWrite) {\r\n throw new Error('agent is busy; maintenance can only run while idle')\r\n }\r\n this._maintenanceBusy = true\r\n const controller = new AbortController()\r\n const result = Promise.resolve()\r\n .then(async () => {\r\n const value = await task(controller.signal)\r\n return value\r\n })\r\n .finally(() => {\r\n this._maintenanceBusy = false\r\n if (this._maintenance?.controller === controller) {\r\n this._maintenance = undefined\r\n }\r\n queueMicrotask(() => this._wake())\r\n })\r\n this._maintenance = { promise: result.then(() => undefined, () => undefined), controller }\r\n return result\r\n }\r\n\r\n async dispose(): Promise<void> {\r\n if (this._disposed) return\r\n this._disposed = true\r\n this.cancel({ type: 'disposed' })\r\n await this._writeTail.catch(() => undefined)\r\n await this._drainPromise?.catch(() => undefined)\r\n if (this._maintenance) this._maintenance.controller.abort({ type: 'disposed' })\r\n await this._maintenance?.promise.catch(() => undefined)\r\n if (!this._scopeClosed) {\r\n this._scopeClosed = true\r\n await Promise.all([...this._setupDisposers].reverse().map(dispose => dispose()))\r\n }\r\n const writeTail = this._writeTail\r\n if (writeTail !== this._drainPromise && this._pendingWrite) {\n this._pendingWrite = undefined\n await writeTail.catch(() => undefined)\n }\n await this.session.close()\n this._setStatus('idle')\n }\r\n\r\n /** Publish the agent lifecycle session-start notification once. */\r\n async publishSessionStart(source: 'startup' | 'resume' = 'startup'): Promise<void> {\r\n if (this._sessionStarted) return\r\n this._sessionStarted = true\r\n this._ctx.emit('agent/session-start', {\r\n id: this.id,\r\n agent: this,\r\n source,\r\n })\r\n }\r\n\r\n /** Current durable turn number for a newly claimed inbox item. */\r\n private async _nextTurnNumber(): Promise<number> {\r\n const events = await this.session.read()\r\n let max = 0\r\n for (const event of events) {\r\n if (event.type === 'turn/start') max = Math.max(max, event.payload.turn)\r\n }\r\n return max + 1\r\n }\r\n\r\n /** Start draining currently pending durable work without a new input. */\r\n wakeNow(): void {\r\n this._wake()\r\n }\r\n\r\n private _wake(): void {\r\n if (\r\n this._disposed\r\n || this._manualStreaming\r\n || this._drainPromise\r\n || this._busy\r\n || this._maintenanceBusy\r\n ) return\r\n const task = this._drainAll()\n this._drainPromise = task\n void task.then(\n () => {\n if (this._drainPromise === task) this._drainPromise = undefined\n if (this._hasQueuedWork()) queueMicrotask(() => this._wake())\n },\n (error: unknown) => {\n if (this._drainPromise === task) this._drainPromise = undefined\n try {\n this._ctx.emit('agent/error', { id: this.id, agent: this, error })\n } catch {\n // Observers must not turn a contained drain failure into an unhandled rejection.\n }\n },\n )\n }\r\n\r\n private async _drainAll(): Promise<void> {\r\n await this._writeTail.catch(() => undefined)\r\n if (this._hasQueuedWork()) {\r\n // Automatic (library) drain: consume the queue, discarding the stream.\r\n for await (const _ of this._streamTurns()) void _\r\n }\r\n }\r\n\r\n /** Public drain over queued durable work (manual-streaming mode). */\r\n async *runTurns(signal?: AbortSignal): AsyncGenerator<AgentStreamEvent, void, void> {\r\n if (this._manualStreaming) await this._writeTail.catch(() => undefined)\r\n if (this._busy || this._disposed) return\r\n yield* this._streamTurns(signal)\r\n }\r\n\r\n private async *_streamTurns(\r\n signal?: AbortSignal,\r\n ): AsyncGenerator<AgentStreamEvent, void, void> {\r\n if (this._busy || this._disposed) return\r\n this._busy = true\r\n this._setStatus('running')\r\n try {\r\n while (!this._disposed) {\r\n // A waking steer may open a later turn if the preceding turn has\r\n // already passed its last next-step boundary. Inject stays inert.\r\n const snapshot = this._durable.snapshot()\r\n if (!snapshot.nextTurn.length && !this._wakeReserved) break\n const turn = await this._nextTurnNumber()\n await this.session.append('turn/start', { turn, reason: 'user' })\n const batch = await this._durable.claimBatch()\n this._wakeReserved = false\n const input = batch.length ? await this._inputForBatch(batch, true) : { text: '' }\n for (const message of batch) {\r\n this._ctx.emit('agent/inbox/claimed', {\r\n id: this.id,\r\n agent: this,\r\n message,\r\n input: { text: message.text ?? '' },\r\n turn,\r\n })\r\n }\r\n const controller = new AbortController()\r\n this._controller = controller\r\n const forward = (): void => controller.abort(signal?.reason)\r\n if (signal?.aborted) controller.abort(signal.reason)\r\n else signal?.addEventListener('abort', forward, { once: true })\r\n try {\r\n if (this._manualStreaming) {\n if (this._loop) {\n const run = await this._loop(input, { signal: controller.signal, turn })\n await this._closeCustomTurn(turn, run)\n yield { type: 'run/end', run }\n } else {\n yield* this._service.runStream(input, { signal: controller.signal, turn })\n }\n } else {\n if (this._loop) {\n const run = await this._loop(input, { signal: controller.signal, turn })\n await this._closeCustomTurn(turn, run)\n }\n else await this._service.run(input, { signal: controller.signal, turn })\n }\r\n } catch (error) {\n if (this._loop) await this._closeFailedCustomTurn(turn, error)\n if (!controller.signal.aborted) {\n const step = await this._failedStep()\r\n this._ctx.emit('agent/error', {\r\n id: this.id,\r\n agent: this,\r\n error,\r\n ...(step !== undefined ? { turn, step } : {}),\r\n })\r\n if (this._manualStreaming) throw error\r\n }\r\n } finally {\r\n signal?.removeEventListener('abort', forward)\r\n if (this._controller === controller) this._controller = undefined\r\n }\r\n }\r\n } finally {\r\n this._busy = false\r\n if (!this._durable.size) this._wakeReserved = false\r\n this._setStatus('idle')\r\n }\r\n }\r\n\r\n private _hasQueuedWork(): boolean {\r\n const snapshot = this._durable.snapshot()\r\n return snapshot.nextTurn.length > 0 || (this._wakeReserved && snapshot.nextStep.length > 0)\r\n }\r\n\r\n private async _inputForBatch(\r\n batch: readonly DurableInboxMessage[],\r\n includeHistory: boolean,\r\n ): Promise<AgentInput> {\r\n const history = includeHistory ? await this.session.deriveMessages() : []\r\n const messages = batch.flatMap(message => message.content !== undefined\r\n ? Array.isArray(message.content)\r\n ? message.content as ModelMessage[]\r\n : [{ role: 'user' as const, content: String(message.content ?? '') }]\r\n : message.text !== undefined\r\n ? [{ role: 'user' as const, content: message.text }]\r\n : [])\r\n if (history.length || messages.length > 1) return { messages: [...history, ...messages] }\r\n return { text: messages[0]?.content ?? '' }\r\n }\r\n\r\n async claimNextStepInputs(): Promise<readonly AgentInput[]> {\n await this._writeTail\n const batch = await this._durable.claimNextStep()\n // Claiming next-step input spends its wake reservation only after the\n // durable mutation succeeds. A failed append must remain wakeable.\n this._wakeReserved = false\n if (batch.length) {\n const turn = (await this._nextTurnNumber()) - 1\n for (const message of batch) {\n this._ctx.emit('agent/inbox/claimed', {\n id: this.id,\n agent: this,\n message,\n input: { text: message.text ?? '' },\n turn,\n })\n }\n }\n return batch.length ? [await this._inputForBatch(batch, false)] : []\n }\n\r\n private _setStatus(status: AgentStatus): void {\r\n const previous = this._status\r\n if (previous === status) return\r\n this._status = status\r\n this._ctx.emit('agent/status', { id: this.id, status, previous })\r\n }\r\n\r\n private async _failedStep(): Promise<number | undefined> {\r\n const events = await this.session.read()\r\n for (let index = events.length - 1; index >= 0; index -= 1) {\r\n const event = events[index]\r\n if (event?.type === 'step/end'\r\n && (event.payload.finishReason === 'error'\r\n || event.payload.interrupted === true)) {\r\n return event.payload.step\r\n }\r\n }\r\n return undefined\r\n }\r\n}\r\n\r\nexport class AgentRegistry {\r\n private _agents = new Map<string, LiveAgent>()\r\n private _owners = new Map<string, string | undefined>()\r\n private _factory: AgentFactory | undefined\r\n\r\n constructor(private _ctx: Context) {}\r\n\r\n setFactory(factory: AgentFactory): () => void {\r\n this._factory = factory\r\n return () => {\r\n if (this._factory === factory) this._factory = undefined\r\n }\r\n }\r\n\r\n async create(options: AgentCreationOptions): Promise<AgentHandle> {\r\n if (!this._factory) throw new Error('no agent factory registered')\r\n const id = options.id ?? options.sessionId ?? randomUUID()\r\n if (this._agents.has(id)) throw new Error(`agent already registered: ${id}`)\r\n const handle = await this._factory.create({ ...options, id })\r\n this._agents.set(id, handle.agent)\r\n this._owners.set(id, handle.agent.owner)\r\n this._ctx.emit('agent/created', { id, agent: handle.agent })\r\n return {\r\n agent: handle.agent,\r\n dispose: () => this._dispose(id, handle),\r\n }\r\n }\r\n\r\n async resume(options: AgentCreationOptions): Promise<AgentHandle> {\r\n if (!this._factory) throw new Error('no agent factory registered')\r\n if (!options.id && !options.sessionId) {\r\n throw new AgentError('agent resume requires a stable session id')\r\n }\r\n const id = options.id ?? options.sessionId!\r\n if (this._agents.has(id)) throw new Error(`agent already registered: ${id}`)\r\n const handle = await this._factory.resume({ ...options, id })\r\n this._agents.set(id, handle.agent)\r\n this._owners.set(id, handle.agent.owner)\r\n this._ctx.emit('agent/created', { id, agent: handle.agent })\r\n return {\r\n agent: handle.agent,\r\n dispose: () => this._dispose(id, handle),\r\n }\r\n }\r\n\r\n get(id: string): LiveAgent | undefined {\r\n return this._agents.get(id)\r\n }\r\n\r\n list(): LiveAgent[] {\r\n return [...this._agents.values()]\r\n }\r\n\r\n roots(): LiveAgent[] {\r\n return this.list().filter(agent => this._owners.get(agent.id) === undefined)\r\n }\r\n\r\n isOwnedBy(id: string, owner: string): boolean {\r\n return this._owners.get(id) === owner\r\n }\r\n\r\n private async _dispose(id: string, handle: AgentHandle): Promise<void> {\r\n const agent = this._agents.get(id)\r\n if (!agent) return\r\n await handle.dispose()\r\n this._agents.delete(id)\r\n this._owners.delete(id)\r\n this._ctx.emit('agent/disposed', { id })\r\n }\r\n}\r\n\r\nasync function buildHandle(\r\n ctx: Context,\r\n options: AgentCreationOptions,\r\n resume = false,\r\n): Promise<AgentHandle> {\r\n const fileMeta = await readAgentMeta(options.file)\r\n if (resume && !fileMeta) {\r\n throw new AgentError(`no agent session meta found for resume: ${options.file}`)\r\n }\r\n const requestedId = options.id ?? options.sessionId ?? randomUUID()\r\n if (fileMeta?.agentId && fileMeta.agentId !== requestedId) {\r\n throw new AgentError(\r\n `agent id mismatch: session belongs to ${fileMeta.agentId}, requested ${requestedId}`,\r\n )\r\n }\r\n const agentId = fileMeta?.agentId ?? requestedId\n if (!agentId) throw new AgentError('agent requires a stable identity')\n let agentCtx!: Context\n const agentScope = await ctx.inject([], (scopeCtx: Context) => {\n agentCtx = scopeCtx\n .isolate('agentScope')\n .isolate('llm')\n .isolate('tools')\n .isolate('systemPrompt')\n agentCtx.provide('agentScope', agentCtx)\n })\n await agentScope\n const runtimeCtx = createAgentRuntimeContext(agentCtx)\n const log = new SessionLog(options.file, undefined, runtimeCtx)\n try {\n await log.init()\n const fileEvents = await log.read()\n const durableMeta = readDurableAgentMeta(fileEvents)\n if (durableMeta) {\n if (durableMeta.agentId !== agentId) {\n throw new AgentError(\n `agent id mismatch: session belongs to ${durableMeta.agentId}, requested ${agentId}`,\n )\n }\n if (options.agentType && durableMeta.agentType !== options.agentType) {\n throw new AgentError(\n `agent type mismatch: session is ${durableMeta.agentType ?? 'untyped'}, requested ${options.agentType}`,\n )\n }\n if (options.mode && durableMeta.mode !== options.mode) {\n throw new AgentError(\n `agent mode mismatch: session is ${durableMeta.mode ?? 'unset'}, requested ${options.mode}`,\n )\n }\n }\n const boundMeta: AgentSessionMeta = {\n ...fileMeta,\n ...(durableMeta ?? {}),\n ...(options.title ? { title: options.title } : {}),\n ...(options.owner ? { owner: options.owner } : {}),\n ...(options.parentSessionId ? { parentSessionId: options.parentSessionId } : {}),\n ...(options.forkedAtMessageId ? { forkedAtMessageId: options.forkedAtMessageId } : {}),\n agentId,\n }\n const resolvedAgentType = options.agentType ?? durableMeta?.agentType\n if (resolvedAgentType) boundMeta.agentType = resolvedAgentType\n const resolvedMode = options.mode ?? durableMeta?.mode\n if (resolvedMode) boundMeta.mode = resolvedMode\n if (!durableMeta) {\n await log.append('meta', {\n kind: 'agent',\n agentId,\n ...(boundMeta.agentType ? { agentType: boundMeta.agentType } : {}),\n ...(boundMeta.mode ? { mode: boundMeta.mode } : {}),\n ...(boundMeta.title ? { title: boundMeta.title } : {}),\n ...(boundMeta.owner ? { owner: boundMeta.owner } : {}),\n ...(boundMeta.parentSessionId ? { parentSessionId: boundMeta.parentSessionId } : {}),\n ...(boundMeta.forkedAtMessageId ? { forkedAtMessageId: boundMeta.forkedAtMessageId } : {}),\n ...(boundMeta.createdAt !== undefined ? { createdAt: boundMeta.createdAt } : {}),\n })\n }\n const durable = resume\n ? await DurableInbox.restore(log)\n : new DurableInbox(log)\n const restoredWakeReservation = resume && hasRestoredWakeReservation(fileEvents)\n const injected = new AgentInbox()\n const inboxView: LiveInboxView = {\n get size() {\n return durable.size\n },\n snapshot: () => durable.snapshot(),\n }\n let claimNextStep: () => Promise<readonly AgentInput[]> = async () => []\n const service = new AgentService(runtimeCtx, {\n session: log,\n inbox: injected,\n ...(options.llm ? { llm: options.llm } : {}),\n ...(options.maxTurns !== undefined ? { maxTurns: options.maxTurns } : {}),\n ...(options.maxSteps !== undefined ? { maxSteps: options.maxSteps } : {}),\n ...(options.contextBudget ? { contextBudget: options.contextBudget } : {}),\n ...(options.hooks ? { hooks: options.hooks } : {}),\n claimNextStep: () => claimNextStep(),\n })\n if (options.system) injected.inject('agentSystem', options.system)\n const agent = new LiveAgentImpl(\n runtimeCtx,\n agentCtx,\n service,\n agentId,\n inboxView,\n log,\n durable,\n boundMeta,\n options.manualStreaming === true,\n restoredWakeReservation,\n )\n claimNextStep = () => agent.claimNextStepInputs()\n agent.trackSetupDispose(() => agentScope.dispose())\n let setupResult: AgentSetupCommit | void\n try {\n setupResult = await options.setup?.(agentCtx)\n for (const name of ['llm', 'systemPrompt']) {\n if (agentCtx.reflect.get(name, false) !== undefined) continue\n const inherited = ctx.reflect.get(name, false)\n if (inherited !== undefined) agentCtx.provide(name, inherited)\n }\n const loop = agentCtx.reflect.get('agentLoop', false) as AgentLoop | undefined\n agent.setLoop(loop)\n setupResult?.commit()\n } catch (error) {\n await agent.dispose().catch(() => undefined)\n await log.close().catch(() => undefined)\n throw error\n }\n await agent.publishSessionStart(resume ? 'resume' : 'startup')\n for (const input of options.initial ?? []) {\n if (!resume) await durable.insert({ text: input.text ?? '' })\n }\n if (\n resume\n && (durable.snapshot().nextTurn.length || restoredWakeReservation)\n && options.manualStreaming !== true\n ) {\n setTimeout(() => agent.wakeNow(), 0)\n }\n return { agent, dispose: () => agent.dispose() }\n } catch (error) {\n await Promise.resolve().then(() => agentScope.dispose()).catch(() => undefined)\n throw error\n }\n}\r\n\r\nfunction hasRestoredWakeReservation(events: readonly SessionEvent[]): boolean {\r\n type PendingInboxEntry = { wakes: boolean }\r\n const nextTurn: PendingInboxEntry[] = []\r\n const nextStep: PendingInboxEntry[] = []\r\n for (const event of events) {\n if (event.type !== 'agent/inbox/spliced') continue\n const payload = event.payload\n if (payload.target === 'all') {\n nextTurn.splice(0, payload.deleteCounts?.nextTurn ?? nextTurn.length)\n nextStep.splice(0, payload.deleteCounts?.nextStep ?? nextStep.length)\n continue\n }\n const list = payload.target === 'next-step' ? nextStep : nextTurn\n const count = payload.deleteCount ?? 0\r\n if (count === Number.POSITIVE_INFINITY) {\r\n list.length = 0\r\n } else if (count > 0 && payload.index !== undefined) {\r\n list.splice(payload.index, count)\r\n }\r\n let insertedOffset = 0\r\n for (const inserted of payload.inserted ?? []) {\r\n const entry = { wakes: payload.target === 'next-step' && inserted.mode === 'steer' }\r\n if (inserted.mode === 'steer') {\r\n list.unshift(entry)\r\n } else {\r\n const index = payload.index === undefined\r\n ? list.length\r\n : Math.min(list.length, payload.index + insertedOffset)\r\n list.splice(index, 0, entry)\r\n insertedOffset += 1\r\n }\r\n }\r\n }\r\n return nextStep.some(entry => entry.wakes)\r\n}\r\n\r\nasync function readAgentMeta(\r\n file: string,\r\n): Promise<{ agentId?: string; createdAt?: number } | undefined> {\r\n const lines = await import('node:fs/promises').then(fs => fs.readFile(file, 'utf8'))\r\n .catch((error: unknown) => {\r\n if ((error as NodeJS.ErrnoException).code === 'ENOENT') return undefined\r\n throw error\r\n })\r\n if (lines === undefined) return undefined\r\n for (const line of lines.split('\\n')) {\r\n if (!line.trim()) continue\r\n let record: Record<string, unknown>\r\n try {\r\n const parsed = JSON.parse(line) as unknown\r\n record = parsed && typeof parsed === 'object'\r\n ? parsed as Record<string, unknown>\r\n : {}\r\n } catch {\r\n continue\r\n }\r\n if (record.type !== 'meta') continue\r\n const payload = record.payload as Record<string, unknown> | undefined\r\n if (!payload || payload.kind !== 'agent') continue\r\n return {\r\n ...(typeof payload.agentId === 'string' ? { agentId: payload.agentId } : {}),\r\n ...(typeof payload.createdAt === 'number' ? { createdAt: payload.createdAt } : {}),\r\n }\r\n }\r\n return undefined\r\n}\r\n\r\nfunction readDurableAgentMeta(events: readonly SessionEvent[]): AgentSessionMeta | undefined {\r\n for (let index = events.length - 1; index >= 0; index -= 1) {\r\n const event = events[index]\r\n if (event?.type !== 'meta') continue\r\n const payload = event.payload as Record<string, unknown>\r\n if (payload.kind !== 'agent') continue\r\n const meta: AgentSessionMeta = {\r\n agentId: typeof payload.agentId === 'string' ? payload.agentId : '',\r\n }\r\n if (payload.agentType === 'general' || payload.agentType === 'coding') {\r\n meta.agentType = payload.agentType\r\n }\r\n if (payload.mode === 'auto' || payload.mode === 'plan' || payload.mode === 'execute') {\r\n meta.mode = payload.mode\r\n }\r\n if (typeof payload.title === 'string') meta.title = payload.title\r\n if (typeof payload.owner === 'string') meta.owner = payload.owner\r\n if (typeof payload.parentSessionId === 'string') {\r\n meta.parentSessionId = payload.parentSessionId\r\n }\r\n if (typeof payload.forkedAtMessageId === 'string') {\r\n meta.forkedAtMessageId = payload.forkedAtMessageId\r\n }\r\n if (typeof payload.createdAt === 'number') meta.createdAt = payload.createdAt\r\n return meta\r\n }\r\n return undefined\r\n}\r\n\r\nexport const agents = {\r\n name: 'agents',\r\n inject: ['tools'],\r\n apply: (ctx: Context) => {\r\n const registry = new AgentRegistry(ctx)\r\n ctx.provide('agents', registry)\r\n registry.setFactory({\r\n create: (options) => buildHandle(ctx, options),\r\n resume: (options) => buildHandle(ctx, options, true),\r\n })\r\n return () => {\r\n for (const agent of registry.list()) {\r\n void agent.dispose()\r\n }\r\n }\r\n },\r\n} satisfies Plugin\r\n", "/* eslint-disable-next-line @typescript-eslint/no-explicit-any */\nexport type Any = any\nexport type AnyFunction = (...args: Any[]) => Any\nexport type Dict<T = Any, K extends PropertyKey = string> = Record<K, T>\n\nexport class DisposableList<T extends WeakKey> {\n private sn = 0\n private map = new Map<number, T>()\n private weak = new WeakMap<T, number>()\n\n get length() {\n return this.map.size\n }\n\n push(value: T) {\n const sn = ++this.sn\n this.map.set(sn, value)\n this.weak.set(value, sn)\n return () => this.map.delete(sn)\n }\n\n unshift(value: T) {\n const sn = ++this.sn\n const entries = [...this.map.entries()]\n this.map.clear()\n this.map.set(sn, value)\n this.weak.set(value, sn)\n for (const [oldSn, oldValue] of entries) {\n this.map.set(oldSn, oldValue)\n }\n return () => this.map.delete(sn)\n }\n\n delete(value: T) {\n const sn = this.weak.get(value)\n if (!sn) return false\n return this.map.delete(sn)\n }\n\n clear() {\n const values = [...this.map.values()]\n this.map.clear()\n return values.reverse()\n }\n\n [Symbol.iterator]() {\n return this.map.values()\n }\n\n [Symbol.for('nodejs.util.inspect.custom')]() {\n return [...this]\n }\n}\n\nexport interface Tracker {\n associate?: string\n property?: string\n noShadow?: boolean\n}\n\nexport const symbols = {\n shadow: Symbol.for('tnega.shadow'),\n caller: Symbol.for('tnega.caller'),\n receiver: Symbol.for('tnega.receiver'),\n original: Symbol.for('tnega.original'),\n metadata: Symbol.for('tnega.metadata'),\n initHooks: Symbol.for('tnega.initHooks'),\n checkProto: Symbol.for('tnega.checkProto'),\n effect: Symbol.for('tnega.effect'),\n filter: Symbol.for('tnega.filter'),\n isolate: Symbol.for('tnega.isolate'),\n intercept: Symbol.for('tnega.intercept'),\n init: Symbol.for('tnega.init'),\n check: Symbol.for('tnega.check'),\n config: Symbol.for('tnega.config'),\n invoke: Symbol.for('tnega.invoke'),\n extend: Symbol.for('tnega.extend'),\n tracker: Symbol.for('tnega.tracker'),\n resolveConfig: Symbol.for('tnega.resolveConfig'),\n} as const\n\nconst GeneratorFunction = function* () {}.constructor\nconst AsyncGeneratorFunction = async function* () {}.constructor\n\nexport function isConstructor(func: Any): func is new (...args: Any[]) => Any {\n if (typeof func !== 'function') return false\n if (func instanceof GeneratorFunction) return false\n if (AsyncGeneratorFunction !== Function && func instanceof AsyncGeneratorFunction) return false\n return /^class\\s/.test(Function.prototype.toString.call(func))\n}\n\nexport function isObject(value: Any): value is object {\n return !!value && (typeof value === 'object' || typeof value === 'function')\n}\n\nexport function isNullable(value: Any) {\n return value == null\n}\n\nexport function joinPrototype(proto1: object, proto2: object): object {\n if (proto1 === Object.prototype) return proto2\n const result: object = Object.create(joinPrototype(Object.getPrototypeOf(proto1), proto2))\n for (const key of Reflect.ownKeys(proto1)) {\n Object.defineProperty(result, key, Reflect.getOwnPropertyDescriptor(proto1, key)!)\n }\n return result\n}\n\nexport function getPropertyDescriptor(target: Any, prop: string | symbol) {\n let proto = target\n while (proto) {\n const desc = Reflect.getOwnPropertyDescriptor(proto, prop)\n if (desc) return desc\n proto = Object.getPrototypeOf(proto)\n }\n}\n\nexport function getTraceable<T>(ctx: Any, value: T): T {\n if (!isObject(value)) return value\n if (Object.hasOwn(value, symbols.shadow)) {\n return Object.getPrototypeOf(value)\n }\n const tracker = (value as Any)[symbols.tracker]\n if (!tracker) return value\n return createTraceable(ctx, value, tracker)\n}\n\nexport function withProps(target: Any, props?: Any) {\n if (!props) return target\n return new Proxy(target, {\n get: (target, prop, receiver) => {\n if (prop in props && prop !== 'constructor') return Reflect.get(props, prop, receiver)\n return Reflect.get(target, prop, receiver)\n },\n set: (target, prop, value, receiver) => {\n if (prop in props && prop !== 'constructor') return Reflect.set(props, prop, value, receiver)\n return Reflect.set(target, prop, value, receiver)\n },\n })\n}\n\nfunction withProp(target: Any, prop: string | symbol, value: Any) {\n return withProps(target, Object.defineProperty(Object.create(null), prop, {\n value,\n writable: false,\n }))\n}\n\nfunction createShadow(ctx: Any, target: Any, property: string | undefined, receiver: Any) {\n if (!property) return receiver\n const origin = getPropertyDescriptor(target, property)?.value\n if (!origin) return receiver\n return withProp(receiver, property, ctx.extend({ [symbols.shadow]: origin }))\n}\n\nfunction createShadowMethod(ctx: Any, value: Any, outer: Any, shadow: Any) {\n const proxy = new Proxy(value, {\n apply: (target, thisArg, args) => {\n if (thisArg === outer) thisArg = shadow\n return getTraceable(ctx, Reflect.apply(target, thisArg, args))\n },\n })\n return proxy\n}\n\nfunction createTraceable(ctx: Any, value: Any, tracker: Tracker) {\n const caller = ctx[symbols.shadow] ?? ctx\n if (ctx[symbols.shadow]) {\n ctx = Object.getPrototypeOf(ctx)\n }\n const proxy = new Proxy(value, {\n get: (target, prop, receiver) => {\n if (prop === symbols.original) return target\n if (prop === symbols.caller) return caller\n if (prop === tracker.property) return ctx\n if (typeof prop === 'symbol') {\n return Reflect.get(target, prop, receiver)\n }\n if (tracker.associate && ctx.reflect.props[`${tracker.associate}.${prop}`]) {\n return Reflect.get(ctx, `${tracker.associate}.${prop}`, withProp(ctx, symbols.receiver, receiver))\n }\n let shadow: Any\n let innerValue: Any\n const desc = getPropertyDescriptor(target, prop)\n if (desc?.value !== undefined) {\n innerValue = desc.value\n } else {\n shadow = createShadow(ctx, target, tracker.property, receiver)\n innerValue = Reflect.get(target, prop, shadow)\n }\n const innerTracker = innerValue?.[symbols.tracker]\n if (innerTracker) {\n return createTraceable(ctx, innerValue, innerTracker)\n } else if (!tracker.noShadow && typeof innerValue === 'function') {\n shadow ??= createShadow(ctx, target, tracker.property, receiver)\n return createShadowMethod(ctx, innerValue, receiver, shadow)\n } else {\n return innerValue\n }\n },\n set: (target, prop, value, receiver) => {\n if (prop === symbols.original || prop === symbols.caller || prop === tracker.property) return false\n if (typeof prop === 'symbol') {\n return Reflect.set(target, prop, value, receiver)\n }\n if (tracker.associate && ctx.reflect.props[`${tracker.associate}.${prop}`]) {\n return Reflect.set(ctx, `${tracker.associate}.${prop}`, value, withProp(ctx, symbols.receiver, receiver))\n }\n const shadow = createShadow(ctx, target, tracker.property, receiver)\n return Reflect.set(target, prop, value, shadow)\n },\n apply: (target, thisArg, args) => {\n const receiver = tracker.noShadow\n ? proxy\n : createShadow(ctx, target, tracker.property, proxy)\n return applyTraceable(receiver, target, thisArg, args)\n },\n })\n return proxy\n}\n\nfunction applyTraceable(proxy: Any, value: Any, thisArg: Any, args: Any[]) {\n if (!value[symbols.invoke]) return Reflect.apply(value, thisArg, args)\n return value[symbols.invoke].apply(proxy, args)\n}\n\nexport function createCallable(name: string, proto: object, tracker: Tracker) {\n const self: Any = function (this: Any, ...args: Any[]) {\n const proxy = createTraceable(self.ctx, self, tracker)\n return Reflect.apply(proxy, this, args)\n }\n Object.defineProperty(self, 'name', { value: name, configurable: true, writable: true })\n return Object.setPrototypeOf(self, proto)\n}\n\ninterface StackInfo {\n offset: number\n error: Error\n}\n\nfunction handleError(info: StackInfo, reason: Any, getOuterStack: () => string[]): never {\n const innerLines = info.error.stack!.split('\\n')\n if (typeof reason?.stack !== 'string') {\n const outerError = new Error(reason)\n const lines = outerError.stack!.split('\\n')\n lines.splice(1, Infinity, ...getOuterStack())\n outerError.stack = lines.join('\\n')\n throw outerError\n }\n const lines: string[] = reason.stack.split('\\n')\n const index = lines.indexOf(innerLines[2]!)\n if (index === -1) throw reason\n lines.splice(index - info.offset, Infinity, ...getOuterStack())\n reason.stack = lines.join('\\n')\n throw reason\n}\n\nexport function composeError<T>(callback: (info: StackInfo) => T, getOuterStack = buildOuterStack()): T {\n const info: StackInfo = { offset: 1, error: new Error() }\n try {\n const result: Any = callback(info)\n if (isObject(result) && 'then' in result) {\n return (result as Any).then(undefined, (reason: Any) => handleError(info, reason, getOuterStack)) as T\n }\n return result\n } catch (reason: Any) {\n handleError(info, reason, getOuterStack)\n }\n}\n\nexport function buildOuterStack(offset = 0) {\n const outerError = new Error()\n return () => outerError.stack!.split('\\n').slice(3 + offset)\n}\n", "import { Context } from './context.js'\r\nimport { DisposableList, symbols, type Any, type AnyFunction } from './utils.js'\r\n\r\ndeclare module './context.js' {\r\n interface Context {\r\n on(name: string, listener: AnyFunction, options?: boolean | EventOptions): () => Any\r\n once(name: string, listener: AnyFunction, options?: boolean | EventOptions): () => Any\r\n emit(name: string, ...args: Any[]): void\r\n emit(thisArg: object, name: string, ...args: Any[]): void\r\n parallel(name: string, ...args: Any[]): Promise<void>\r\n parallel(thisArg: object, name: string, ...args: Any[]): Promise<void>\r\n serial(name: string, ...args: Any[]): Promise<void>\r\n serial(thisArg: object, name: string, ...args: Any[]): Promise<void>\r\n bail(name: string, ...args: Any[]): Any\r\n bail(thisArg: object, name: string, ...args: Any[]): Any\r\n waterfall(name: string, ...args: Any[]): Any\r\n waterfall(thisArg: object, name: string, ...args: Any[]): Any\r\n waterfallAsync(name: string, ...args: Any[]): Promise<Any>\r\n waterfallAsync(thisArg: object, name: string, ...args: Any[]): Promise<Any>\r\n }\r\n}\r\n\r\nexport function isBailed(value: Any) {\r\n return value !== null && value !== false && value !== undefined\r\n}\r\n\r\nexport type DispatchMode = 'emit' | 'parallel' | 'serial' | 'bail' | 'waterfall' | 'waterfallAsync'\r\n\r\nexport interface EventOptions {\r\n prepend?: boolean\r\n global?: boolean\r\n}\r\n\r\nexport interface Hook extends EventOptions {\r\n ctx: Context\r\n callback: AnyFunction\r\n}\r\n\r\nexport class EventsService {\r\n _hooks: Record<string, Hook[]> = Object.create(null)\r\n\r\n constructor(private ctx: Context) {\r\n Object.defineProperty(this, symbols.tracker, {\r\n value: { property: 'ctx', noShadow: true },\r\n })\r\n\r\n this.on('internal/listener', function (this: Context, name: string, listener: AnyFunction, options: EventOptions) {\r\n if (name === 'internal/update' && !options.global) {\r\n const hooks = (this.fiber._hooks['internal/update'] ??= new DisposableList<AnyFunction>())\r\n const method = options.prepend ? 'unshift' : 'push'\r\n return hooks[method](listener)\r\n }\r\n })\r\n\r\n this.on('internal/update', function (this: Context, config: Any, noSave: boolean, next: AnyFunction) {\r\n const cbs = [...(this.fiber._hooks['internal/update'] ?? [])]\r\n const _next = () => {\r\n const cb = cbs.shift() ?? next\r\n return cb.call(this, config, noSave, _next)\r\n }\r\n return _next()\r\n }, { global: true, prepend: true })\r\n }\r\n\r\n private _resolve(type: string, args: Any[]) {\r\n const thisArg = typeof args[0] === 'object' || typeof args[0] === 'function' ? args.shift() : null\r\n const name: string = args.shift()\r\n if (!name.startsWith('internal/') && this._hooks['internal/dispatch']?.length) {\r\n this.emit('internal/dispatch', type, name, args, thisArg)\r\n }\r\n const filter = thisArg?.[Context.filter]\r\n return [thisArg, (this._hooks[name] || [])\r\n .filter(hook => hook.global || !filter || filter.call(thisArg, hook.ctx))\r\n .map(hook => hook.callback)] as const\r\n }\r\n\r\n dispatch(type: string, args: Any[]) {\r\n const [thisArg, callbacks] = this._resolve(type, args)\r\n return callbacks.map(callback => callback.bind(thisArg))\r\n }\r\n\r\n async parallel(...args: Any[]) {\r\n const [thisArg, callbacks] = this._resolve('parallel', args)\r\n const results = await Promise.allSettled(callbacks.map(async callback => Reflect.apply(callback, thisArg, args)))\r\n const errors = results\r\n .filter((result): result is PromiseRejectedResult => result.status === 'rejected')\r\n .map(result => result.reason)\r\n if (errors.length) throw new AggregateError(errors)\r\n }\r\n\r\n emit(...args: Any[]) {\r\n const [thisArg, callbacks] = this._resolve('emit', args)\r\n for (const callback of callbacks) Reflect.apply(callback, thisArg, args)\r\n }\r\n\r\n async serial(...args: Any[]) {\r\n const [thisArg, callbacks] = this._resolve('serial', args)\r\n for (const callback of callbacks) {\r\n const result = await Reflect.apply(callback, thisArg, args)\r\n if (isBailed(result)) return result\r\n }\r\n }\r\n\r\n bail(...args: Any[]) {\r\n const [thisArg, callbacks] = this._resolve('bail', args)\r\n for (const callback of callbacks) {\r\n const result = Reflect.apply(callback, thisArg, args)\r\n if (isBailed(result)) return result\r\n }\r\n }\r\n\r\n waterfall(...args: Any[]) {\r\n const [thisArg, callbacks] = this._resolve('waterfall', args)\r\n const inner = args.pop()\r\n const next = () => {\r\n const callback = callbacks.shift()\r\n return callback ? Reflect.apply(callback, thisArg, args) : inner(...args)\r\n }\r\n args.push(next)\r\n return next()\r\n }\r\n\r\n async waterfallAsync(...args: Any[]) {\r\n const [thisArg, callbacks] = this._resolve('waterfallAsync', args)\r\n const inner = args.pop()\r\n const next = async () => {\r\n const callback = callbacks.shift()\r\n return callback\r\n ? await Reflect.apply(callback, thisArg, args)\r\n : inner(...args)\r\n }\r\n args.push(next)\r\n return next()\r\n }\r\n\r\n register(label: string, hooks: Hook[], callback: AnyFunction, options: EventOptions): Any {\r\n const method = options.prepend ? 'unshift' : 'push'\r\n return this.ctx.fiber.effect(() => {\r\n hooks[method]({ ctx: this.ctx, callback, ...options })\r\n return () => this.unregister(hooks, callback)\r\n }, label)\r\n }\r\n\r\n unregister(hooks: Hook[], callback: AnyFunction) {\r\n const index = hooks.findIndex(hook => hook.callback === callback)\r\n if (index >= 0) {\r\n hooks.splice(index, 1)\r\n return true\r\n }\r\n }\r\n\r\n on(name: string, listener: AnyFunction, options: boolean | EventOptions = {}): Any {\r\n if (typeof options !== 'object') {\r\n options = { prepend: options }\r\n }\r\n this.ctx.fiber.assertActive()\r\n listener = this.ctx.reflect.bind(listener)\r\n const result = this.bail(this.ctx, 'internal/listener', name, listener, options)\r\n if (result) return result\r\n\r\n const hooks = this._hooks[name] ??= []\r\n return this.register(`ctx.on(${JSON.stringify(name)})`, hooks, listener, options)\r\n }\r\n\r\n once(name: string, listener: AnyFunction, options: boolean | EventOptions = {}) {\r\n const dispose = this.on(name, function (this: Any, ...args: Any[]) {\r\n dispose()\r\n return listener.apply(this, args)\r\n }, options)\r\n return dispose\r\n }\r\n}\r\n\r\nexport interface Events {\r\n 'internal/plugin'(this: Any): void\r\n 'internal/status'(this: Any, oldValue: Any): void\r\n 'internal/service'(this: Context, name: string, value: Any): void\r\n 'internal/update'(this: Any, config: Any, noSave: boolean, next: AnyFunction): void\r\n 'internal/get'(this: Context, name: string, error: Error, next: AnyFunction): Any\r\n 'internal/set'(this: Context, name: string, value: Any, error: Error, next: AnyFunction): boolean\r\n 'internal/listener'(this: Context, name: string, listener: AnyFunction, options: EventOptions): Any\r\n 'internal/dispatch'(mode: DispatchMode, name: string, args: Any[], thisArg: Any): void\r\n}\r\n", "import type { Context } from './context.js'\nimport type { PluginRuntime } from './registry.js'\nimport type { Impl } from './reflect.js'\nimport {\n buildOuterStack,\n composeError,\n DisposableList,\n getTraceable,\n isConstructor,\n isNullable,\n isObject,\n symbols,\n type Any,\n type AnyFunction,\n type Dict,\n} from './utils.js'\n\ndeclare module './context.js' {\n interface Context extends Pick<Fiber, 'effect'> {\n fiber: Fiber\n }\n}\n\nconst INACTIVE = '__INACTIVE__'\n\nexport class ValidationError extends TypeError {\n override name = 'ValidationError'\n\n constructor(issues: readonly Any[]) {\n super('invalid config:\\n' + issues.map(issue => {\n if (issue.path) {\n return ` - ${issue.message} (at ${issue.path.join('.')})`\n }\n return ` - ${issue.message}`\n }).join('\\n'))\n }\n}\n\nexport function resolveConfig(runtime: PluginRuntime, config: Any) {\n if (!runtime.Config) return config\n const schema = runtime.Config\n if (typeof schema === 'function') return schema(config)\n const validate = schema?.['~standard']?.validate\n if (typeof validate === 'function') {\n const result = validate(config)\n if ('then' in result) {\n throw new TypeError('Async config validation is not supported')\n }\n if (result.issues) {\n throw new ValidationError(result.issues)\n }\n return result.value\n }\n return config\n}\n\nexport type Disposable = () => Any\nexport type SyncEffect = Disposable | Iterable<Disposable> | null | undefined\nexport type AsyncEffect = Promise<Disposable> | AsyncIterable<Disposable> | null | undefined\nexport type Effect = SyncEffect | AsyncEffect\n\ninterface AsyncDisposable extends PromiseLike<() => Promise<void>> {\n (): Any\n}\n\nexport interface EffectMeta {\n label: string\n children: EffectMeta[]\n}\n\ninterface EffectRunner<T> {\n epoch: T\n execute: () => Any\n collect: (dispose: Disposable) => void\n getOuterStack: () => string[]\n}\n\nexport const enum FiberState {\n PENDING,\n LOADING,\n ACTIVE,\n FAILED,\n DISPOSED,\n UNLOADING,\n}\n\nexport const CordisErrorCode = {\n INACTIVE_EFFECT: 'cannot create effect on inactive context',\n} as const\n\nexport type CordisErrorCode = keyof typeof CordisErrorCode\n\nexport class CordisError extends Error {\n constructor(public code: CordisErrorCode, message?: string) {\n super(message ?? CordisErrorCode[code])\n }\n}\n\nexport class Fiber {\n public uid: number | null\n public readonly ctx: Context\n public config: Any\n public state = FiberState.PENDING\n public readonly dispose: () => Promise<void>\n public store: Dict<Impl> | undefined\n public inertia: Promise<void> | undefined\n\n public readonly _hooks: Dict<DisposableList<AnyFunction>> = Object.create(null)\n public readonly _disposables = new DisposableList<Disposable>()\n\n protected context: Context\n\n private _error: Any = undefined\n private _runner: EffectRunner<string>\n private _store: Dict<Impl> = Object.create(null)\n private _restarting: Promise<void> | undefined\n\n constructor(\n public parent: Context,\n config: Any,\n public inject: Dict<Any>,\n public runtime: PluginRuntime | null,\n getOuterStack: () => string[],\n ) {\n const collect = (dispose: Disposable) => {\n this._disposables.push(dispose)\n }\n\n if (runtime) {\n this.uid = parent.registry.counter\n this.ctx = this.context = parent.extend({ fiber: this })\n\n const injectEntries = Object.entries(this.inject)\n if (injectEntries.length) {\n this.ctx[symbols.intercept] = Object.create(parent[symbols.intercept]!)\n for (const [name, config] of injectEntries) {\n if (isNullable(config)) continue\n this.ctx[symbols.intercept]![name] = config\n }\n }\n\n this._runner = {\n epoch: INACTIVE,\n getOuterStack,\n execute: () => {\n if (isConstructor(runtime.callback)) {\n const instance = new runtime.callback(this.ctx, this.config)\n for (const hook of instance?.[symbols.initHooks] ?? []) {\n hook()\n }\n return instance?.[symbols.init]?.()\n } else {\n return runtime.callback(this.ctx, this.config)\n }\n },\n collect,\n }\n\n this.context.emit(this, 'internal/plugin')\n\n for (const name of Object.keys(this.inject)) {\n this._checkImpl(name)\n }\n\n this.dispose = parent.fiber.effect(() => {\n const remove = runtime.fibers.push(this)\n try {\n this.config = resolveConfig(runtime, config)\n this._refresh()\n } catch (error) {\n this.ctx.logger.error(error)\n this._error = error\n }\n return async () => {\n this.uid = null\n this.context.emit(this, 'internal/plugin')\n if (this.ctx.registry.has(runtime.callback)) {\n remove()\n if (!runtime.fibers.length) {\n this.ctx.registry.delete(runtime.callback)\n }\n }\n this._setEpoch(INACTIVE)\n while (this.inertia) {\n await this.inertia\n }\n }\n }, 'ctx.plugin()')\n } else {\n this.uid = 0\n this.ctx = this.context = parent\n this.state = FiberState.ACTIVE\n this.store = Object.create(null)\n this._runner = {\n epoch: '',\n getOuterStack,\n execute: () => {},\n collect,\n }\n this.dispose = () => this.restart()\n }\n }\n\n get name() {\n if (this.runtime?.name) return this.runtime.name\n let fiber = this.parent.fiber\n while (fiber !== fiber.parent.fiber) {\n if (fiber.runtime?.name) return fiber.runtime.name\n fiber = fiber.parent.fiber\n }\n return 'root'\n }\n\n assertActive() {\n if (this.uid !== null) return\n throw new CordisError('INACTIVE_EFFECT')\n }\n\n private _execute<T>(runner: EffectRunner<T>) {\n const oldEpoch = runner.epoch\n return composeError((info: Any) => {\n const safeCollect = (dispose: Any) => {\n if (typeof dispose === 'function') {\n runner.collect(dispose)\n } else if (!isNullable(dispose)) {\n throw new TypeError('Invalid effect')\n }\n }\n const effect: Effect = runner.execute.call(this)\n if (typeof effect === 'function') {\n return runner.collect(effect)\n } else if (isNullable(effect)) {\n return\n } else if (!isObject(effect)) {\n throw new TypeError('Invalid effect')\n } else if ('then' in effect) {\n return (effect as Any).then(safeCollect)\n } else if (Symbol.iterator in effect) {\n info.error = new Error()\n const iter = (effect as Any)[Symbol.iterator]()\n while (true) {\n const result = iter.next()\n safeCollect(result.value)\n if (result.done) return\n }\n } else if (Symbol.asyncIterator in effect) {\n const iter = (effect as Any)[Symbol.asyncIterator]()\n return (async () => {\n await Promise.resolve()\n info.error = new Error()\n while (true) {\n if (runner.epoch !== oldEpoch) return\n const result = await iter.next()\n safeCollect(result.value)\n if (result.done) return\n }\n })()\n } else {\n throw new TypeError('Invalid effect')\n }\n }, runner.getOuterStack)\n }\n\n effect(execute: () => SyncEffect, label?: string): Disposable\n effect(execute: () => Effect, label?: string): AsyncDisposable\n effect(execute: () => Effect, label = 'anonymous'): Any {\n this.assertActive()\n\n const disposables: Disposable[] = []\n const dispose = () => {\n let task: Any\n for (const dispose of disposables.splice(0).reverse()) {\n if (task) {\n task = task.then(dispose)\n } else {\n const result = dispose()\n if (isObject(result) && 'then' in result) {\n task = result\n }\n }\n }\n return task\n }\n\n const meta: EffectMeta = { label, children: [] }\n const runner: EffectRunner<boolean> = {\n execute,\n epoch: true,\n collect: (dispose) => {\n disposables.push(dispose)\n this._disposables.delete(dispose)\n if ((dispose as Any)[symbols.effect]) {\n meta.children.push((dispose as Any)[symbols.effect])\n }\n },\n getOuterStack: buildOuterStack(),\n }\n\n let task: Any\n try {\n task = this._execute(runner)\n } catch (reason) {\n dispose()\n throw reason\n }\n\n task?.catch(dispose).catch((error: Any) => this.ctx.logger.error(error))\n\n const wrapper = Object.defineProperty(() => {\n if (!runner.epoch) return\n runner.epoch = false\n return task ? task.then(dispose) : dispose()\n }, symbols.effect, { value: meta }) as AsyncDisposable\n\n const disposeAsync = () => {\n if (!runner.epoch) return\n runner.epoch = false\n return dispose()\n }\n wrapper.then = async (onFulfilled, onRejected) => {\n return Promise.resolve(task)\n .then(() => disposeAsync)\n .then(onFulfilled, onRejected)\n }\n disposables.push(this._disposables.push(wrapper))\n return wrapper\n }\n\n getEffects() {\n return [...this._disposables]\n .map<EffectMeta>(dispose => (dispose as Any)[symbols.effect])\n .filter(Boolean)\n }\n\n private _getState() {\n if (this.uid === null) return FiberState.DISPOSED\n if (this._error) return FiberState.FAILED\n if (this._runner.epoch !== INACTIVE) return FiberState.ACTIVE\n return FiberState.PENDING\n }\n\n private _updateState(callback?: () => void | FiberState) {\n const oldState = this.state\n this.state = callback?.() ?? this._getState()\n if (oldState === this.state) return\n this.context.emit(this, 'internal/status', oldState)\n\n if (oldState !== FiberState.ACTIVE && this.state !== FiberState.ACTIVE) return\n for (const key of Reflect.ownKeys(this.ctx.reflect.store)) {\n const impl = this.ctx.reflect.store[key as symbol]\n if (!impl) continue\n if (impl.fiber !== this) continue\n this.ctx.reflect.notify([impl.name])\n }\n }\n\n _checkImpl(name: string) {\n const impl = this.ctx.reflect._getImpl(name, true)\n if (!impl) return delete this._store[name]\n try {\n if (impl.check && !impl.check.call(getTraceable(this.ctx, impl.value))) {\n return delete this._store[name]\n }\n } catch (error) {\n impl.fiber.ctx.logger.error(error)\n return delete this._store[name]\n }\n this._store[name] = impl\n }\n\n _refresh() {\n let epoch: string = ''\n for (const name of Object.keys(this.inject)) {\n const impl = this._store[name]\n if (!impl) {\n epoch = INACTIVE\n break\n }\n epoch += ':' + impl.fiber.uid\n }\n this._setEpoch(epoch)\n }\n\n private _setEpoch(epoch: string) {\n const oldEpoch = this._runner.epoch\n if (epoch === oldEpoch) return\n this._runner.epoch = epoch\n if (this.inertia) return\n this._updateState(() => {\n if (epoch !== INACTIVE && oldEpoch === INACTIVE) {\n this.inertia = this._reload()\n return FiberState.LOADING\n } else {\n this.inertia = this._unload()\n return FiberState.UNLOADING\n }\n })\n }\n\n private async _reload() {\n this.store = { ...this._store }\n const oldEpoch = this._runner.epoch\n try {\n await Promise.resolve()\n await this._execute(this._runner)\n } catch (reason) {\n this.ctx.logger.error(reason)\n this._error = reason\n this._runner.epoch = INACTIVE\n }\n this._updateState(() => {\n if (this._runner.epoch === oldEpoch) {\n this.inertia = undefined\n } else {\n this.inertia = this._unload()\n return FiberState.UNLOADING\n }\n })\n }\n\n private async _unload() {\n await Promise.all(this._disposables.clear().map(async (dispose: Disposable) => {\n try {\n await composeError(async (info: Any) => {\n await Promise.resolve()\n info.error = new Error()\n await dispose()\n }, this._runner.getOuterStack)\n } catch (reason) {\n this.ctx.logger.error(reason)\n }\n }))\n this.store = undefined\n this._updateState(() => {\n if (this._runner.epoch === INACTIVE) {\n this.inertia = undefined\n } else {\n this.inertia = this._reload()\n return FiberState.LOADING\n }\n })\n }\n\n async await() {\n while (this.inertia || this._restarting) {\n await Promise.all([this.inertia, this._restarting]\n .filter((task): task is Promise<void> => !!task))\n }\n if (this._error) throw this._error\n return this\n }\n\n async restart() {\n const fiber = this.ctx.fiber\n fiber.assertActive()\n if (fiber._restarting) return fiber._restarting.then(() => undefined)\n let resolve!: () => void\n const restarting = new Promise<void>((resolvePromise) => {\n resolve = resolvePromise\n })\n fiber._restarting = restarting\n try {\n await this._runRestart(fiber)\n } finally {\n fiber._restarting = undefined\n resolve()\n }\n }\n\n private async _runRestart(fiber: Fiber) {\n if (fiber.inertia) {\n fiber._setEpoch(INACTIVE)\n while (fiber.inertia) await fiber.inertia\n }\n fiber._setEpoch(INACTIVE)\n fiber._refresh()\n while (fiber.inertia) await fiber.inertia\n }\n\n update(config: Any, noSave = false) {\n const fiber = this.ctx.fiber\n fiber.assertActive()\n config = resolveConfig(fiber.runtime!, config)\n fiber.context.waterfall(fiber.context, 'internal/update', config, noSave, () => {\n fiber.config = config\n fiber._error = undefined\n return fiber.restart()\n })\n }\n}\n", "/* eslint-disable @typescript-eslint/no-unsafe-declaration-merging */\nimport type { Context } from './context.js'\nimport { createCallable, joinPrototype, symbols, type Any } from './utils.js'\n\nexport type LoggerType = 'error' | 'info' | 'warn' | 'debug'\nexport type LoggerMethod = (format: Any, ...param: Any[]) => void\n\nexport interface Message {\n sn: number\n ts: number\n name: string\n type: LoggerType\n args: Any[]\n}\n\nexport interface Exporter {\n level?: number\n export(message: Message): void\n}\n\nexport interface LoggerOptions {\n name: string\n level?: number\n}\n\nexport interface LoggerService {\n (name?: string): Logger\n}\n\nexport class Logger {\n public name: string\n public level: number | undefined\n error!: LoggerMethod\n info!: LoggerMethod\n warn!: LoggerMethod\n debug!: LoggerMethod\n\n constructor(options: LoggerOptions, private service: LoggerService) {\n this.name = options.name\n this.level = options.level\n this.error = this._method('error')\n this.info = this._method('info')\n this.warn = this._method('warn')\n this.debug = this._method('debug')\n }\n\n private _method(type: LoggerType): LoggerMethod {\n return (...args: Any[]) => this.service._log({ name: this.name, type, args })\n }\n}\n\nexport class LoggerService {\n buffer: Message[] = []\n ctx!: Context\n _snMessage = 0\n _snExporter = 0\n exporters = new Map<number, Exporter>()\n\n constructor(ctx: Context) {\n const tracker = {\n property: 'ctx',\n noShadow: true,\n }\n const self = createCallable('logger', joinPrototype(Object.getPrototypeOf(this), Function.prototype), tracker) as unknown as LoggerService\n Object.assign(self, this)\n self.ctx = ctx\n Object.defineProperty(self, symbols.tracker, { value: tracker })\n self.exporter({\n export: (message) => {\n self.buffer.push(message)\n },\n })\n ctx.reflect.provide('logger', self)\n return self\n }\n\n exporter(exporter: Exporter) {\n return this.ctx.fiber.effect(() => {\n const id = ++this._snExporter\n this.exporters.set(id, exporter)\n return () => this.exporters.delete(id)\n }, 'ctx.logger.exporter()')\n }\n\n [symbols.invoke](name?: string): Logger {\n const caller = (this as Any)[symbols.caller] as Context | undefined\n const fiber = (caller ?? this.ctx).fiber\n return new Logger({\n name: name ?? fiber.name,\n }, this)\n }\n\n _log(message: Omit<Message, 'sn' | 'ts'>) {\n const sn = ++this._snMessage\n const ts = Date.now()\n for (const exporter of this.exporters.values()) {\n if (exporter.level != null && exporter.level < 0) continue\n exporter.export({ sn, ts, ...message })\n }\n }\n\n error(...args: Any[]) {\n return (this as Any)().error(...args)\n }\n\n info(...args: Any[]) {\n return (this as Any)().info(...args)\n }\n\n warn(...args: Any[]) {\n return (this as Any)().warn(...args)\n }\n\n debug(...args: Any[]) {\n return (this as Any)().debug(...args)\n }\n}\n", "import type { Context } from './context.js'\r\nimport { FiberState } from './fiber.js'\r\nimport { getTraceable, symbols, withProps, type Any, type AnyFunction, type Dict } from './utils.js'\r\n\r\ndeclare module './context.js' {\r\n interface Context {\r\n get(name: string, strict?: boolean): Any\r\n set(name: string, value: Any): void\r\n provide(name: string, value?: Any, check?: () => boolean): () => Any\r\n accessor(name: string, options: Omit<AccessorProperty, 'type'>): () => Any\r\n mixin(source: Any, mixins: string[] | Dict<string>): void\r\n }\r\n}\r\n\r\nfunction enhanceError(error: Error) {\r\n const lines = error.stack!.split('\\n')\r\n lines.splice(0, 2, `Error: ${error.message}`)\r\n error.stack = lines.join('\\n')\r\n return error\r\n}\r\n\r\nconst RESERVED_WORDS = ['prototype', 'then']\r\n\r\nfunction isSpecialProperty(prop: string | symbol) {\r\n return typeof prop === 'symbol'\r\n || RESERVED_WORDS.includes(prop as string)\r\n || parseInt(prop as string).toString() === prop\r\n || (prop as string).startsWith('_')\r\n}\r\n\r\nexport interface ServiceProperty {\r\n type: 'service'\r\n}\r\n\r\nexport interface AccessorProperty {\r\n type: 'accessor'\r\n get: (this: Context, receiver: Any, error: Error) => Any\r\n set?: (this: Context, value: Any, receiver: Any, error: Error) => boolean\r\n}\r\n\r\nexport type ReflectProperty = ServiceProperty | AccessorProperty\r\n\r\nexport interface Impl {\r\n name: string\r\n fiber: Any\r\n value?: Any\r\n check?: () => boolean\r\n}\r\n\r\nexport class ReflectService {\r\n static handler: ProxyHandler<Context> = {\r\n get: (target, prop, ctx: Context) => {\r\n if (isSpecialProperty(prop)) {\r\n return Reflect.get(target, prop, ctx)\r\n }\r\n if (Reflect.has(target, prop)) {\r\n return getTraceable(ctx, Reflect.get(target, prop, ctx))\r\n }\r\n\r\n const error = new Error(`cannot get property \"${String(prop)}\" without inject`)\r\n try {\r\n const def = target.reflect.props[prop as string]\r\n if (def?.type === 'accessor') {\r\n return def.get.call(ctx, ctx[symbols.receiver], error)\r\n }\r\n\r\n if (!ctx.fiber.runtime) return ctx.reflect.get(prop as string, false)\r\n return ctx.events.waterfall(ctx, 'internal/get', prop, error, () => {\r\n const key = target[symbols.isolate]![prop as string]\r\n let fiber = ((ctx[symbols.shadow] as Context) ?? ctx).fiber\r\n while (true) {\r\n const impl = fiber.store?.[prop as string]\r\n if (impl) return getTraceable(ctx, impl.value)\r\n if (prop in fiber.inject) {\r\n error.message = `cannot get required service \"${String(prop)}\" in inactive context`\r\n throw error\r\n }\r\n if (!fiber.runtime) throw error\r\n if (fiber.parent[symbols.isolate]![prop as string] !== key) throw error\r\n fiber = fiber.parent.fiber\r\n }\r\n })\r\n } catch (e: Any) {\r\n throw e === error ? enhanceError(e) : e\r\n }\r\n },\r\n\r\n set: (target, prop, value, ctx: Context) => {\r\n if (isSpecialProperty(prop)) {\r\n return Reflect.set(target, prop, value, ctx)\r\n }\r\n\r\n const error = new Error(`cannot set property \"${String(prop)}\" without provide`)\r\n const def = target.reflect.props[prop as string]\r\n\r\n try {\r\n if (def?.type === 'accessor') {\r\n if (!def.set) return false\r\n return def.set.call(ctx, value, ctx[symbols.receiver], error)\r\n }\r\n\r\n if (!def && !ctx.fiber.runtime) {\r\n return Reflect.set(target, prop, value, ctx)\r\n }\r\n\r\n return ctx.events.waterfall(ctx, 'internal/set', prop, value, error, () => {\r\n if (!def) throw error\r\n return ctx.reflect.set(prop as string, value)\r\n })\r\n } catch (e: Any) {\r\n throw e === error ? enhanceError(e) : e\r\n }\r\n },\r\n\r\n has: (target, prop) => {\r\n if (isSpecialProperty(prop)) {\r\n return Reflect.has(target, prop)\r\n }\r\n if (Reflect.has(target, prop)) return true\r\n return !!target.reflect.props[prop as string]\r\n },\r\n }\r\n\r\n public store: Dict<Impl, symbol> = Object.create(null)\r\n public props: Dict<ReflectProperty> = Object.create(null)\r\n\r\n constructor(public ctx: Context) {\r\n Object.defineProperty(this, symbols.tracker, {\r\n value: { property: 'ctx', noShadow: true },\r\n })\r\n\r\n this.mixin('reflect', ['get', 'set', 'provide', 'accessor', 'mixin'])\r\n this.mixin('fiber', ['runtime', 'effect'])\r\n this.mixin('registry', ['inject', 'plugin'])\r\n this.mixin('events', [\r\n 'on',\r\n 'once',\r\n 'parallel',\r\n 'emit',\r\n 'serial',\r\n 'bail',\r\n 'waterfall',\r\n 'waterfallAsync',\r\n ])\r\n }\r\n\r\n get(name: string, strict = true) {\r\n return getTraceable(this.ctx, this._getImpl(name, strict)?.value)\r\n }\r\n\r\n _getImpl(name: string, strict = true) {\r\n const key = this.ctx[symbols.isolate]![name]\r\n const impl = key && this.store[key as symbol]\r\n if (!impl) return\r\n if (strict && impl.fiber.state !== FiberState.ACTIVE) return\r\n return impl\r\n }\r\n\r\n set(name: string, value: Any) {\r\n const key = this.ctx[symbols.isolate]![name]\r\n const impl = key && this.store[key as symbol]\r\n if (!impl) {\r\n throw new Error(`cannot set property \"${name}\" without provide`)\r\n }\r\n if (impl.fiber !== this.ctx.fiber) {\r\n throw new Error(`cannot set property \"${name}\" in multiple fibers`)\r\n }\r\n impl.value = value\r\n return true\r\n }\r\n\r\n provide(name: string, value?: Any, check?: () => boolean) {\r\n return this.ctx.fiber.effect(() => {\r\n if (!this.props[name]) {\r\n this.props[name] = { type: 'service' }\r\n } else if (this.props[name].type !== 'service') {\r\n throw new Error(`property \"${name}\" is already declared as ${this.props[name].type}`)\r\n }\r\n this.props[name] = { type: 'service' }\r\n\r\n this.ctx.root[symbols.isolate]![name] ??= Symbol(name)\r\n const key = this.ctx[symbols.isolate]![name]\r\n const impl: Impl = {\r\n name,\r\n value,\r\n fiber: this.ctx.fiber,\r\n ...(check ? { check } : {}),\r\n }\r\n if (key && this.store[key]) {\r\n throw new Error(`service \"${name}\" has been registered at <${this.store[key].fiber.name}>`)\r\n }\r\n this.store[key as symbol] = impl\r\n this.ctx.fiber.store![name] = impl\r\n if (this.ctx.fiber.state === FiberState.ACTIVE) {\r\n this.notify([name])\r\n }\r\n return async () => {\r\n delete this.store[key as symbol]\r\n const fibers = this.notify([name])\r\n await Promise.allSettled(fibers.map(fiber => fiber.await()))\r\n delete this.ctx.fiber.store![name]\r\n }\r\n }, `ctx.provide(${JSON.stringify(name)})`)\r\n }\r\n\r\n notify(\r\n names: string[],\r\n filter = (ctx: Context, name: string) => ctx[symbols.isolate]![name] === this.ctx[symbols.isolate]![name],\r\n ) {\r\n const fibers: Any[] = []\r\n for (const runtime of this.ctx.registry.values()) {\r\n for (const fiber of runtime.fibers) {\r\n let hasUpdate = false\r\n for (const name of names) {\r\n if (!(name in fiber.inject)) continue\r\n if (!filter(fiber.ctx, name)) continue\r\n hasUpdate = true\r\n fiber._checkImpl(name)\r\n }\r\n if (!hasUpdate) continue\r\n fiber._refresh()\r\n fibers.push(fiber)\r\n }\r\n }\r\n for (const name of names) {\r\n const self: Any = Object.create(this.ctx)\r\n self[symbols.filter] = (target: Context) => filter(target, name)\r\n this.ctx.events.emit(self, 'internal/service', name, this._getImpl(name, false)?.value)\r\n }\r\n return fibers\r\n }\r\n\r\n accessor(name: string, options: Omit<AccessorProperty, 'type'>) {\r\n return this.ctx.fiber.effect(() => {\r\n if (name in this.props) {\r\n throw new Error(`property \"${name}\" is already declared as ${this.props[name]!.type}`)\r\n }\r\n this.props[name] = { type: 'accessor', ...options }\r\n return () => delete this.props[name]\r\n }, `ctx.accessor(${JSON.stringify(name)})`)\r\n }\r\n\r\n mixin(source: Any, mixins: string[] | Dict<string>) {\r\n return this.ctx.fiber.effect(() => {\r\n const entries: [string, string][] = Array.isArray(mixins)\r\n ? mixins.map(key => [key, key] as [string, string])\r\n : Object.entries(mixins)\r\n const getTarget = (target: Context): Any => target[source]\r\n return entries.map(([key, value]) => {\r\n return this.accessor(value, {\r\n get(receiver) {\r\n const service: Any = getTarget(this)\r\n if (service == null) return service\r\n const mixin = receiver ? withProps(receiver, service) : service\r\n const result = Reflect.get(service, key, mixin)\r\n if (typeof result !== 'function') return result\r\n return result.bind(mixin ?? service)\r\n },\r\n set(value, receiver) {\r\n const service: Any = getTarget(this)\r\n const mixin = receiver ? withProps(receiver, service) : service\r\n return Reflect.set(service, key, value, mixin)\r\n },\r\n })\r\n })\r\n }, `ctx.mixin(${JSON.stringify(source)})`)\r\n }\r\n\r\n trace<T>(value: T) {\r\n return getTraceable(this.ctx, value)\r\n }\r\n\r\n bind<T extends AnyFunction>(callback: T) {\r\n return new Proxy(callback, {\r\n apply: (target, thisArg, args) => {\r\n return Reflect.apply(target, this.trace(thisArg), args.map(arg => this.trace(arg)))\r\n },\r\n construct: (target, args, newTarget) => {\r\n return Reflect.construct(target, args.map(arg => this.trace(arg)), newTarget)\r\n },\r\n })\r\n }\r\n}\r\n", "import type { Context } from './context.js'\nimport { Fiber } from './fiber.js'\nimport { buildOuterStack, DisposableList, symbols, withProps, type Any, type AnyFunction, type Dict } from './utils.js'\n\ndeclare module './context.js' {\n interface Context {\n inject(deps: Inject, callback: FunctionPlugin): Fiber & PromiseLike<Fiber>\n plugin<P extends Plugin>(plugin: P, ...args: Any[]): Fiber & PromiseLike<Fiber>\n }\n}\n\nfunction isApplicable(object: Plugin) {\n return object && typeof object === 'object' && typeof object.apply === 'function'\n}\n\nexport type Inject = string[] | Dict<Any>\nexport type InjectKey = string & keyof Context\n\nexport function Inject(name: string, config?: Any) {\n return function (value: Any, decorator: Any) {\n if (decorator.kind === 'class') {\n if (!Object.hasOwn(value, 'inject')) {\n Object.defineProperty(value, 'inject', {\n value: Object.create(Object.getPrototypeOf(value).inject ?? null),\n })\n Object.defineProperty(value.inject, symbols.checkProto, { value: true })\n }\n value.inject[name] = config\n } else if (decorator.kind === 'method') {\n const inject = (value[symbols.metadata] ??= {}).inject ??= Object.create(null)\n inject[name] = config\n decorator.addInitializer(function (this: Any) {\n const property = this[symbols.tracker]?.property\n ;(this[symbols.initHooks] ??= []).push(() => {\n (this.ctx as Context).inject(inject, (ctx) => {\n return value.call(property ? withProps(this, { [property]: ctx }) : this)\n })\n })\n })\n } else {\n throw new Error('@Inject() can only be used on class or class methods')\n }\n }\n}\n\nexport function resolveInject(inject: Inject | null | undefined, result: Dict = Object.create(null)) {\n if (!inject) return result\n if (Array.isArray(inject)) {\n for (const name of inject) {\n result[name] = null\n }\n } else if (Reflect.has(inject, symbols.checkProto)) {\n Object.assign(result, resolveInject(Object.getPrototypeOf(inject)))\n for (const name of Object.keys(inject)) {\n result[name] = inject[name] ?? null\n }\n } else {\n for (const name of Object.keys(inject)) {\n result[name] = inject[name] ?? null\n }\n }\n return result\n}\n\nexport type Plugin = FunctionPlugin | ConstructorPlugin | ObjectPlugin\n\nexport interface PluginBase {\n name?: string\n Config?: Any\n inject?: Inject\n provide?: string | string[]\n intercept?: Dict<boolean>\n}\n\nexport interface FunctionPlugin extends PluginBase {\n (ctx: Context, config: Any): Any\n}\n\nexport interface ConstructorPlugin extends PluginBase {\n new (ctx: Context, config: Any): Any\n}\n\nexport interface ObjectPlugin extends PluginBase {\n apply(ctx: Context, config: Any): Any\n}\n\nexport interface PluginRuntime {\n name?: string\n fibers: DisposableList<Fiber>\n callback: Any\n Config?: Any\n}\n\nexport class RegistryService {\n private _counter = 0\n private _internal = new Map<AnyFunction, PluginRuntime>()\n\n constructor(public ctx: Context) {\n Object.defineProperty(this, symbols.tracker, {\n value: { property: 'ctx', noShadow: true },\n })\n }\n\n get counter() {\n return ++this._counter\n }\n\n get size() {\n return this._internal.size\n }\n\n resolve(plugin: Plugin): AnyFunction | undefined {\n try {\n if (typeof plugin === 'function') return plugin as AnyFunction\n if (isApplicable(plugin)) return plugin.apply\n } catch {\n // getters on plugin objects may throw during resolution\n }\n }\n\n get(plugin: Plugin) {\n const key = this.resolve(plugin)\n return key && this._internal.get(key)\n }\n\n has(plugin: Plugin) {\n const key = this.resolve(plugin)\n return !!key && this._internal.has(key)\n }\n\n delete(plugin: Plugin) {\n const key = this.resolve(plugin)\n const runtime = key && this._internal.get(key)\n if (!runtime) return\n this._internal.delete(key)\n for (const fiber of [...runtime.fibers]) {\n fiber.dispose()\n }\n return runtime\n }\n\n keys() {\n return this._internal.keys()\n }\n\n values() {\n return this._internal.values()\n }\n\n entries() {\n return this._internal.entries()\n }\n\n forEach(callback: (value: PluginRuntime, key: AnyFunction) => void) {\n return this._internal.forEach(callback)\n }\n\n inject(inject: Inject, callback: FunctionPlugin) {\n const name = callback.name || undefined\n return this.plugin(Object.assign(\n { inject, apply: callback },\n name ? { name } : {},\n ))\n }\n\n plugin(plugin: Plugin, config?: Any, getOuterStack = buildOuterStack()) {\n const callback = this.resolve(plugin)\n if (!callback) throw new Error('invalid plugin, expect function or object with an \"apply\" method, received ' + typeof plugin)\n this.ctx.fiber.assertActive()\n\n let runtime = this._internal.get(callback)\n if (!runtime) {\n let name = plugin.name\n if (name === 'apply') name = undefined\n runtime = {\n callback,\n fibers: new DisposableList(),\n ...(name ? { name } : {}),\n ...(plugin.Config ? { Config: plugin.Config } : {}),\n }\n this._internal.set(callback, runtime)\n }\n\n const fiber = new Fiber(this.ctx, config, resolveInject(plugin.inject), runtime, getOuterStack)\n const wrapped = Object.create(fiber) as Fiber & PromiseLike<Fiber>\n wrapped.then = (onFulfilled: Any, onRejected: Any) => {\n return fiber.await().then(onFulfilled, onRejected)\n }\n return wrapped\n }\n}\n", "/* eslint-disable @typescript-eslint/no-unsafe-declaration-merging */\nimport { EventsService } from './events.js'\nimport { Fiber } from './fiber.js'\nimport { Logger, LoggerService } from './logger.js'\nimport { ReflectService } from './reflect.js'\nimport { RegistryService } from './registry.js'\nimport { getTraceable, symbols, type Any, type Dict } from './utils.js'\n\nexport interface Context {\n [symbols.isolate]: Dict<symbol | undefined>\n [symbols.intercept]: Dict<Any>\n root: this\n baseUrl?: string | undefined\n events: EventsService\n logger: LoggerService & ((name?: string) => Logger)\n reflect: ReflectService\n registry: RegistryService\n}\n\nexport class Context {\n static readonly effect: symbol = symbols.effect\n static readonly filter: symbol = symbols.filter\n static readonly isolate: symbol = symbols.isolate\n static readonly intercept: symbol = symbols.intercept\n static readonly marker = Symbol.for('tnega.is')\n\n static is(value: Any): value is Context {\n return !!value?.[Context.marker]\n }\n\n static {\n (Context.prototype as Any)[Context.marker] = true\n }\n\n constructor() {\n this[symbols.isolate] = Object.create(null)\n this[symbols.intercept] = Object.create(null)\n const self = new Proxy<this>(this, ReflectService.handler)\n this.root = self\n this.baseUrl = undefined\n this.fiber = new Fiber(self, {}, Object.create(null), null, () => [])\n this.reflect = new ReflectService(self)\n this.registry = new RegistryService(self)\n this.events = new EventsService(self)\n this.logger = new LoggerService(self)\n this.fiber._disposables.clear()\n return self\n }\n\n [Symbol.for('nodejs.util.inspect.custom')]() {\n return `Context <${this.fiber.name}>`\n }\n\n extend(meta: Dict = {}): this {\n const shadow = Reflect.getOwnPropertyDescriptor(this, symbols.shadow)?.value\n const self = Object.create(getTraceable(this, this))\n for (const prop of Reflect.ownKeys(meta)) {\n Object.defineProperty(self, prop, Reflect.getOwnPropertyDescriptor(meta, prop)!)\n }\n if (!shadow) return self\n return Object.assign(Object.create(self), { [symbols.shadow]: shadow })\n }\n\n isolate(name: string, label?: symbol) {\n const shadow = Object.create(this[symbols.isolate]!)\n shadow[name] = label ?? Symbol(name)\n return this.extend({ [symbols.isolate]: shadow })\n }\n\n intercept(name: string, config: Any) {\n const intercept = Object.create(this[symbols.intercept]!)\n intercept[name] = config\n return this.extend({ [symbols.intercept]: intercept })\n }\n}\n", "import type { Context } from './context.js'\nimport { createCallable, joinPrototype, symbols, type Any, type Tracker } from './utils.js'\n\nexport abstract class Service<out T = never> {\n static readonly init: symbol = symbols.init\n static readonly check: symbol = symbols.check\n static readonly config: symbol = symbols.config\n static readonly invoke: symbol = symbols.invoke\n static readonly extend: symbol = symbols.extend\n static readonly tracker: symbol = symbols.tracker\n static readonly resolveConfig: symbol = symbols.resolveConfig\n\n declare [symbols.config]: T\n\n public name!: string\n\n constructor(protected ctx: Context, name?: string) {\n name ??= (this.constructor as Any).provide as string\n\n const tracker: Tracker = {\n associate: name,\n property: 'ctx',\n }\n const self: Any = (this as Any)[symbols.invoke]\n ? createCallable(name, joinPrototype(Object.getPrototypeOf(this), Function.prototype), tracker)\n : this\n\n self.ctx = ctx\n self.name = name\n Object.defineProperty(self, symbols.tracker, { value: tracker })\n\n self.ctx.reflect.provide(name, self, (this as Any)[symbols.check])\n return self\n }\n\n protected [symbols.filter](ctx: Context) {\n return ctx[symbols.isolate]![this.name] === this.ctx[symbols.isolate]![this.name]\n }\n\n protected [symbols.extend](props?: Any) {\n let self: Any\n if ((this as Any)[Service.invoke]) {\n self = createCallable(this.name, this, (this as Any)[symbols.tracker])\n } else {\n self = Object.create(this)\n }\n return Object.assign(self, props)\n }\n\n [symbols.resolveConfig](base?: T, head?: T): T {\n let intercept: Any = this.ctx[symbols.intercept]!\n const configs: Any[] = []\n while (this.name in intercept) {\n if (Object.hasOwn(intercept, this.name)) {\n configs.unshift(intercept[this.name])\n }\n intercept = Object.getPrototypeOf(intercept)\n }\n if (base) configs.unshift(base)\n if (head) configs.push(head)\n if ((this as Any)['Config']?.merge) {\n return (this as Any)['Config'].merge(...configs)\n } else {\n return Object.assign({}, ...configs)\n }\n }\n\n static [Symbol.hasInstance](instance: Any) {\n if (!instance) return false\n let constructor = instance.constructor\n while (constructor) {\n constructor = constructor.prototype?.constructor\n if (constructor === this) return true\n constructor &&= Object.getPrototypeOf(constructor)\n }\n return false\n }\n}\n", "import { randomUUID } from 'node:crypto'\nimport type { SessionLog, SessionEvent } from '@tnega/session'\n\nexport type DurableTarget = 'next-turn' | 'next-step'\n\nexport interface DurableInboxMessage {\n id: string\n text?: string\n content?: unknown\n}\n\nfunction contentOf(input: { text?: string; content?: unknown }): string {\n return input.text ?? ''\n}\n\nfunction payloadOf(input: { text?: string; content?: unknown }): unknown | undefined {\n return input.content !== undefined ? input.content : undefined\n}\n\nexport class DurableInbox {\n private _nextTurn: DurableInboxMessage[] = []\n private _nextStep: DurableInboxMessage[] = []\n private _operationTail: Promise<void> = Promise.resolve()\n\n constructor(private _session: SessionLog) {}\n\n get size(): number {\n return this._nextTurn.length + this._nextStep.length\n }\n\n async insert(input: { text?: string; content?: unknown }, target: DurableTarget = 'next-turn'): Promise<DurableInboxMessage> {\n return this._run(async () => {\n const message: DurableInboxMessage = {\n id: randomUUID(),\n ...(input.text !== undefined ? { text: input.text } : {}),\n ...(input.content !== undefined ? { content: input.content } : {}),\n }\n const list = target === 'next-step' ? this._nextStep : this._nextTurn\n const index = list.length\n await this._session.append('agent/inbox/spliced', {\n target,\n index,\n inserted: [{\n id: message.id,\n content: contentOf(message),\n ...(payloadOf(message) !== undefined ? { payload: payloadOf(message) } : {}),\n }],\n })\n list.push(message)\n return message\n })\n }\n\n async steer(input: { text?: string; content?: unknown }): Promise<DurableInboxMessage> {\n return this._run(async () => {\n const message: DurableInboxMessage = {\n id: randomUUID(),\n ...(input.text !== undefined ? { text: input.text } : {}),\n ...(input.content !== undefined ? { content: input.content } : {}),\n }\n await this._session.append('agent/inbox/spliced', {\n target: 'next-step',\n index: this._nextStep.length,\n inserted: [{\n id: message.id,\n content: contentOf(message),\n ...(payloadOf(message) !== undefined ? { payload: payloadOf(message) } : {}),\n mode: 'steer',\n }],\n })\n this._nextStep.push(message)\n return message\n })\n }\n\n async claim(): Promise<DurableInboxMessage | undefined> {\n return this._run(async () => {\n const steered = this._nextStep[0]\n if (steered) {\n await this._session.append('agent/inbox/spliced', {\n target: 'next-step',\n index: 0,\n deleteCount: 1,\n })\n this._nextStep.shift()\n return steered\n }\n const next = this._nextTurn[0]\n if (next) {\n await this._session.append('agent/inbox/spliced', {\n target: 'next-turn',\n index: 0,\n deleteCount: 1,\n })\n this._nextTurn.shift()\n return next\n }\n return undefined\n })\n }\n\n /**\n * Claim the complete proposed step batch: every pending next-step input plus\n * one next-turn message at a turn boundary. Returns an empty array when\n * nothing is pending.\n */\n async claimBatch(): Promise<DurableInboxMessage[]> {\n return this._run(async () => {\n const claimed = [...this._nextStep]\n const nextTurn = this._nextTurn[0]\n if (nextTurn) claimed.push(nextTurn)\n if (!claimed.length) return []\n const deleteCounts = { nextStep: this._nextStep.length, nextTurn: nextTurn ? 1 : 0 }\n await this._session.append('agent/inbox/spliced', { target: 'all', deleteCounts })\n this._nextStep.splice(0, deleteCounts.nextStep)\n this._nextTurn.splice(0, deleteCounts.nextTurn)\n return claimed\n })\n }\n\n /** Claim every input waiting for the next step, without consuming a turn. */\n async claimNextStep(): Promise<DurableInboxMessage[]> {\n return this._run(async () => {\n if (!this._nextStep.length) return []\n const claimed = [...this._nextStep]\n await this._session.append('agent/inbox/spliced', {\n target: 'next-step',\n index: 0,\n deleteCount: claimed.length,\n })\n this._nextStep.splice(0, claimed.length)\n return claimed\n })\n }\n\n async clear(): Promise<void> {\n return this._run(async () => {\n if (!this._nextTurn.length && !this._nextStep.length) return\n await this._session.append('agent/inbox/spliced', {\n target: 'all',\n })\n this._nextTurn = []\n this._nextStep = []\n })\n }\n\n /** Insert a message at an explicit target/index boundary. */\n async insertAt(\n input: { text?: string; content?: unknown },\n target: DurableTarget,\n index: number,\n mode: 'followup' | 'steer' = 'followup',\n ): Promise<DurableInboxMessage> {\n return this._run(async () => {\n const message: DurableInboxMessage = {\n id: randomUUID(),\n ...(input.text !== undefined ? { text: input.text } : {}),\n ...(input.content !== undefined ? { content: input.content } : {}),\n }\n const list = target === 'next-step' ? this._nextStep : this._nextTurn\n const safeIndex = Math.max(0, Math.min(index, list.length))\n await this._session.append('agent/inbox/spliced', {\n target,\n index: safeIndex,\n inserted: [{\n id: message.id,\n content: contentOf(message),\n ...(payloadOf(message) !== undefined ? { payload: payloadOf(message) } : {}),\n mode,\n }],\n })\n list.splice(safeIndex, 0, message)\n return message\n })\n }\n\n /**\n * Replace one pending message by id. The old message is emitted as\n * discarded and the new one as inserted, matching the DSH inbox contract.\n */\n async replace(\n messageId: string,\n input: { text?: string; content?: unknown },\n ): Promise<DurableInboxMessage | undefined> {\n return this._run(async () => {\n const entry = this._find(messageId)\n if (!entry) return undefined\n const replacement: DurableInboxMessage = {\n id: randomUUID(),\n ...(input.text !== undefined ? { text: input.text } : {}),\n ...(input.content !== undefined ? { content: input.content } : {}),\n }\n const target = entry.target\n const index = entry.index\n await this._session.append('agent/inbox/spliced', {\n target,\n index,\n deleteCount: 1,\n inserted: [{\n id: replacement.id,\n content: contentOf(replacement),\n ...(payloadOf(replacement) !== undefined\n ? { payload: payloadOf(replacement) }\n : {}),\n }],\n })\n entry.list.splice(index, 1, replacement)\n return replacement\n })\n }\n\n /** Remove one pending message by id. */\n async remove(messageId: string): Promise<DurableInboxMessage | undefined> {\n return this._run(async () => {\n const entry = this._find(messageId)\n if (!entry) return undefined\n await this._session.append('agent/inbox/spliced', {\n target: entry.target,\n index: entry.index,\n deleteCount: 1,\n })\n entry.list.splice(entry.index, 1)\n return entry.message\n })\n }\n\n /** Return the first pending message by id across both queues. */\n get(messageId: string): DurableInboxMessage | undefined {\n return this._find(messageId)?.message\n }\n\n snapshot(): { nextTurn: readonly DurableInboxMessage[]; nextStep: readonly DurableInboxMessage[] } {\n return {\n nextTurn: [...this._nextTurn],\n nextStep: [...this._nextStep],\n }\n }\n\n /** Keep the entire read \u2192 append \u2192 apply transition ordered, including claims. */\n private _run<T>(operation: () => Promise<T>): Promise<T> {\n const result = this._operationTail.then(operation)\n this._operationTail = result.then(() => undefined, () => undefined)\n return result\n }\n\n private _find(messageId: string):\n | { list: DurableInboxMessage[]; target: DurableTarget; index: number; message: DurableInboxMessage }\n | undefined {\n for (const target of ['next-step', 'next-turn'] as const) {\n const list = target === 'next-step' ? this._nextStep : this._nextTurn\n const index = list.findIndex(message => message.id === messageId)\n if (index >= 0) return { list, target, index, message: list[index]! }\n }\n return undefined\n }\n\n static async restore(session: SessionLog): Promise<DurableInbox> {\n const inbox = new DurableInbox(session)\n inbox._applyAll(await session.read())\n return inbox\n }\n\n private _applyAll(events: readonly SessionEvent[]): void {\n for (const event of events) {\n if (event.type !== 'agent/inbox/spliced') continue\n const payload = event.payload\n if (payload.target === 'all') {\n this._nextTurn.splice(0, payload.deleteCounts?.nextTurn ?? this._nextTurn.length)\n this._nextStep.splice(0, payload.deleteCounts?.nextStep ?? this._nextStep.length)\n continue\n }\n const list = payload.target === 'next-step' ? this._nextStep : this._nextTurn\n const count = payload.deleteCount ?? 0\n if (count === Number.POSITIVE_INFINITY) {\n list.length = 0\n } else if (count > 0 && payload.index === 0) {\n list.splice(0, Math.min(count, list.length))\n } else if (count > 0 && payload.index !== undefined) {\n list.splice(payload.index, Math.min(count, list.length - payload.index))\n }\n let insertedOffset = 0\n for (const item of payload.inserted ?? []) {\n const message: DurableInboxMessage = {\n id: item.id,\n ...(item.content !== undefined ? { text: item.content } : {}),\n ...(item.payload !== undefined ? { content: item.payload } : {}),\n }\n if (item.mode === 'steer') {\n list.unshift(message)\n } else {\n const at = payload.index === undefined\n ? list.length\n : Math.min(list.length, payload.index + insertedOffset)\n list.splice(at, 0, message)\n insertedOffset += 1\n }\n }\n }\n }\n}\n", "import type { Context, Plugin } from '@tnega/core'\r\n\r\nexport interface PromptSection {\r\n name: string\r\n order?: number\r\n content: string\r\n}\r\n\r\nexport interface SystemPromptAssemblyOptions {\r\n scope?: unknown\r\n [key: string]: unknown\r\n}\r\n\r\nexport interface PromptAssembly {\r\n sections: readonly PromptSection[]\r\n text: string\r\n context?: SystemPromptAssemblyOptions\r\n variables?: Record<string, string>\r\n tools?: readonly { name: string; description: string; parameters?: Record<string, unknown> }[]\r\n}\r\n\r\nexport type ToolSchemaSnapshot = {\r\n name: string\r\n description: string\r\n parameters?: Record<string, unknown>\r\n}\r\n\r\nexport type ToolSchemaProvider = (\r\n context: SystemPromptAssemblyOptions,\r\n) => readonly ToolSchemaSnapshot[] | Promise<readonly ToolSchemaSnapshot[]>\r\n\r\nexport type PromptVariableProvider = (\r\n context: SystemPromptAssemblyOptions,\r\n) => string | undefined | Promise<string | undefined>\r\n\r\nexport interface PromptContextProvider {\r\n name: string\r\n order?: number\r\n content: PromptVariableProvider\r\n}\r\n\r\nexport class SystemPromptService {\r\n private _sections = new Map<string, PromptSection>()\r\n private _toolProviders: ToolSchemaProvider[] = []\r\n private _variables = new Map<string, PromptVariableProvider>()\r\n private _contexts: PromptContextProvider[] = []\r\n private _ctx: Context | undefined\r\n\r\n constructor(ctx?: Context) {\r\n this._ctx = ctx\r\n }\r\n\r\n registerSection(section: PromptSection): () => void {\r\n const name = section.name.trim()\r\n if (!name) throw new TypeError('prompt section requires a non-empty name')\r\n if (this._sections.has(name)) {\r\n throw new Error(`prompt section already registered: ${name}`)\r\n }\r\n this._sections.set(name, { ...section, name })\r\n this._emitChange()\r\n return () => {\r\n this._sections.delete(name)\r\n this._emitChange()\r\n }\r\n }\r\n\r\n sections(): readonly PromptSection[] {\r\n return [...this._sections.values()]\r\n .sort((left, right) => (left.order ?? 0) - (right.order ?? 0))\r\n }\r\n\r\n registerTools(provider: ToolSchemaProvider): () => void {\r\n if (typeof provider !== 'function') throw new TypeError('tool provider must be a function')\r\n this._toolProviders.push(provider)\r\n this._emitChange()\r\n return () => {\r\n const index = this._toolProviders.indexOf(provider)\r\n if (index >= 0) this._toolProviders.splice(index, 1)\r\n this._emitChange()\r\n }\r\n }\r\n\r\n async toolSchemas(options: SystemPromptAssemblyOptions = {}): Promise<ToolSchemaSnapshot[]> {\r\n const seen = new Set<string>()\r\n const tools: ToolSchemaSnapshot[] = []\r\n for (const provider of this._toolProviders) {\r\n for (const schema of await provider(options)) {\r\n if (!seen.has(schema.name)) {\r\n seen.add(schema.name)\r\n tools.push(schema)\r\n }\r\n }\r\n }\r\n return tools\r\n }\r\n\r\n registerVariable(name: string, provider: PromptVariableProvider): () => void {\r\n const key = name.trim()\r\n if (!/^[a-zA-Z][a-zA-Z0-9_]*$/.test(key)) {\r\n throw new TypeError(`invalid prompt variable name: ${name}`)\r\n }\r\n if (typeof provider !== 'function') throw new TypeError('variable provider must be a function')\r\n if (this._variables.has(key)) throw new Error(`prompt variable already registered: ${key}`)\r\n this._variables.set(key, provider)\r\n this._emitChange()\r\n return () => {\r\n this._variables.delete(key)\r\n this._emitChange()\r\n }\r\n }\r\n\r\n registerContext(context: PromptContextProvider): () => void {\r\n const name = context.name.trim()\r\n if (!name) throw new TypeError('prompt context requires a non-empty name')\r\n if (this._contexts.some(entry => entry.name === name)) {\r\n throw new Error(`prompt context already registered: ${name}`)\r\n }\r\n this._contexts.push({ ...context, name })\r\n this._emitChange()\r\n return () => {\r\n this._contexts = this._contexts.filter(entry => entry.name !== name)\r\n this._emitChange()\r\n }\r\n }\r\n\r\n async assemble(\r\n options: SystemPromptAssemblyOptions = {},\r\n ctx?: Context,\r\n ): Promise<PromptAssembly> {\r\n const activeCtx = ctx ?? this._ctx\r\n const sections = this.sections()\r\n const variables = await this._resolveVariables(options)\r\n const renderedSections = sections.map(section => ({\r\n ...section,\r\n content: renderTemplate(section.content, variables),\r\n }))\r\n const dynamicContexts = await this._resolveContexts(options)\r\n const contextText = dynamicContexts\r\n .map(context => renderTemplate(context.content, variables))\r\n .filter(Boolean)\r\n const base: PromptAssembly = {\r\n sections: renderedSections,\r\n text: [\r\n ...renderedSections.map(section => section.content).filter(Boolean),\r\n ...contextText,\r\n ].join('\\n\\n'),\r\n ...(Object.keys(variables).length ? { variables } : {}),\r\n ...(Object.keys(options).length ? { context: options } : {}),\r\n }\r\n const tools = await this.toolSchemas(options)\r\n if (tools.length) base.tools = tools\r\n if (!activeCtx) return base\r\n const resolved = await activeCtx.waterfallAsync(\r\n 'system-prompt/assemble',\r\n base,\r\n async (assembly: PromptAssembly) => assembly,\r\n )\r\n return resolved ?? base\r\n }\r\n\r\n private async _resolveVariables(\r\n options: SystemPromptAssemblyOptions,\r\n ): Promise<Record<string, string>> {\r\n const result: Record<string, string> = {}\r\n for (const [name, provider] of this._variables) {\r\n const value = await provider(options)\r\n if (value !== undefined) result[name] = value\r\n }\r\n return result\r\n }\r\n\r\n private async _resolveContexts(\r\n options: SystemPromptAssemblyOptions,\r\n ): Promise<readonly { name: string; content: string }[]> {\r\n const contexts = this._contexts.slice()\r\n .sort((left, right) => (left.order ?? 0) - (right.order ?? 0))\r\n const result: Array<{ name: string; content: string }> = []\r\n for (const context of contexts) {\r\n const value = await context.content(options)\r\n if (value) result.push({ name: context.name, content: value })\r\n }\r\n return result\r\n }\r\n\r\n private _emitChange(): void {\r\n this._ctx?.emit('system-prompt/change')\r\n }\r\n}\r\n\r\nfunction renderTemplate(text: string, variables: Record<string, string>): string {\r\n return text.replace(/\\$\\{([a-zA-Z][a-zA-Z0-9_]*)\\}/g, (match, name: string) => {\r\n return variables[name] ?? match\r\n })\r\n}\r\n\r\nexport const systemPrompt = {\r\n name: 'system-prompt',\r\n apply: (ctx: Context) => {\r\n const service = new SystemPromptService(ctx)\r\n ctx.provide('systemPrompt', service)\r\n return () => {}\r\n },\r\n} satisfies Plugin\r\n", "import type { Context, Plugin } from '@tnega/core'\r\nimport type { LLMAdapter } from './types.js'\r\n\r\nexport interface LlmRouteCapacity {\r\n provider: string\r\n model: string\r\n contextWindow?: number\r\n}\r\n\r\nexport class LlmService {\r\n private _adapters = new Map<string, LLMAdapter>()\r\n private _current: LLMAdapter | undefined\r\n private _defaultName: string | undefined\r\n\r\n register(name: string, adapter: LLMAdapter): () => void {\r\n const key = name.trim()\r\n if (!key) throw new TypeError('llm provider requires a non-empty name')\r\n if (this._adapters.has(key)) throw new Error(`llm provider already registered: ${key}`)\r\n this._adapters.set(key, adapter)\r\n if (!this._current) {\r\n this._current = adapter\r\n this._defaultName = key\r\n }\r\n return () => {\r\n this._adapters.delete(key)\r\n if (this._defaultName === key) {\r\n this._defaultName = undefined\r\n this._current = this._adapters.values().next().value\r\n }\r\n }\r\n }\r\n\r\n setCurrent(name: string): LLMAdapter {\r\n const adapter = this._adapters.get(name.trim())\r\n if (!adapter) throw new Error(`llm provider not found: ${name}`)\r\n this._current = adapter\r\n this._defaultName = name.trim()\r\n return adapter\r\n }\r\n\r\n current(): LLMAdapter | undefined {\r\n return this._current\r\n }\r\n\r\n list(): readonly { name: string; adapter: LLMAdapter }[] {\r\n return [...this._adapters.entries()].map(([name, adapter]) => ({ name, adapter }))\r\n }\r\n\r\n /**\r\n * Report provider/model/contextWindow for the current route. The adapter\r\n * may be registered with an optional capacity provider by callers that own\r\n * the model catalog (for example the CLI runtime).\r\n */\r\n routeCapacity(): LlmRouteCapacity | undefined {\r\n if (!this._current || !this._defaultName) return undefined\r\n const provider = this._defaultName\r\n const model = (this._current as unknown as { model?: string }).model\r\n const contextWindow = this._capacityFor?.(model)\r\n const result: LlmRouteCapacity = { provider, model: model ?? '' }\r\n if (contextWindow !== undefined) result.contextWindow = contextWindow\r\n return result\r\n }\r\n\r\n private _capacityFor: ((model: string | undefined) => number | undefined) | undefined\r\n\r\n /** Install a catalog-backed contextWindow resolver (optional). */\r\n setCapacityResolver(resolver: (model: string | undefined) => number | undefined): void {\r\n this._capacityFor = resolver\r\n }\r\n}\r\n\r\nexport const llmService = {\r\n name: 'llm-service',\r\n apply: (ctx: Context) => {\r\n ctx.provide('llm', new LlmService())\r\n return () => {}\r\n },\r\n} satisfies Plugin\r\n"],
5
+ "mappings": "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",
6
+ "names": ["randomUUID", "previous", "stringify", "randomUUID", "resolve", "llmService", "systemPrompt", "name", "randomUUID", "target", "value", "name", "lines", "name", "name", "config", "task", "dispose", "resolve", "name", "name", "value", "name", "name", "name", "randomUUID", "resolve", "randomUUID", "agent", "name", "name", "name"]
7
7
  }