UNPKG

@sema-agent/core

Version:

Stateless, task-oriented AI agent core

78 lines (77 loc) • 3.93 kB
import { observeThenableRejection } from "./safe-notify.js"; export function backgroundChildTerminal(completion, row) { const seq = completion.seq ?? row.generation; const usage = fleetUsageOf(completion.usage); return { kind: "terminal", taskId: row.taskId, sessionScoped: row.sessionScoped, ...(row.sessionId !== undefined ? { sessionId: row.sessionId } : {}), ...(row.transcriptId !== undefined ? { transcriptId: row.transcriptId } : {}), ...(row.parentToolCallId !== undefined ? { parentToolCallId: row.parentToolCallId } : {}), status: completion.status, ...(seq !== undefined ? { seq } : {}), ...(completion.stoppedBy !== undefined ? { stoppedBy: completion.stoppedBy } : {}), summary: completion.summary, ...(completion.result !== undefined ? { result: completion.result } : {}), ...(completion.recentSteps !== undefined ? { recentSteps: completion.recentSteps } : {}), ...(completion.editedFiles !== undefined ? { editedFiles: completion.editedFiles } : {}), ...(completion.resumable !== undefined ? { resumable: completion.resumable } : {}), ...(usage !== undefined ? { usage } : {}), ...(completion.completionId !== undefined ? { completionId: completion.completionId } : {}), }; } function fleetUsageOf(usage) { if (typeof usage !== "object" || usage === null) return undefined; const u = usage; return { ...(typeof u.tokens === "number" ? { tokens: u.tokens } : {}), ...(typeof u.turns === "number" ? { turns: u.turns } : {}), ...(typeof u.costMicroUsd === "number" ? { costMicroUsd: u.costMicroUsd } : {}), ...(typeof u.tool_uses === "number" ? { toolUses: u.tool_uses } : {}), ...(typeof u.duration_ms === "number" ? { durationMs: u.duration_ms } : {}), }; } export function emitsChildRowFrames(identity) { return identity.isDelegatedChild; } export function taskStartedFrame(run, spawner, stamp) { const { identity } = run; return { type: "task_started", taskId: run.taskId, sessionId: run.sessionId, ...(spawner?.delegationTaskType !== undefined ? { taskType: spawner.delegationTaskType } : {}), ...(spawner?.cycleSeq !== undefined ? { seq: spawner.cycleSeq } : {}), ...(spawner?.parentTaskId !== undefined ? { parentTaskId: spawner.parentTaskId } : {}), ...(spawner?.parentSessionId !== undefined ? { parentSessionId: spawner.parentSessionId } : {}), ...(spawner?.rootSessionId !== undefined ? { rootSessionId: spawner.rootSessionId } : {}), ...(identity.agentName ? { name: identity.agentName } : {}), ...(spawner?.explicitAgentName !== undefined ? { spawnName: spawner.explicitAgentName } : {}), ...(spawner?.spawnAgentType !== undefined ? { agentType: spawner.spawnAgentType } : {}), model: run.model, startedAt: Date.now(), ...stamp, }; } let malformedDelegationSeatAnnounced = false; export function __resetMalformedDelegationSeatAnnouncement() { malformedDelegationSeatAnnounced = false; } export function deliverDelegationLifecycle(seat, event, notifier, site) { if (typeof seat === "function") { const frame = Object.freeze(Object.assign(Object.create(null), event)); notifier.notify(() => observeThenableRejection(seat(frame), notifier, site), site); return; } if (seat !== undefined && !malformedDelegationSeatAnnounced) { malformedDelegationSeatAnnounced = true; try { console.warn(`The delegation-lifecycle sink (RunnerDeps.onDelegationLifecycle) holds ${seat === null ? "null" : typeof seat} — not a ` + `function. Delegation spawn/terminal frames are NOT delivered until the wiring is fixed (omit the key, or wire a function).`); } catch { } } }