tnega 0.1.1 → 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (80) hide show
  1. package/README.md +115 -100
  2. package/dist/agent.js +2510 -134
  3. package/dist/agent.js.map +4 -4
  4. package/dist/bin.js +30723 -5163
  5. package/dist/bin.js.map +4 -4
  6. package/dist/cli-runtime.js +30690 -5094
  7. package/dist/cli-runtime.js.map +4 -4
  8. package/dist/coding-agent.js +19088 -0
  9. package/dist/coding-agent.js.map +7 -0
  10. package/dist/core.js +74 -1
  11. package/dist/core.js.map +4 -4
  12. package/dist/eval.js +23159 -1990
  13. package/dist/eval.js.map +4 -4
  14. package/dist/events.js +22 -1
  15. package/dist/events.js.map +2 -2
  16. package/dist/evolve.js +17631 -1815
  17. package/dist/evolve.js.map +4 -4
  18. package/dist/index.js +31848 -6076
  19. package/dist/index.js.map +4 -4
  20. package/dist/llm.js +8 -0
  21. package/dist/llm.js.map +2 -2
  22. package/dist/services.js +12 -1
  23. package/dist/services.js.map +2 -2
  24. package/dist/session.js +793 -122
  25. package/dist/session.js.map +4 -4
  26. package/dist/tools.js +242 -135
  27. package/dist/tools.js.map +4 -4
  28. package/dist/types/packages/agent/src/inbox-durable.d.ts +54 -0
  29. package/dist/types/packages/agent/src/index.d.ts +4 -0
  30. package/dist/types/packages/agent/src/live.d.ts +115 -0
  31. package/dist/types/packages/agent/src/llm-service.d.ts +32 -0
  32. package/dist/types/packages/agent/src/prompt.d.ts +55 -0
  33. package/dist/types/packages/agent/src/service.d.ts +24 -0
  34. package/dist/types/packages/agent/src/types.d.ts +75 -1
  35. package/dist/types/packages/benchmark/src/bigcodebench.d.ts +6 -0
  36. package/dist/types/packages/benchmark/src/humaneval.d.ts +11 -0
  37. package/dist/types/packages/benchmark/src/index.d.ts +9 -0
  38. package/dist/types/packages/benchmark/src/manifest.d.ts +10 -0
  39. package/dist/types/packages/benchmark/src/mbpp.d.ts +10 -0
  40. package/dist/types/packages/benchmark/src/parquet.d.ts +2 -0
  41. package/dist/types/packages/benchmark/src/stdlib.d.ts +3 -0
  42. package/dist/types/packages/benchmark/src/swebench.d.ts +2 -0
  43. package/dist/types/packages/benchmark/src/types.d.ts +58 -0
  44. package/dist/types/packages/cli/src/commands.d.ts +26 -2
  45. package/dist/types/packages/cli/src/config.d.ts +2 -0
  46. package/dist/types/packages/cli/src/index.d.ts +4 -2
  47. package/dist/types/packages/cli/src/profile-file.d.ts +26 -0
  48. package/dist/types/packages/cli/src/profile.d.ts +9 -0
  49. package/dist/types/packages/cli/src/server.d.ts +2 -0
  50. package/dist/types/packages/cli/src/store.d.ts +10 -9
  51. package/dist/types/packages/coding-agent/src/codingAgent.d.ts +25 -0
  52. package/dist/types/packages/coding-agent/src/index.d.ts +6 -0
  53. package/dist/types/packages/coding-agent/src/mcp.d.ts +24 -0
  54. package/dist/types/packages/coding-agent/src/plan.d.ts +13 -0
  55. package/dist/types/packages/coding-agent/src/skills.d.ts +12 -0
  56. package/dist/types/packages/coding-agent/src/slash.d.ts +28 -0
  57. package/dist/types/packages/coding-agent/src/types.d.ts +41 -0
  58. package/dist/types/packages/core/src/events.d.ts +4 -1
  59. package/dist/types/packages/core/src/index.d.ts +1 -0
  60. package/dist/types/packages/core/src/invariant.d.ts +45 -0
  61. package/dist/types/packages/eval/src/codingRuntime.d.ts +18 -0
  62. package/dist/types/packages/eval/src/policy.d.ts +8 -0
  63. package/dist/types/packages/eval/src/runner.d.ts +4 -0
  64. package/dist/types/packages/eval/src/strategies.d.ts +10 -0
  65. package/dist/types/packages/eval/src/trace.d.ts +7 -0
  66. package/dist/types/packages/eval/src/types.d.ts +97 -1
  67. package/dist/types/packages/eval/src/workspace.d.ts +17 -0
  68. package/dist/types/packages/llm/src/types.d.ts +2 -0
  69. package/dist/types/packages/session/src/index.d.ts +397 -12
  70. package/dist/types/packages/session/src/invariant.d.ts +33 -0
  71. package/dist/types/packages/tools/src/builtins.d.ts +2 -0
  72. package/dist/types/packages/tools/src/execution.d.ts +31 -0
  73. package/dist/types/packages/tools/src/index.d.ts +17 -0
  74. package/dist/types/src/index.d.ts +5 -5
  75. package/dist/web/assets/index-45pokiBH.js +270 -0
  76. package/dist/web/assets/index-DCLL69Kz.css +1 -0
  77. package/dist/web/index.html +2 -2
  78. package/package.json +92 -88
  79. package/dist/web/assets/index-C3jFlR4V.css +0 -1
  80. package/dist/web/assets/index-DeFGh2h4.js +0 -268
package/dist/agent.js.map CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
- "sources": ["../packages/session/src/index.ts", "../packages/agent/src/service.ts", "../packages/agent/src/definition.ts"],
4
- "sourcesContent": ["import { randomUUID } from 'node:crypto'\nimport { appendFile, mkdir, readFile, writeFile } from 'node:fs/promises'\nimport { dirname, resolve } from 'node:path'\nimport type { Context } from '@tnega/core'\n\nexport type ModelRole = 'system' | 'user' | 'assistant' | 'tool'\n\nexport interface ModelToolCall {\n id: string\n name: string\n arguments: unknown\n}\n\nexport interface ModelMessage {\n role: ModelRole\n content: string\n name?: string\n tool_call_id?: string\n tool_calls?: ModelToolCall[]\n toolOk?: boolean\n toolError?: ToolResultErrorPayload\n}\n\nexport type MessageRole = 'system' | 'user' | 'assistant'\n\nexport interface MessagePayload {\n role: MessageRole\n content: string\n name?: string\n parentId?: string\n}\n\nexport interface ToolCallPayload {\n id: string\n name: string\n arguments: unknown\n}\n\nexport interface ToolResultErrorPayload {\n name?: string\n message: string\n stack?: string\n}\n\nexport interface ToolResultPayload {\n id: string\n toolCallId: string\n name: string\n ok: boolean\n durationMs?: number\n output?: unknown\n error?: ToolResultErrorPayload\n}\n\nexport interface CheckpointPayload {\n messages: ModelMessage[]\n summary?: string\n tokensBefore?: number\n snapshot?: SessionEvent[]\n}\n\nexport type SessionEventType =\n | 'message'\n | 'tool-call'\n | 'tool-result'\n | 'checkpoint'\n | 'meta'\n\nexport interface SessionEventBase<T extends SessionEventType, P> {\n id: string\n seq: number\n ts: number\n type: T\n payload: P\n}\n\nexport type SessionEvent =\n | SessionEventBase<'message', MessagePayload>\n | SessionEventBase<'tool-call', ToolCallPayload>\n | SessionEventBase<'tool-result', ToolResultPayload>\n | SessionEventBase<'checkpoint', CheckpointPayload>\n | SessionEventBase<'meta', Record<string, unknown>>\n\nexport interface SessionConfig {\n file: string\n projector?: SessionProjector\n}\n\nexport interface CompactOptions {\n keep?: number\n keepTokens?: number\n summary?: string\n tokensBefore?: number\n messages?: ModelMessage[]\n}\n\nexport type ReplayReducer<T> = (state: T, event: SessionEvent) => T | Promise<T>\n\nexport type SessionProjector = (events: readonly SessionEvent[]) => ModelMessage[]\n\nexport interface ContextUsage {\n tokens: number\n limit: number\n ratio: number\n}\n\nexport const DEFAULT_CONTEXT_LIMIT = 128_000\n\nfunction isSessionEvent(value: unknown): value is SessionEvent {\n if (typeof value !== 'object' || value === null) return false\n const record = value as Record<string, unknown>\n return typeof record.id === 'string'\n && typeof record.seq === 'number'\n && typeof record.ts === 'number'\n && typeof record.type === 'string'\n && 'payload' in record\n}\n\nfunction clone<T>(value: T): T {\n return structuredClone(value)\n}\n\nexport function projectEvents(events: readonly SessionEvent[]): ModelMessage[] {\n const messages: ModelMessage[] = []\n for (const event of events) {\n switch (event.type) {\n case 'checkpoint':\n messages.push(...clone(event.payload.messages))\n break\n case 'message': {\n const message: ModelMessage = {\n role: event.payload.role,\n content: event.payload.content,\n }\n if (event.payload.name) message.name = event.payload.name\n messages.push(message)\n break\n }\n case 'tool-call': {\n const last = messages.at(-1)\n if (!last || last.role !== 'assistant') {\n messages.push({\n role: 'assistant',\n content: '',\n tool_calls: [],\n })\n } else if (!last.tool_calls) {\n last.tool_calls = []\n }\n messages.at(-1)!.tool_calls!.push({\n id: event.payload.id,\n name: event.payload.name,\n arguments: event.payload.arguments,\n })\n break\n }\n case 'tool-result': {\n const failed = !event.payload.ok\n const content = failed\n ? `error: ${event.payload.error?.message ?? 'unknown'}`\n : stringify(event.payload.output)\n const message: ModelMessage = {\n role: 'tool',\n content,\n tool_call_id: event.payload.toolCallId,\n }\n message.name = event.payload.name\n if (failed) {\n message.toolOk = false\n if (event.payload.error) message.toolError = event.payload.error\n }\n messages.push(message)\n break\n }\n case 'meta':\n break\n }\n }\n return messages\n}\n\nfunction stringify(value: unknown): string {\n if (typeof value === 'string') return value\n try {\n return JSON.stringify(value) ?? String(value)\n } catch {\n return String(value)\n }\n}\n\nexport function estimateMessageTokens(messages: readonly ModelMessage[]): number {\n let tokens = 0\n for (const message of messages) {\n tokens += Math.ceil(message.content.length / 4)\n for (const call of message.tool_calls ?? []) {\n const raw = JSON.stringify(call.arguments ?? {}) ?? ''\n tokens += Math.ceil(raw.length / 4)\n }\n }\n return tokens\n}\n\nexport function estimateEventTokens(event: SessionEvent): number {\n switch (event.type) {\n case 'message':\n return Math.ceil(event.payload.content.length / 4)\n case 'tool-call': {\n const raw = JSON.stringify(event.payload.arguments ?? {}) ?? ''\n return Math.ceil(raw.length / 4)\n }\n case 'tool-result': {\n const raw = event.payload.ok\n ? stringify(event.payload.output)\n : event.payload.error?.message ?? 'error'\n return Math.ceil(raw.length / 4)\n }\n case 'checkpoint':\n return estimateMessageTokens(event.payload.messages)\n case 'meta':\n return 0\n }\n}\n\nexport function suffixStartIndexForTokens(\n events: readonly SessionEvent[],\n targetTokens: number,\n): number {\n if (!events.length || targetTokens <= 0) return 0\n let tokens = 0\n let candidate = events.length\n for (let index = events.length - 1; index >= 0; index -= 1) {\n tokens += estimateEventTokens(events[index]!)\n if (tokens >= targetTokens) {\n candidate = index\n break\n }\n }\n if (candidate === events.length) return 0\n let cut = candidate\n while (cut < events.length) {\n const event = events[cut]\n if (event && event.type === 'message' && event.payload.role === 'user') return cut\n cut += 1\n }\n return candidate\n}\n\nexport function resolveCompactKeep(\n events: readonly SessionEvent[],\n options: CompactOptions,\n): number {\n if (\n typeof options.keepTokens === 'number'\n && Number.isFinite(options.keepTokens)\n && options.keepTokens > 0\n ) {\n return events.length - suffixStartIndexForTokens(events, options.keepTokens)\n }\n const keep = typeof options.keep === 'number' && Number.isFinite(options.keep) && options.keep > 0\n ? Math.floor(options.keep)\n : 0\n return Math.min(keep, events.length)\n}\n\nexport function estimateContextUsage(\n messages: readonly ModelMessage[],\n limit = DEFAULT_CONTEXT_LIMIT,\n): ContextUsage {\n const tokens = estimateMessageTokens(messages)\n return {\n tokens,\n limit,\n ratio: limit > 0 ? tokens / limit : 0,\n }\n}\n\nexport class SessionLog {\n private _events: SessionEvent[] = []\n private _loaded = false\n private _nextSeq = 1\n private _queue: Promise<unknown> = Promise.resolve()\n\n constructor(\n readonly file: string,\n private _projector: SessionProjector = projectEvents,\n ) {}\n\n init(): Promise<void> {\n return this._run(async () => {\n await this._ensureLoaded()\n })\n }\n\n append(type: 'message', payload: MessagePayload): Promise<SessionEvent>\n append(type: 'tool-call', payload: ToolCallPayload): Promise<SessionEvent>\n append(type: 'tool-result', payload: ToolResultPayload): Promise<SessionEvent>\n append(type: 'checkpoint', payload: CheckpointPayload): Promise<SessionEvent>\n append(type: 'meta', payload: Record<string, unknown>): Promise<SessionEvent>\n append(type: SessionEventType, payload: SessionEvent['payload']): Promise<SessionEvent> {\n return this._run(async () => {\n await this._ensureLoaded()\n const eventPayload = clone(payload)\n if (type === 'message') {\n for (let index = this._events.length - 1; index >= 0; index -= 1) {\n const previous = this._events[index]\n if (previous?.type === 'message') {\n const messagePayload = eventPayload as MessagePayload\n messagePayload.parentId ??= previous.id\n break\n }\n }\n }\n const event = {\n id: randomUUID(),\n seq: this._nextSeq,\n ts: Date.now(),\n type: type as SessionEvent['type'],\n payload: eventPayload,\n } as SessionEvent\n await appendFile(this.file, `${JSON.stringify(event)}\\n`, 'utf8')\n this._events.push(event)\n this._nextSeq += 1\n return event\n })\n }\n\n async lineage(messageId: string): Promise<SessionEvent[]> {\n return this._run(async () => {\n await this._ensureLoaded()\n return this._resolveLineage(messageId)\n })\n }\n\n async forkAt(messageId: string): Promise<SessionEvent[]> {\n return this._run(async () => {\n await this._ensureLoaded()\n const lineage = this._resolveLineage(messageId)\n const lineageIds = new Set(lineage.map(event => event.id))\n const targetIndex = this._events.findIndex(\n event => event.id === messageId && event.type === 'message',\n )\n if (targetIndex < 0) {\n throw new Error(`message not found: ${messageId}`)\n }\n const selected: SessionEvent[] = []\n let skippedMessage = false\n for (let index = 0; index <= targetIndex; index += 1) {\n const event = this._events[index]!\n if (event.type === 'message') {\n if (!lineageIds.has(event.id)) {\n skippedMessage = true\n continue\n }\n skippedMessage = false\n selected.push(clone(event))\n continue\n }\n if (event.type === 'meta') continue\n if (event.type === 'checkpoint') {\n selected.push(clone(event))\n continue\n }\n if (!skippedMessage) {\n selected.push(clone(event))\n }\n }\n return selected\n })\n }\n\n read(): Promise<SessionEvent[]> {\n return this._run(async () => {\n await this._ensureLoaded()\n return this._events.map(event => clone(event))\n })\n }\n\n deriveMessages(): Promise<ModelMessage[]> {\n return this._run(async () => {\n await this._ensureLoaded()\n return clone(this._projector(this._events))\n })\n }\n\n estimateContext(limit = DEFAULT_CONTEXT_LIMIT): Promise<ContextUsage> {\n return this._run(async () => {\n await this._ensureLoaded()\n return estimateContextUsage(this._projector(this._events), limit)\n })\n }\n\n replay(): Promise<SessionEvent[]>\n replay<T>(reduce: ReplayReducer<T>, initial: T): Promise<T>\n replay<T>(reduce?: ReplayReducer<T>, initial?: T): Promise<SessionEvent[] | T> {\n return this.read().then((events) => {\n if (!reduce) return events\n let state = initial as T\n let pending: Promise<void> = Promise.resolve()\n for (const event of events) {\n pending = pending.then(async () => {\n state = await reduce(state, event)\n })\n }\n return pending.then(() => state)\n })\n }\n\n compact(options: CompactOptions = {}): Promise<number> {\n return this._run(async () => {\n await this._ensureLoaded()\n const keep = resolveCompactKeep(this._events, options)\n const split = this._events.length - keep\n const prefix = this._events.slice(0, split)\n const suffix = this._events.slice(split)\n const checkpoint: SessionEvent = {\n id: randomUUID(),\n seq: this._events.at(-1)?.seq ?? 0,\n ts: Date.now(),\n type: 'checkpoint',\n payload: {\n messages: options.messages\n ? clone(options.messages)\n : this._projector(prefix),\n ...(options.summary ? { summary: options.summary } : {}),\n ...(options.tokensBefore !== undefined\n ? { tokensBefore: options.tokensBefore }\n : {}),\n ...(prefix.length ? { snapshot: prefix } : {}),\n },\n }\n const next = [checkpoint, ...suffix]\n if (next.length) {\n await writeFile(this.file, `${next.map(event => JSON.stringify(event)).join('\\n')}\\n`, 'utf8')\n } else {\n await writeFile(this.file, '', 'utf8')\n }\n this._events = next\n return next.length\n })\n }\n\n close(): Promise<void> {\n return this._queue.then(() => undefined)\n }\n\n private _run<T>(task: () => Promise<T>): Promise<T> {\n const next = this._queue.then(task, task)\n this._queue = next.then(() => undefined, () => undefined)\n return next\n }\n\n private async _ensureLoaded(): Promise<void> {\n if (this._loaded) return\n await mkdir(dirname(resolve(this.file)), { recursive: true })\n this._events = await this._read()\n this._nextSeq = (this._events.at(-1)?.seq ?? 0) + 1\n this._loaded = true\n }\n\n private async _read(): Promise<SessionEvent[]> {\n try {\n const text = await readFile(this.file, 'utf8')\n const events: SessionEvent[] = []\n for (const line of text.split('\\n')) {\n if (!line.trim()) continue\n let parsed: unknown\n try {\n parsed = JSON.parse(line)\n } catch {\n continue\n }\n if (isSessionEvent(parsed)) events.push(parsed)\n }\n return events\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code === 'ENOENT') return []\n throw error\n }\n }\n\n private _resolveLineage(messageId: string): SessionEvent[] {\n const messages = this._events.filter(\n (event): event is Extract<SessionEvent, { type: 'message' }> => event.type === 'message',\n )\n const byId = new Map<string, Extract<SessionEvent, { type: 'message' }>>(\n messages.map(event => [event.id, event] as const),\n )\n if (!byId.has(messageId)) {\n throw new Error(`message not found: ${messageId}`)\n }\n const chain: SessionEvent[] = []\n const seen = new Set<string>()\n let cursorId: string | undefined = messageId\n while (cursorId && byId.has(cursorId) && !seen.has(cursorId)) {\n seen.add(cursorId)\n const event: Extract<SessionEvent, { type: 'message' }> = byId.get(cursorId)!\n chain.unshift(clone(event))\n const parentId: string | undefined = event.payload.parentId\n if (parentId && byId.has(parentId)) {\n cursorId = parentId\n continue\n }\n const index = messages.findIndex(message => message.id === cursorId)\n cursorId = index > 0 ? messages[index - 1]!.id : undefined\n }\n return chain\n }\n}\n\nexport const session = {\n name: 'session',\n apply: async (ctx: Context, config: SessionConfig) => {\n const log = new SessionLog(config.file, config.projector)\n await log.init()\n ctx.provide('session', log)\n return () => log.close()\n },\n}\n\nexport const name = '@tnega/session'\n", "import type { Context } from '@tnega/core'\nimport {\n DEFAULT_CONTEXT_LIMIT,\n estimateContextUsage,\n type ModelMessage,\n type SessionLog,\n type ToolResultPayload,\n} from '@tnega/session'\nimport type { ToolError, ToolResult } from '@tnega/tools'\nimport type { ToolsService } from '@tnega/tools'\n\nimport type {\n AgentContextBudget,\n AgentFinishReason,\n AgentHooks,\n AgentInput,\n AgentRunOptions,\n AgentRunResult,\n AgentStep,\n AgentStreamEvent,\n CompleteOptions,\n LLMAdapter,\n LLMCompletion,\n LLMStreamEvent,\n LLMToolCall,\n} from './types.js'\n\nexport class AgentError extends Error {\n override name = 'AgentError'\n}\n\nexport class AgentInbox {\n private _queue: AgentInput[] = []\n private _injected = new Map<string, unknown>()\n\n get size(): number {\n return this._queue.length\n }\n\n push(input: AgentInput): AgentInput {\n this._queue.push(input)\n return input\n }\n\n claim(): AgentInput | undefined {\n return this._queue.shift()\n }\n\n peek(): AgentInput | undefined {\n return this._queue[0]\n }\n\n inject(key: string, value: unknown): void {\n this._injected.set(key, value)\n }\n\n injected(): ReadonlyMap<string, unknown> {\n return new Map(this._injected)\n }\n}\n\nexport interface AgentConfig {\n llm?: LLMAdapter\n maxTurns?: number\n maxSteps?: number\n inbox?: AgentInbox\n hooks?: AgentHooks\n contextBudget?: AgentContextBudget\n}\n\nfunction copyMessages(messages: readonly ModelMessage[]): ModelMessage[] {\n return messages.map((message) => {\n const copy: ModelMessage = {\n role: message.role,\n content: message.content,\n }\n if (message.name) copy.name = message.name\n if (message.tool_call_id) copy.tool_call_id = message.tool_call_id\n if (message.toolOk !== undefined) copy.toolOk = message.toolOk\n if (message.toolError) copy.toolError = { ...message.toolError }\n if (message.tool_calls) {\n copy.tool_calls = message.tool_calls.map(call => ({\n id: call.id,\n name: call.name,\n arguments: call.arguments,\n }))\n }\n return copy\n })\n}\n\nfunction stringify(value: unknown): string {\n if (typeof value === 'string') return value\n try {\n return JSON.stringify(value) ?? String(value)\n } catch {\n return String(value)\n }\n}\n\nfunction copyCompletion(completion: LLMCompletion): LLMCompletion {\n const copy: LLMCompletion = {\n finishReason: completion.finishReason,\n }\n if (completion.content !== undefined) copy.content = completion.content\n if (completion.toolCalls) {\n copy.toolCalls = completion.toolCalls.map(call => ({\n id: call.id,\n name: call.name,\n arguments: call.arguments,\n }))\n }\n return copy\n}\n\nexport class AgentService {\n readonly inbox: AgentInbox\n\n constructor(\n private ctx: Context,\n private config: AgentConfig = {},\n ) {\n this.inbox = config.inbox ?? new AgentInbox()\n }\n\n async run(input?: AgentInput, options: AgentRunOptions = {}): Promise<AgentRunResult> {\n return consumeAgentStream(this._stream(input, options, false))\n }\n\n async *runStream(\n input?: AgentInput,\n options: AgentRunOptions = {},\n ): AsyncGenerator<AgentStreamEvent, AgentRunResult, void> {\n const iterator = this._stream(input, options)[Symbol.asyncIterator]()\n while (true) {\n const next = await iterator.next()\n if (next.done) return next.value\n yield next.value\n }\n }\n\n private async *_stream(\n input?: AgentInput,\n options: AgentRunOptions = {},\n useStream = true,\n ): AsyncGenerator<AgentStreamEvent, AgentRunResult, void> {\n const claimed = input ?? this.inbox.claim()\n if (!claimed) throw new AgentError('no agent input available')\n await this.config.hooks?.beforeRun?.(claimed, options)\n\n const session = this._session()\n const tools = this._tools()\n const llm = this._llm()\n if (!llm) throw new AgentError('no LLM adapter available')\n\n const maxTurns = options.maxTurns ?? this.config.maxTurns ?? 64\n const maxSteps = options.maxSteps ?? this.config.maxSteps ?? 64\n const contextBudget = options.contextBudget ?? this.config.contextBudget\n const injected = this.inbox.injected()\n this.ctx.emit('agent/start', { input: claimed, options, injected })\n\n let messages = this._initialMessages(claimed)\n const systemPrompt = this.inbox.injected().get('agentSystem')\n if (typeof systemPrompt === 'string' && systemPrompt) {\n await session.append('message', { role: 'system', content: systemPrompt })\n }\n if (claimed.text) {\n await session.append('message', { role: 'user', content: claimed.text })\n }\n\n const steps: AgentStep[] = []\n let output = ''\n let finishReason: AgentFinishReason = 'stop'\n\n this.ctx.emit('agent/turn-start', {\n input: claimed,\n messages: copyMessages(messages),\n injected,\n })\n\n let index = 0\n let finalTurnGranted = false\n while (index < maxTurns + (finalTurnGranted ? 1 : 0)) {\n if (steps.length >= maxSteps) {\n finishReason = 'max_steps'\n break\n }\n if (contextBudget) {\n messages = await this._enforceContextBudget(session, contextBudget, messages)\n }\n\n const stepInput = copyMessages(messages)\n this.ctx.emit('agent/step', { index, input: copyMessages(stepInput) })\n const availableTools = finalTurnGranted ? [] : tools.list()\n const completeOptions: CompleteOptions = {\n maxSteps: maxSteps - steps.length,\n }\n if (options.signal) completeOptions.signal = options.signal\n\n let completion: LLMCompletion\n const streamMethod = useStream ? llm.stream : undefined\n if (streamMethod) {\n const streamEvents: LLMStreamEvent[] = []\n let cancelled = false\n try {\n for await (const event of streamMethod(stepInput, availableTools, completeOptions)) {\n streamEvents.push(event)\n yield event\n }\n } catch (error) {\n if (!options.signal?.aborted) throw error\n finishReason = 'cancelled'\n cancelled = true\n }\n if (cancelled) break\n completion = completionFromStreamEvents(streamEvents)\n } else {\n try {\n completion = await llm.complete(stepInput, availableTools, completeOptions)\n } catch (error) {\n if (!options.signal?.aborted) throw error\n finishReason = 'cancelled'\n break\n }\n }\n\n const toolCalls = completion.toolCalls ?? []\n if (finalTurnGranted && toolCalls.length) {\n finishReason = 'max_turns'\n break\n }\n const toolResults: ToolResult[] = []\n if (toolCalls.length) {\n await session.append('message', {\n role: 'assistant',\n content: completion.content ?? '',\n })\n }\n for (const call of toolCalls) {\n this.ctx.emit('agent/tool-call', { index, call })\n yield { type: 'tool/start', index, call }\n await session.append('tool-call', {\n id: call.id,\n name: call.name,\n arguments: call.arguments,\n })\n const toolOptions: { callId: string; signal?: AbortSignal } = { callId: call.id }\n if (options.signal) toolOptions.signal = options.signal\n const startedAt = Date.now()\n let result: ToolResult\n try {\n result = await tools.execute(call.name, call.arguments, toolOptions)\n } catch (error) {\n result = {\n ok: false,\n name: call.name,\n callId: call.id,\n input: call.arguments,\n error: toToolError(error),\n startedAt,\n durationMs: Date.now() - startedAt,\n }\n }\n toolResults.push(result)\n const toolResultPayload: ToolResultPayload = {\n id: call.id,\n toolCallId: call.id,\n name: call.name,\n ok: result.ok,\n durationMs: result.durationMs,\n }\n if (result.output !== undefined) toolResultPayload.output = result.output\n if (result.error) {\n toolResultPayload.error = {\n name: result.error.name,\n message: result.error.message,\n }\n if (result.error.stack) toolResultPayload.error.stack = result.error.stack\n }\n await session.append('tool-result', toolResultPayload)\n yield { type: 'tool/end', index, call, result }\n this.ctx.emit('agent/tool-result', { index, call, result })\n }\n if (options.signal?.aborted) {\n finishReason = 'cancelled'\n break\n }\n\n steps.push({\n index,\n input: stepInput,\n completion,\n toolResults,\n })\n\n if (completion.content) {\n output = completion.content\n }\n if (!toolCalls.length) {\n await session.append('message', { role: 'assistant', content: completion.content ?? '' })\n }\n\n const nextMessages = this._extendMessages(messages, completion, toolResults)\n if (toolCalls.length === 0) {\n finishReason = completion.finishReason === 'length'\n ? 'length'\n : completion.finishReason === 'error'\n ? 'error'\n : 'stop'\n break\n }\n if (index + 1 >= maxTurns && !finalTurnGranted) {\n finalTurnGranted = true\n } else if (index + 1 >= maxTurns + (finalTurnGranted ? 1 : 0)) {\n finishReason = 'max_turns'\n break\n }\n finishReason = 'tool_calls'\n index += 1\n messages = nextMessages\n }\n\n const runResult: AgentRunResult = {\n input: claimed,\n output,\n finishReason,\n steps,\n messages: copyMessages(messages),\n }\n this.ctx.emit('agent/turn-end', {\n input: claimed,\n steps: copySteps(steps),\n messages: copyMessages(messages),\n output,\n finishReason,\n })\n this.ctx.emit('agent/end', {\n input: claimed,\n steps: copySteps(steps),\n messages: copyMessages(messages),\n output,\n finishReason,\n })\n await this.config.hooks?.afterRun?.(runResult, options)\n\n yield { type: 'run/end', run: runResult }\n return runResult\n }\n\n private async _enforceContextBudget(\n session: SessionLog,\n budget: AgentContextBudget,\n messages: readonly ModelMessage[],\n ): Promise<ModelMessage[]> {\n const limit = budget.limit ?? DEFAULT_CONTEXT_LIMIT\n const compactRatio = budget.compactRatio ?? 0.9\n if (limit <= 0 || compactRatio <= 0 || compactRatio > 1) {\n throw new AgentError('invalid context budget: limit must be positive and compactRatio must be in (0, 1]')\n }\n const usage = estimateContextUsage(messages, limit)\n if (usage.ratio < compactRatio) return copyMessages(messages)\n const keepTokens = budget.keepTokens ?? Math.max(1, Math.floor(limit * 0.5))\n const compactMessages = budget.summarize\n ? await budget.summarize(messages, usage)\n : [{ role: 'system' as const, content: defaultContextSummary(messages, usage) }]\n const summary = compactMessages\n .map(message => `${message.role}: ${message.content}`)\n .join('\\n')\n await session.compact({\n keepTokens,\n summary,\n tokensBefore: usage.tokens,\n messages: compactMessages.map(message => copyMessages([message])[0]!),\n })\n this.ctx.emit('agent/context-compact', {\n type: 'agent/context-compact',\n messagesBefore: messages.length,\n tokensBefore: usage.tokens,\n limit,\n keepTokens,\n messagesAfter: compactMessages.length,\n })\n return compactMessages.map(message => copyMessages([message])[0]!)\n }\n\n private _initialMessages(input: AgentInput): ModelMessage[] {\n const systemPrompt = this.inbox.injected().get('agentSystem')\n const systemMessage = typeof systemPrompt === 'string' && systemPrompt\n ? [{ role: 'system' as const, content: systemPrompt }]\n : []\n if (input.messages?.length) {\n const first = input.messages[0]\n if (first?.role === 'system') return copyMessages(input.messages)\n return [...systemMessage, ...copyMessages(input.messages)]\n }\n if (input.text) return [...systemMessage, { role: 'user', content: input.text }]\n return systemMessage\n }\n\n private _extendMessages(\n messages: readonly ModelMessage[],\n completion: LLMCompletion,\n toolResults: readonly ToolResult[],\n ): ModelMessage[] {\n const next = copyMessages(messages)\n const assistant: ModelMessage = {\n role: 'assistant',\n content: completion.content ?? '',\n }\n const toolCalls = completion.toolCalls ?? []\n if (toolCalls.length) {\n assistant.tool_calls = toolCalls.map(call => ({\n id: call.id,\n name: call.name,\n arguments: call.arguments,\n }))\n }\n next.push(assistant)\n\n for (const call of toolCalls) {\n const result = toolResults.find(candidate => candidate.callId === call.id)\n const content = result\n ? result.ok\n ? stringify(result.output)\n : `error: ${result.error?.message ?? 'unknown'}`\n : 'error: missing tool result'\n const message: ModelMessage = {\n role: 'tool',\n content,\n tool_call_id: call.id,\n }\n message.name = result?.name ?? call.name\n if (result && !result.ok) {\n message.toolOk = false\n if (result.error) {\n message.toolError = {\n name: result.error.name,\n message: result.error.message,\n }\n }\n }\n next.push(message)\n }\n return next\n }\n\n private _session(): SessionLog {\n const session = (this.ctx as unknown as { session?: SessionLog }).session\n if (!session) throw new AgentError('session service is required')\n return session\n }\n\n private _tools(): ToolsService {\n const tools = (this.ctx as unknown as { tools?: ToolsService }).tools\n if (!tools) throw new AgentError('tools service is required')\n return tools\n }\n\n private _llm(): LLMAdapter | undefined {\n return this.config.llm\n }\n}\n\nfunction defaultContextSummary(\n messages: readonly ModelMessage[],\n usage: { tokens: number },\n): string {\n const latest = messages.at(-1)\n const latestText = latest ? `${latest.role}: ${latest.content}` : 'none'\n return [\n 'Earlier context was compacted.',\n `Messages before compaction: ${messages.length}.`,\n `Tokens before compaction: ${usage.tokens}.`,\n `Latest message: ${latestText}`,\n ].join(' ')\n}\n\nfunction copySteps(steps: readonly AgentStep[]): readonly AgentStep[] {\n return steps.map(step => ({\n index: step.index,\n input: copyMessages(step.input),\n completion: copyCompletion(step.completion),\n toolResults: step.toolResults.map(result => ({ ...result })),\n }))\n}\n\nfunction toToolError(error: unknown): ToolError {\n if (error instanceof Error) {\n const result: ToolError = {\n name: error.name,\n message: error.message,\n }\n if (error.stack) result.stack = error.stack\n return result\n }\n return {\n name: 'ToolExecutionError',\n message: String(error),\n }\n}\n\nfunction completionFromStreamEvents(events: readonly LLMStreamEvent[]): LLMCompletion {\n let content = ''\n const calls = new Map<number, LLMToolCall>()\n let finishReason: AgentFinishReason = 'error'\n for (const event of events) {\n if (event.type === 'message_delta') {\n content += event.delta\n } else if (event.type === 'toolcall_end') {\n calls.set(event.index, {\n id: event.id,\n name: event.name,\n arguments: event.arguments,\n })\n } else if (event.type === 'message_stop') {\n finishReason = event.finishReason\n }\n }\n const completion: LLMCompletion = { finishReason }\n if (content) completion.content = content\n if (calls.size) completion.toolCalls = [...calls.values()]\n return completion\n}\n\nasync function consumeAgentStream(\n stream: AsyncGenerator<AgentStreamEvent, AgentRunResult, void>,\n): Promise<AgentRunResult> {\n const iterator = stream[Symbol.asyncIterator]()\n while (true) {\n const next = await iterator.next()\n if (next.done) return next.value\n }\n}\n\nexport const agent = {\n name: 'agent',\n inject: ['session', 'tools'],\n apply: (ctx: Context, config: AgentConfig = {}) => {\n const service = new AgentService(ctx, config)\n ctx.provide('agent', service)\n ctx.provide('agentLoop', (input?: AgentInput, options?: AgentRunOptions) => service.run(input, options))\n ctx.provide('inbox', service.inbox)\n return () => {}\n },\n}\n\nexport const name = '@tnega/agent'\n", "import type { Context, Plugin } from '@tnega/core'\nimport type { ModelMessage } from '@tnega/session'\nimport type { ToolDefinition } from '@tnega/tools'\n\nimport { agent, AgentService, type AgentConfig } from './service.js'\nimport type { AgentHooks, AgentInput, AgentLoop } from './types.js'\n\nexport type AgentDefinitionHooks = AgentHooks\n\nexport interface AgentDefinition {\n name: string\n version?: string\n system?: string | ((ctx: Context) => string)\n tools?: readonly ToolDefinition[]\n loop?: AgentLoop\n hooks?: AgentDefinitionHooks\n}\n\nexport interface DefineAgentConfig extends Partial<\n Pick<AgentConfig, 'llm' | 'maxTurns' | 'maxSteps' | 'inbox' | 'contextBudget'>\n> {\n [key: string]: unknown\n}\n\nfunction resolveSystemPrompt(\n ctx: Context,\n system: string | ((ctx: Context) => string) | undefined,\n): string | undefined {\n if (!system) return undefined\n return typeof system === 'function' ? system(ctx) : system\n}\n\nfunction withSystemPrompt(\n input: AgentInput | undefined,\n system: string | undefined,\n): AgentInput | undefined {\n if (!system) return input\n const messages: ModelMessage[] = [\n { role: 'system', content: system },\n ...(input?.messages ?? []),\n ]\n if (input?.text) messages.push({ role: 'user', content: input.text })\n return { ...(input ?? {}), messages }\n}\n\nexport function defineAgent(\n definition: AgentDefinition,\n): Plugin {\n const name = definition.name.trim()\n if (!name) throw new TypeError('agent definition requires a non-empty name')\n\n return {\n name: `agent:${name}`,\n inject: ['session', 'tools'],\n apply: async (ctx: Context, config: DefineAgentConfig = {}) => {\n const dynamic = ctx as unknown as {\n tools: { register(tool: ToolDefinition): () => void }\n }\n const system = resolveSystemPrompt(ctx, definition.system)\n let agentService: AgentService | undefined\n\n if (definition.loop) {\n const loop: AgentLoop = async (input, options) => {\n await definition.hooks?.beforeRun?.(input ?? {}, options ?? {})\n const result = await definition.loop!(\n withSystemPrompt(input, system),\n options,\n )\n await definition.hooks?.afterRun?.(result, options ?? {})\n return result\n }\n ctx.provide('agentLoop', loop)\n } else {\n const agentConfig: AgentConfig = {}\n if (definition.hooks) agentConfig.hooks = definition.hooks\n if (config.llm) agentConfig.llm = config.llm\n if (config.maxTurns !== undefined) agentConfig.maxTurns = config.maxTurns\n if (config.maxSteps !== undefined) agentConfig.maxSteps = config.maxSteps\n if (config.inbox) agentConfig.inbox = config.inbox\n if (config.contextBudget) agentConfig.contextBudget = config.contextBudget\n const agentFiber = ctx.plugin(agent, agentConfig)\n await agentFiber\n agentService = ctx.reflect.get('agent') as AgentService\n if (system) agentService.inbox.inject('agentSystem', system)\n }\n\n for (const tool of definition.tools ?? []) {\n dynamic.tools.register(tool)\n }\n\n ctx.provide('agentDefinition', definition)\n ctx.provide('agentSystem', system)\n ctx.emit('agent/definition', {\n name,\n version: definition.version,\n system,\n toolCount: (definition.tools ?? []).length,\n })\n },\n }\n}\n"],
5
- "mappings": "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",
6
- "names": ["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/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"]
7
7
  }