@agimon-ai/doompi-team 0.0.1-alpha.98 → 0.0.1-alpha.99

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.
@@ -14,6 +14,7 @@ let _agimon_ai_doompi_core_backgroundWork = require("@agimon-ai/doompi-core/back
14
14
  let _agimon_ai_doompi_core_childSession = require("@agimon-ai/doompi-core/childSession");
15
15
  let _agimon_ai_doompi_session = require("@agimon-ai/doompi-session");
16
16
  let _agimon_ai_doompi_core_serverFacet = require("@agimon-ai/doompi-core/serverFacet");
17
+ let _agimon_ai_doompi_core_headless = require("@agimon-ai/doompi-core/headless");
17
18
  //#region src/services/headlessIntercomTool/index.ts
18
19
  function createHeadlessIntercomTool(channel) {
19
20
  return {
@@ -24,7 +25,7 @@ function createHeadlessIntercomTool(channel) {
24
25
  promptGuidelines: ["Send only new progress, blockers, or decisions. Do not repeat task briefs or delegation instructions."],
25
26
  executionMode: "serial",
26
27
  async execute(toolCallId, parameters, signal, onUpdate) {
27
- return channel.execute(toolCallId, parameters, signal, onUpdate);
28
+ return (0, _agimon_ai_doompi_core_headless.toDoomHeadlessToolResult)(await channel.execute(toolCallId, parameters, signal, onUpdate && ((partial) => onUpdate((0, _agimon_ai_doompi_core_headless.toDoomHeadlessToolResult)(partial)))));
28
29
  }
29
30
  };
30
31
  }
@@ -1 +1 @@
1
- {"version":3,"file":"server.cjs","names":["TeamToolParamsSchema","createSessionScope","toModelInfo","SubagentToolSchema","validateSubagentParams","SUBAGENT_ACTIONS","DoomTeamExpectedError","formatAgentDetail","publicAgent","formatAgentList","loadConfig","formatFleetView","formatRunTranscript","listSuspendedRuns","formatSuspendedRuns","resolveTrackedRunId","isSuspendedRunResumable","defineRoot","createTeamExtensionRuntime","readDoomChildSessionService","createSessionScope","createDelegationBridge","loadConfig","formatCompletionHeadline","SUBAGENT_NOTIFY_MESSAGE_TYPE","toModelInfo","DOOM_DELEGATION_SERVICE","readDoomBackgroundWorkService","DOOM_SUBAGENT_POLICY_SERVICE","createSubagentPolicyService","resolveActiveTeamModelSpecs","openScopeAsync","formatSuspendedRuns","suspendScopeRuns","defineRoot","contribution","defineChannel","defineChannel","contribution","defineChannel","defineChannel","contribution","DoomTeamExpectedError","AgentDiscoveryService","resolveActiveTeamModelSpecs","createSessionScope","toModelInfo","loadConfig","defineRoute","contribution","formatTeamContextSnapshot","readActiveTeamSnapshot","defineResource","contribution","defineServerTool","defineServerTool","defineServerPlugin","channelSubagentCatalog","channelSubagentRuns","rootSession","composeRootHooks","apiRoute","resourceTeam","toolIntercom","toolSubagent"],"sources":["../../src/services/headlessIntercomTool/index.ts","../../src/services/headlessSubagentTool/index.ts","../../src/services/mcpTools/index.ts","../../src/services/nativeRunProjection/index.ts","../../src/services/webSubagentCatalog/index.ts","../../src/types/webSubagents.ts","../../src/extensions/workspaces/sessions/(backend)/_lib/root.server.ts","../../src/extensions/workspaces/sessions/(backend)/root.server.ts","../../src/extensions/(backend)/channel/_lib/subagent-catalog.ts","../../src/extensions/(backend)/channel/subagent-catalog.server.ts","../../src/extensions/(backend)/channel/_lib/subagent-runs.ts","../../src/extensions/(backend)/channel/subagent-runs.server.ts","../../src/extensions/workspaces/sessions/(backend)/api/_lib/route.server.ts","../../src/extensions/workspaces/sessions/(backend)/api/route.server.ts","../../src/extensions/workspaces/sessions/(backend)/resource/_lib/team.server.ts","../../src/extensions/workspaces/sessions/(backend)/resource/team.server.ts","../../src/extensions/workspaces/sessions/(backend)/tool/intercom.server.ts","../../src/extensions/workspaces/sessions/(backend)/tool/subagent.server.ts","../../generated/server.ts"],"sourcesContent":["import type { DoomHeadlessTool } from '@agimon-ai/doompi-core/headless';\n\nimport { TeamToolParamsSchema, type NativeTeamRuntime } from '../nativeTeamChannel';\n\nexport function createHeadlessIntercomTool(channel: NativeTeamRuntime): DoomHeadlessTool<typeof TeamToolParamsSchema> {\n return {\n name: 'intercom',\n label: 'Intercom',\n description: 'Communicate with active agents in this root session.',\n parameters: TeamToolParamsSchema,\n promptGuidelines: [\n 'Send only new progress, blockers, or decisions. Do not repeat task briefs or delegation instructions.',\n ],\n executionMode: 'serial',\n async execute(toolCallId, parameters, signal, onUpdate) {\n return channel.execute(toolCallId, parameters, signal, onUpdate);\n },\n };\n}\n","import type {\n DoomHeadlessExecutionContext,\n DoomHeadlessTool,\n DoomHeadlessToolResult,\n} from '@agimon-ai/doompi-core/headless';\n\nimport { SUBAGENT_ACTIONS, SubagentToolSchema, type SubagentToolParams } from '../../schemas/subagentTool';\nimport { resolveTrackedRunId } from '../asyncJobTracker';\nimport { loadConfig } from '../config';\nimport { DoomTeamExpectedError } from '../errors';\nimport { toModelInfo } from '../modelInfo';\nimport { createSessionScope } from '../sessionPaths';\nimport type { SpawnPlanResult } from '../spawnPlan';\nimport { formatFleetView, formatRunTranscript } from '../statusViews';\nimport {\n formatAgentDetail,\n formatAgentList,\n publicAgent,\n validateParams as validateSubagentParams,\n} from '../subagentTool';\nimport { clearSuspendedRun, formatSuspendedRuns, isSuspendedRunResumable, listSuspendedRuns } from '../suspendedRuns';\nimport { createTeamExtensionRuntime } from '../teamRuntime';\n\nconst SUBAGENT_DESCRIPTION =\n 'Discover agents, start and manage persistent background subagent runs, and inspect suspended work.';\n\n/**\n * Every result carries the text the MODEL reads and the structured details the\n * cockpit card reads. The text is always given explicitly: a serialized detail\n * object is not a tool result a model can act on, and the old default made that\n * the easy mistake to make.\n */\nfunction result(text: string, details: unknown, isError = false): DoomHeadlessToolResult {\n return { content: [{ type: 'text', text }], details, ...(isError ? { isError: true } : {}) };\n}\n\n/** The launch report, worded as the Pi path words it, next step included. */\nfunction formatSpawnPlan(plan: SpawnPlanResult): string {\n const started = plan.outcomes.filter((outcome) => outcome.runId);\n const failed = plan.outcomes.filter((outcome) => !outcome.runId);\n const lines = plan.outcomes.map(\n (outcome) =>\n `- ${outcome.agent}: ${outcome.runId ? outcome.runId : `failed: ${outcome.error ?? 'unknown error'}`}${outcome.warning ? `\\n Warning: ${outcome.warning}` : ''}`,\n );\n const label = plan.outcomes.length === 1 ? 'subagent' : 'subagents';\n const summary =\n failed.length === 0\n ? `Started ${started.length} ${label}:`\n : `Started ${started.length}/${plan.outcomes.length} ${label}; ${failed.length} failed:`;\n const next =\n failed.length === 0\n ? 'Completion will arrive asynchronously. Continue only non-overlapping work, or end your turn.'\n : 'Completion will arrive asynchronously for started runs. Do not resubmit them; retry only corrected failed entries.';\n return [summary, ...lines, '', next].join('\\n');\n}\n\nfunction scopeOf(value: string | undefined): 'user' | 'project' | 'both' {\n return value === 'user' || value === 'project' ? value : 'both';\n}\n\nexport function createHeadlessSubagentTool(\n runtime: ReturnType<typeof createTeamExtensionRuntime>,\n execution: DoomHeadlessExecutionContext,\n): DoomHeadlessTool<typeof SubagentToolSchema> {\n const scope = createSessionScope(execution.sessionId);\n const jobs = runtime.asyncJobTracker.forSession(execution.sessionId, scope);\n const availableModels = execution.model ? [toModelInfo(execution.model)] : [];\n return {\n name: 'subagent',\n label: 'Subagent',\n description: SUBAGENT_DESCRIPTION,\n parameters: SubagentToolSchema,\n promptSnippet: 'Discover, run, inspect, steer, stop, and restore persistent subagents',\n promptGuidelines: [\n 'Runs are persistent background work. Do not resubmit a run that already returned an id.',\n 'Use status or suspended before retrying a failed or interrupted operation.',\n ],\n executionMode: 'serial',\n async execute(_toolCallId, parameters, signal, onUpdate) {\n try {\n const params: SubagentToolParams = validateSubagentParams(parameters);\n if (params.action === SUBAGENT_ACTIONS.agents) {\n const scope = scopeOf(params.scope);\n const agents = runtime.discovery.discover(params.cwd ?? execution.cwd, scope).agents;\n const selected = params.name\n ? runtime.discovery.find(params.cwd ?? execution.cwd, scope, params.name)\n : undefined;\n if (params.name && !selected)\n throw new DoomTeamExpectedError(\n 'agent_not_found',\n `No executable agent matches '${params.name}'.`,\n false,\n 'Call subagent({\"action\":\"agents\"}) and retry with an exact agent name.',\n );\n if (selected) return result(formatAgentDetail(selected), { agents: [publicAgent(selected)] });\n return result(formatAgentList(agents), {\n agents: agents.map((agent) => ({\n name: agent.name,\n source: agent.source,\n description: agent.description,\n runtime: agent.runtime ?? 'pi',\n })),\n });\n }\n if (params.action === SUBAGENT_ACTIONS.run) {\n onUpdate?.(\n result(`Starting ${params.requests.length} subagent${params.requests.length === 1 ? '' : 's'}...`, {\n action: params.action,\n partial: true,\n }),\n );\n // An agent whose resolved default context is `fork` needs a parent\n // branch here too, not only on the delegation path. Accessed\n // defensively: a host that cannot offer a branch must degrade to a\n // fresh child, never fail the launch.\n const parentForkSource = await execution.session?.forkSource?.();\n const plan = await runtime.spawnPlanner.spawn(\n {\n tasks: params.requests.map((request) => ({\n agent: request.agent.trim(),\n task: request.task.trim(),\n ...(request.inlineAgent ? { inlineAgent: request.inlineAgent } : {}),\n ...(request.cwd ? { cwd: request.cwd } : {}),\n ...(request.model ? { model: request.model } : {}),\n ...(request.runtime ? { runtime: request.runtime } : {}),\n })),\n cwd: execution.cwd,\n agentScope: scopeOf(params.scope),\n sessionScope: createSessionScope(execution.sessionId),\n environment: execution.environment,\n parentSessionId: execution.sessionId,\n ...(params.concurrency === undefined ? {} : { concurrency: params.concurrency }),\n ...(params.artifacts === undefined ? {} : { artifacts: params.artifacts }),\n availableModels,\n ...(execution.model ? { parentModel: execution.model } : {}),\n ...(parentForkSource ? { parentForkSource } : {}),\n },\n loadConfig().config,\n );\n for (const outcome of plan.outcomes) {\n if (outcome.runId) {\n jobs.track(\n outcome.runId,\n outcome.identity ? { identity: outcome.identity, inline: outcome.inline ?? false } : undefined,\n );\n }\n }\n return result(formatSpawnPlan(plan), plan);\n }\n if (params.action === SUBAGENT_ACTIONS.status) {\n if (!('id' in params)) {\n const runs = jobs.list();\n return result(formatFleetView(runs), { runs });\n }\n const status = runtime.management.statusAsync\n ? await runtime.management.statusAsync(params.id)\n : runtime.management.status(params.id);\n const statusText = status.status\n ? [\n `Run '${status.runId}': ${status.status.state}`,\n status.status.summary ? `Summary: ${status.status.summary}` : undefined,\n ]\n .filter((line): line is string => line !== undefined)\n .join('\\n')\n : `Run '${status.runId}' has no status yet.`;\n const transcript =\n params.transcriptLines === undefined\n ? undefined\n : formatRunTranscript(status.status, params.transcriptLines);\n return result([statusText, transcript].filter((text): text is string => text !== undefined).join('\\n\\n'), {\n runId: status.runId,\n status: status.status,\n });\n }\n if (params.action === SUBAGENT_ACTIONS.suspended) {\n const suspended = listSuspendedRuns(createSessionScope(execution.sessionId));\n const text = suspended.length ? formatSuspendedRuns(suspended) : 'No suspended subagents in this session.';\n return result(text, { suspended, text });\n }\n const id = resolveTrackedRunId(jobs, params.id);\n if (params.action === SUBAGENT_ACTIONS.stop) {\n const control = await runtime.management.stop(id, params.reason);\n return result(`Stop requested for '${id}'.`, { runId: id, control });\n }\n if (params.action === SUBAGENT_ACTIONS.steer) {\n const steer = await runtime.management.steer(id, params.message, undefined, signal);\n return result(`Steer request '${steer.requestId}' for '${id}' is ${steer.state}: ${steer.message}`, {\n runId: id,\n steer,\n });\n }\n const suspended = listSuspendedRuns(createSessionScope(execution.sessionId)).find(\n (item) => item.runId === params.id,\n );\n if (!suspended) throw new Error(`No suspended run matches '${params.id}'.`);\n if (!isSuspendedRunResumable(suspended)) throw new Error(`Suspended run '${params.id}' is not resumable.`);\n const restored = await runtime.spawnPlanner.spawn(\n {\n single: {\n agent: suspended.agent,\n ...(suspended.inlineAgent ? { inlineAgent: suspended.inlineAgent } : {}),\n task: suspended.task,\n cwd: suspended.cwd,\n ...(suspended.model ? { model: suspended.model } : {}),\n sessionFile: suspended.sessionFile,\n ...(suspended.identity ? { identity: suspended.identity } : {}),\n },\n cwd: suspended.cwd,\n agentScope: 'both',\n sessionScope: createSessionScope(execution.sessionId),\n environment: execution.environment,\n runtime: 'pi',\n parentSessionId: execution.sessionId,\n availableModels,\n },\n loadConfig().config,\n );\n const outcome = restored.outcomes[0];\n if (!outcome?.runId)\n throw new Error(`Could not restore '${params.id}': ${outcome?.error ?? 'the spawn produced no run.'}`);\n clearSuspendedRun(createSessionScope(execution.sessionId), params.id);\n return result(`Restored '${params.id}' as '${outcome.runId}', continuing its transcript.`, {\n restore: { ...outcome, restoredFrom: params.id },\n });\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n return result(message, message, true);\n }\n },\n };\n}\n","import type { DoomHeadlessTool } from '@agimon-ai/doompi-core/headless';\nimport type { DoomMcpPluginContext } from '@agimon-ai/doompi-core/mcpFacet';\nimport type { Context } from '@deepseek-ai/cordis';\n\nexport const TEAM_MCP_TOOLS_SERVICE = 'doom/team-mcp-tools';\n\nexport interface McpToolCatalog {\n get(name: string): DoomHeadlessTool | undefined;\n}\n\nexport function mountMcpTools(tools: readonly DoomHeadlessTool[]) {\n return (context: Context): void => {\n context.plugin((providerContext) => {\n providerContext.provide(TEAM_MCP_TOOLS_SERVICE, {\n get: (name) => tools.find((tool) => tool.name === name),\n } satisfies McpToolCatalog);\n });\n };\n}\n\nexport function bindMcpTool(context: DoomMcpPluginContext, name: string): DoomHeadlessTool {\n const tool = context.services.get<McpToolCatalog>(TEAM_MCP_TOOLS_SERVICE)?.get(name);\n if (!tool) throw new Error(`Team tool is unavailable: ${name}`);\n return {\n ...tool,\n execute(toolCallId, parameters, signal, onUpdate) {\n const executionSignal = AbortSignal.any([context.signal, signal ?? context.signal]);\n return tool.execute(toolCallId, parameters, executionSignal, onUpdate, context.execution);\n },\n };\n}\n","import type { NativeAsyncJobProjection } from '../asyncJobTracker';\n\nexport type NativeRunProjectionListener = (runs: readonly NativeAsyncJobProjection[]) => void;\n\nexport interface NativeRunProjectionSink {\n publish(sessionId: string, projection: NativeAsyncJobProjection): void;\n dispose(sessionId: string): void;\n}\n\ninterface SessionProjection {\n readonly runs: Map<string, NativeAsyncJobProjection>;\n readonly listeners: Set<NativeRunProjectionListener>;\n}\n\nconst sessions = new Map<string, SessionProjection>();\n\nfunction projectionFor(sessionId: string): SessionProjection {\n let projection = sessions.get(sessionId);\n if (!projection) {\n projection = { runs: new Map(), listeners: new Set() };\n sessions.set(sessionId, projection);\n }\n return projection;\n}\n\nfunction snapshot(projection: SessionProjection): readonly NativeAsyncJobProjection[] {\n return [...projection.runs.values()];\n}\n\nexport const nativeRunProjection: NativeRunProjectionSink = {\n publish(sessionId, run) {\n const projection = projectionFor(sessionId);\n projection.runs.set(run.runId, run);\n const runs = snapshot(projection);\n for (const listener of projection.listeners) listener(runs);\n },\n dispose(sessionId) {\n const projection = sessions.get(sessionId);\n if (!projection) return;\n for (const listener of projection.listeners) listener([]);\n projection.listeners.clear();\n projection.runs.clear();\n sessions.delete(sessionId);\n },\n};\n\nexport function subscribeNativeRunProjection(sessionId: string, listener: NativeRunProjectionListener): () => void {\n const projection = projectionFor(sessionId);\n projection.listeners.add(listener);\n if (projection.runs.size > 0) listener(snapshot(projection));\n\n let closed = false;\n return () => {\n if (closed) return;\n closed = true;\n projection.listeners.delete(listener);\n if (projection.listeners.size === 0 && projection.runs.size === 0) sessions.delete(sessionId);\n };\n}\n","import type { SubagentCatalogAgent, SubagentCatalogSource } from '../../types/webSubagents';\n\n/** The fields the catalog reads off an agent definition; an AgentConfig satisfies it. */\nexport interface CatalogAgentInput {\n name: string;\n packageName?: string;\n description: string;\n model?: string;\n fallbackModels?: string[];\n tools?: string[];\n skills?: string[];\n extensions?: string[];\n defaultContext?: 'fresh' | 'fork';\n source: SubagentCatalogSource;\n filePath: string;\n}\n\n/** Nearest definition first: the order shadowing resolves in. */\nconst SOURCE_ORDER: Readonly<Record<SubagentCatalogSource, number>> = { project: 0, user: 1, plugin: 2 };\nconst DEFAULT_CONTEXT = 'fresh';\n\nexport function catalogAgentOf(agent: CatalogAgentInput): SubagentCatalogAgent {\n return {\n name: agent.name,\n source: agent.source,\n ...(agent.packageName === undefined ? {} : { packageName: agent.packageName }),\n description: agent.description,\n ...(agent.model === undefined ? {} : { model: agent.model }),\n fallbackModels: agent.fallbackModels ?? [],\n tools: agent.tools ?? [],\n skills: agent.skills ?? [],\n extensions: agent.extensions ?? [],\n defaultContext: agent.defaultContext ?? DEFAULT_CONTEXT,\n filePath: agent.filePath,\n };\n}\n\n/** The catalog's order: by source, nearest first, then by name. */\nexport function presentCatalog(agents: readonly CatalogAgentInput[]): SubagentCatalogAgent[] {\n return agents\n .map(catalogAgentOf)\n .sort((a, b) => SOURCE_ORDER[a.source] - SOURCE_ORDER[b.source] || a.name.localeCompare(b.name));\n}\n\n/** Every model spec a launch could name: the team's offer plus whatever the definitions pin, deduplicated in order. */\nexport function catalogModels(agents: readonly CatalogAgentInput[], teamModels: readonly string[]): string[] {\n const seen = new Set<string>();\n const models: string[] = [];\n for (const model of [\n ...teamModels,\n ...agents.flatMap((agent) => [agent.model ?? '', ...(agent.fallbackModels ?? [])]),\n ]) {\n if (model === '' || seen.has(model)) continue;\n seen.add(model);\n models.push(model);\n }\n return models;\n}\n","/**\n * Subagent run view types shared by this package's hub channel and its web\n * plugin. The shapes mirror the per-run status files this package's own\n * runtime writes; the cockpit renders them as 'subagent_runs' channel\n * payloads.\n */\n\n/** Coarse run state the cockpit renders; rawState keeps doom-team's exact word. */\nexport type SubagentRunState = 'queued' | 'running' | 'done' | 'failed' | 'stopped';\n\n/**\n * One subagent run of a session, read from doom-team's per-run status file.\n */\nexport interface SubagentRun {\n runId: string;\n agent: string;\n /**\n * Generated addressable identity, for example `alan-reviewer-3`.\n *\n * Additive and optional: a run projected before identities existed, and any\n * run whose claim could not be written, still arrives without one.\n */\n identity?: string;\n /** True when this run came from a one-shot inline agent definition. */\n inline?: boolean;\n state: SubagentRunState;\n rawState: string;\n /** The delegation prompt the main agent gave this run. */\n task: string;\n /** A doom-task binding, when the delegation named one; wins over task in the card. */\n taskRef?: string;\n model?: string;\n cwd: string;\n /** The child transcript path, when the session host exposes one. */\n sessionFile?: string;\n /** Epoch milliseconds, as doom-team writes them. */\n startedAt: number;\n endedAt?: number;\n lastUpdate: number;\n /** Live one-liner of what the run is doing right now. */\n currentTool?: string;\n toolCount?: number;\n tokens?: number;\n cost?: number;\n /** Final report, present once the run finished. */\n summary?: string;\n /** Failure reason, present when the run failed. */\n error?: string;\n /** Recent output lines, oldest first, capped. */\n tail: string[];\n}\n\nexport const SUBAGENT_RUNS_TYPE = 'subagent_runs';\n\n/** How the runtime answered one steer: delivered, refused by the run, or not yet acknowledged. */\nexport interface SubagentSteerResult {\n state: 'delivered' | 'failed' | 'pending';\n message: string;\n}\n/** Where an agent definition came from; the catalog groups by it, nearest first. */\nexport type SubagentCatalogSource = 'project' | 'user' | 'plugin';\n\n/** One launchable agent, as the catalog lists it. */\nexport interface SubagentCatalogAgent {\n name: string;\n source: SubagentCatalogSource;\n /** The package that staged a plugin agent. */\n packageName?: string;\n description: string;\n /** The model the definition pins; absent means the runtime's default. */\n model?: string;\n fallbackModels: string[];\n /** Empty means the definition does not narrow the tool set. */\n tools: string[];\n skills: string[];\n extensions: string[];\n defaultContext: 'fresh' | 'fork';\n filePath: string;\n}\n\n/** The 'subagent_catalog' channel payload: the agents a session's directory can launch. */\nexport interface SubagentCatalogPayload {\n cwd: string;\n agents: SubagentCatalogAgent[];\n /** Model specs the active team package offers, for the launch dialog's picker. */\n models: string[];\n /** Why the list may be incomplete, when discovery failed. */\n warning?: string;\n}\n\nexport const SUBAGENT_CATALOG_TYPE = 'subagent_catalog';\n","import { readDoomBackgroundWorkService } from '@agimon-ai/doompi-core/backgroundWork';\nimport { readDoomChildSessionService } from '@agimon-ai/doompi-core/childSession';\nimport { DOOM_DELEGATION_SERVICE } from '@agimon-ai/doompi-core/delegation';\nimport { defineRoot } from '@agimon-ai/doompi-core/extensionFile';\nimport type { DoomHeadlessActivity } from '@agimon-ai/doompi-core/headless';\nimport type { DoomDirectEventBus } from '@agimon-ai/doompi-core/hubChannel';\nimport type { DoomServerPluginContext } from '@agimon-ai/doompi-core/serverFacet';\nimport { provideBackgroundWorkService } from '@agimon-ai/doompi-session';\nimport type { Context } from '@deepseek-ai/cordis';\n\nimport { DOOM_SUBAGENT_POLICY_SERVICE } from '../../../../../schemas/subagentPolicy';\nimport { resolveActiveTeamModelSpecs } from '../../../../../services/agentDiscovery';\nimport type { NativeAsyncJobProjection, TrackedAsyncJob } from '../../../../../services/asyncJobTracker';\nimport { loadConfig } from '../../../../../services/config';\nimport { createDelegationBridge } from '../../../../../services/delegationBridge';\nimport { registerDirectRunBackgroundWork } from '../../../../../services/directRunBackgroundWork';\nimport { createHeadlessIntercomTool } from '../../../../../services/headlessIntercomTool';\nimport { createHeadlessSubagentTool } from '../../../../../services/headlessSubagentTool';\nimport { mountMcpTools } from '../../../../../services/mcpTools';\nimport { toModelInfo } from '../../../../../services/modelInfo';\nimport { nativeRunProjection } from '../../../../../services/nativeRunProjection';\nimport { subscribeNativeRunProjection } from '../../../../../services/nativeRunProjection';\nimport type { NativeTeamTransport } from '../../../../../services/nativeTeamChannel';\nimport { formatCompletionHeadline, SUBAGENT_NOTIFY_MESSAGE_TYPE } from '../../../../../services/notify';\nimport { openScopeAsync, suspendScopeRuns } from '../../../../../services/sessionLifecycle';\nimport { createSessionScope } from '../../../../../services/sessionPaths';\nimport { createSubagentPolicyService } from '../../../../../services/subagentPolicyService';\nimport { formatSuspendedRuns } from '../../../../../services/suspendedRuns';\nimport { createTeamExtensionRuntime } from '../../../../../services/teamRuntime';\nimport { catalogModels, presentCatalog } from '../../../../../services/webSubagentCatalog';\nimport {\n SUBAGENT_CATALOG_TYPE,\n SUBAGENT_RUNS_TYPE,\n type SubagentRun,\n type SubagentRunState,\n} from '../../../../../types/webSubagents';\n\ninterface SessionRunProjection extends SubagentRun {\n /** Host-private child transcript path consumed by the hub, not the browser. */\n sessionFile?: string;\n}\n\nconst TERMINAL_RUN_STATES = new Set(['completed', 'complete', 'failed', 'stopped', 'paused']);\n\nfunction runState(status: string): SubagentRunState {\n if (status === 'completed' || status === 'complete') return 'done';\n if (status === 'failed') return 'failed';\n if (status === 'stopped' || status === 'paused') return 'stopped';\n if (status === 'queued') return 'queued';\n return 'running';\n}\n\nfunction presentTrackedRun(run: TrackedAsyncJob): SessionRunProjection | undefined {\n if (!run.agent || !run.status || run.startedAt === undefined) return undefined;\n const lastUpdate = run.updatedAt ?? run.startedAt;\n return {\n runId: run.runId,\n agent: run.agent,\n ...(run.identity === undefined ? {} : { identity: run.identity }),\n ...(run.inline === undefined ? {} : { inline: run.inline }),\n state: runState(run.status),\n rawState: run.status,\n task: run.task ?? '',\n cwd: run.cwd ?? '',\n startedAt: run.startedAt,\n ...(TERMINAL_RUN_STATES.has(run.status) ? { endedAt: lastUpdate } : {}),\n lastUpdate,\n tail: [],\n ...(run.sessionFile === undefined ? {} : { sessionFile: run.sessionFile }),\n ...(run.summary === undefined ? {} : { summary: run.summary }),\n ...(run.error === undefined ? {} : { error: run.error }),\n };\n}\n\nfunction presentNativeRun(run: NativeAsyncJobProjection): SessionRunProjection {\n return {\n runId: run.runId,\n agent: run.agent,\n ...(run.identity === undefined ? {} : { identity: run.identity }),\n ...(run.inline === undefined ? {} : { inline: run.inline }),\n state: runState(run.status),\n rawState: run.status,\n task: run.task,\n cwd: run.cwd,\n startedAt: run.startedAt,\n ...(TERMINAL_RUN_STATES.has(run.status) ? { endedAt: run.updatedAt } : {}),\n lastUpdate: run.updatedAt,\n tail: [],\n ...(run.sessionFile === undefined ? {} : { sessionFile: run.sessionFile }),\n ...(run.summary === undefined ? {} : { summary: run.summary }),\n ...(run.error === undefined ? {} : { error: run.error }),\n };\n}\n\nfunction publishRuns(\n directEvents: DoomDirectEventBus,\n sessionId: string,\n jobs: readonly TrackedAsyncJob[],\n nativeRuns: ReadonlyMap<string, NativeAsyncJobProjection>,\n): void {\n const runs = jobs\n .filter((job) => !job.native)\n .map(presentTrackedRun)\n .filter((run): run is SessionRunProjection => run !== undefined);\n runs.push(...[...nativeRuns.values()].map(presentNativeRun));\n directEvents.publish(SUBAGENT_RUNS_TYPE, sessionId, { runs });\n}\n\nconst TEAM_COST_STATUS = 'doom-team-cost';\nconst COST_DECIMALS = 6;\n\nfunction updateTeamCost(\n client: { setStatus(source: string, text: string | undefined): void },\n jobs: readonly TrackedAsyncJob[],\n nativeRuns: ReadonlyMap<string, NativeAsyncJobProjection>,\n costs: Map<string, number>,\n previousText: string | undefined,\n attached: boolean,\n force = false,\n): string | undefined {\n const trackedCosts = new Map<string, number>();\n for (const job of jobs) {\n if (job.cost !== undefined && Number.isFinite(job.cost)) trackedCosts.set(job.runId, job.cost);\n }\n for (const [runId, run] of nativeRuns) {\n if (trackedCosts.has(runId) || run.cost === undefined || !Number.isFinite(run.cost)) continue;\n costs.set(runId, run.cost);\n }\n for (const [runId, cost] of trackedCosts) costs.set(runId, cost);\n\n let total = 0;\n for (const cost of costs.values()) total += cost;\n const text = total > 0 ? String(Number(total.toFixed(COST_DECIMALS))) : undefined;\n if (!force && text === previousText) return previousText;\n if (attached) client.setStatus(TEAM_COST_STATUS, text);\n return text;\n}\n\nconst root = defineRoot(({ context, host: serverHost, agent: host }: DoomServerPluginContext) => {\n if (!host) throw new Error('Team session requires the headless host.');\n if (serverHost.context.environment === undefined) {\n throw new Error('Team headless facet requires an admitted session environment.');\n }\n const directEvents = serverHost.context.directEvents;\n if (directEvents === undefined) {\n throw new Error('Team headless facet requires host-owned direct events.');\n }\n const execution = host.context;\n const runtime = createTeamExtensionRuntime(undefined, {\n environment: serverHost.context.environment,\n childSessions: { get: () => readDoomChildSessionService(context) },\n nativeRunProjection,\n });\n const scope = createSessionScope(execution.sessionId);\n runtime.management.bindSessionScope(scope);\n const jobs = runtime.asyncJobTracker.forSession(execution.sessionId, scope);\n const bridge = createDelegationBridge({\n planner: runtime.spawnPlanner,\n management: runtime.management,\n waiter: runtime.subagentWaiter,\n scheduler: runtime.pollScheduler,\n tracker: runtime.asyncJobTracker,\n loadConfig: () => loadConfig().config,\n });\n const nativeRuns = new Map<string, NativeAsyncJobProjection>();\n const childCosts = new Map<string, number>();\n let costText: string | undefined;\n let activityAttached = false;\n const publishRunSnapshot = (): void => {\n if (activityAttached) publishRuns(directEvents, execution.sessionId, jobs.list(), nativeRuns);\n };\n const publishCost = (force = false): void => {\n costText = updateTeamCost(execution.client, jobs.list(), nativeRuns, childCosts, costText, activityAttached, force);\n };\n const unsubscribeCostTracker = runtime.asyncJobTracker.subscribe(execution.sessionId, () => {\n publishCost();\n publishRunSnapshot();\n });\n const unsubscribeCostNative = subscribeNativeRunProjection(execution.sessionId, (runs) => {\n nativeRuns.clear();\n for (const run of runs) nativeRuns.set(run.runId, run);\n publishCost();\n publishRunSnapshot();\n });\n\n // Three jobs the Pi facet gets from one `ExtensionAPI.sendMessage`, which a\n // headless session has to do by hand:\n //\n // toast `client.notify` - operator-facing only. It writes a\n // `doom-notification` custom entry whose body is flattened to a\n // single line and capped at 4096 characters, and the model never\n // sees custom entries. So it gets a headline, not the result.\n // transcript `session.appendCustomEntry` - the durable record, under the\n // same custom type the TUI renderer uses, with the full\n // multi-line content and the structured details.\n // wake `session.admitPrompt(content, 'steer')` - the only call that\n // puts the completion in front of the model. 'steer' means \"how\n // to deliver if a turn is running\"; an idle agent is woken\n // either way. `session.prompt(_, 'steer')` would NOT do this: it\n // is enqueue-only and parks the message on an idle lane.\n //\n // Serialised through one tail promise. Failures bypass the notifier's batcher\n // (`services/notify`), so two runs failing in the same tick produce two\n // deliveries; sequencing them keeps each one observing settled lane state.\n let deliveries: Promise<void> = Promise.resolve();\n runtime.completionNotifier.attachHost({\n sendMessage: (message, options) => {\n const details = message.details ?? [];\n const headline = details.length > 0 ? formatCompletionHeadline(details) : message.content;\n const failed = details.some((detail) => detail.status !== 'completed');\n const delivery = deliveries.then(async () => {\n await execution.client.notify({ body: headline, level: failed ? 'warning' : 'info' });\n await execution.session.appendCustomEntry(SUBAGENT_NOTIFY_MESSAGE_TYPE, {\n content: message.content,\n details,\n });\n // `triggerTurn: false` has no faithful headless mapping: there is no\n // way to put text in model context without starting or joining a turn\n // (`appendCustomEntry` is journal-only). Keep today's behaviour - the\n // operator sees it, the model does not wake - rather than guessing.\n if (options?.triggerTurn === false) return;\n // Matching the voice facet, which also refuses rather than degrading:\n // `session.prompt(_, 'steer')` is NOT a fallback here, because it is\n // enqueue-only and would park the completion on an idle lane - the\n // original bug. Refusing surfaces as non-delivery, which keeps\n // `ResultWatcher`'s claim alive for a retry.\n if (!execution.session.admitPrompt) throw new Error('The session cannot admit a completion prompt.');\n await execution.session.admitPrompt(message.content, 'steer');\n });\n // The notifier reports non-delivery on a rejection, which keeps\n // `ResultWatcher`'s claim alive for a retry. The tail must not inherit\n // that rejection, or one failed completion would poison every later one.\n deliveries = delivery.catch(() => undefined);\n return delivery;\n },\n });\n const transport: NativeTeamTransport = {\n sendMessage: ((message) =>\n void execution.client.notify({\n body:\n typeof message.content === 'string'\n ? message.content\n : message.content.map((part) => ('text' in part ? part.text : '[image]')).join('\\n'),\n level: 'info',\n })) as NativeTeamTransport['sendMessage'],\n sendUserMessage: ((message) =>\n void execution.session.prompt(\n typeof message === 'string'\n ? message\n : message.map((part) => ('text' in part ? part.text : '[image]')).join('\\n'),\n 'steer',\n )) as NativeTeamTransport['sendUserMessage'],\n };\n const channel = runtime.teamChannel.createHeadlessRuntime(transport);\n const serverService = (ctx: Context) => {\n ctx.plugin((providerContext) => {\n const availableModels = execution.model ? [toModelInfo(execution.model)] : [];\n providerContext.provide(\n DOOM_DELEGATION_SERVICE,\n bridge.createService(providerContext, {\n sessionId: execution.sessionId,\n sessionScope: createSessionScope(execution.sessionId),\n availableModels,\n ...(execution.model ? { parentModel: execution.model } : {}),\n // Read fresh per request, exactly as the Pi facet does at root.cli.ts.\n // Omitting this is what made every headless `context: 'fork'`\n // delegation report that the parent had no capturable branch.\n captureForkSource: () => execution.session?.forkSource?.(),\n }),\n );\n const backgroundWork = readDoomBackgroundWorkService(providerContext);\n if (backgroundWork === undefined) throw new Error('Team requires the DoomPi Session foundation.');\n registerDirectRunBackgroundWork(providerContext, backgroundWork, execution.sessionId, runtime.asyncJobTracker);\n providerContext.provide(DOOM_SUBAGENT_POLICY_SERVICE, createSubagentPolicyService(runtime.capabilityPolicies));\n });\n };\n\n const environment = serverHost.context.environment;\n const activity: DoomHeadlessActivity = {\n name: '@agimon-ai/doompi-team',\n async start(activityContext) {\n activityAttached = true;\n publishCost(true);\n publishRunSnapshot();\n try {\n const discovered = runtime.discovery.discover(execution.cwd, 'both').agents;\n directEvents.publish(SUBAGENT_CATALOG_TYPE, execution.sessionId, {\n cwd: execution.cwd,\n agents: presentCatalog(discovered),\n models: catalogModels(discovered, resolveActiveTeamModelSpecs(environment) ?? []),\n });\n } catch (error) {\n directEvents.publish(SUBAGENT_CATALOG_TYPE, execution.sessionId, {\n cwd: execution.cwd,\n agents: [],\n models: [],\n warning: error instanceof Error ? error.message : String(error),\n });\n }\n try {\n const opened = await openScopeAsync(scope);\n if (opened.suspended.length)\n await activityContext.client.notify({ body: formatSuspendedRuns(opened.suspended), level: 'info' });\n channel.bindMainSession(activityContext.sessionId);\n return () => {\n if (!activityAttached) return;\n activityAttached = false;\n channel.dispose();\n execution.client.setStatus(TEAM_COST_STATUS, undefined);\n };\n } catch (error) {\n activityAttached = false;\n execution.client.setStatus(TEAM_COST_STATUS, undefined);\n throw error;\n }\n },\n };\n\n return {\n value: {\n runtime,\n execution,\n scope,\n jobs,\n bridge,\n channel,\n directEvents,\n environment: serverHost.context.environment,\n },\n services: [\n (context: Context) => {\n if (readDoomBackgroundWorkService(context) === undefined) provideBackgroundWorkService(context);\n },\n serverService,\n mountMcpTools([createHeadlessIntercomTool(channel), createHeadlessSubagentTool(runtime, execution)]),\n ],\n activities: [activity],\n // Mirrors `root.cli.ts`, which starts the scheduler in its own `onStart`.\n // Without this the delegation bridge's progress subscription never ticks\n // and `scheduler.wake()` is a no-op, so the pre-timeout nudge a long\n // delegation gets in the TUI never fires headless. `onDispose` below\n // already stops it; this is the missing half of that pair.\n onStart() {\n runtime.pollScheduler.start();\n },\n async onDispose() {\n activityAttached = false;\n execution.client.setStatus(TEAM_COST_STATUS, undefined);\n channel.dispose();\n runtime.completionNotifier.dispose();\n const suspension = suspendScopeRuns({\n scope,\n reason: 'headless session ended',\n jobs: jobs.list(),\n stop: (runId, reason) => runtime.management.stop(runId, reason),\n });\n const nativeShutdown = runtime.nativeRuns.close().finally(() => nativeRunProjection.dispose(execution.sessionId));\n const outcomes = await Promise.allSettled([suspension, nativeShutdown]);\n for (const outcome of outcomes) {\n if (outcome.status === 'rejected')\n process.emitWarning(`Could not shut down headless Team runs: ${String(outcome.reason)}`);\n }\n unsubscribeCostTracker();\n unsubscribeCostNative();\n nativeRuns.clear();\n childCosts.clear();\n costText = undefined;\n bridge.abandonAll();\n runtime.dispose();\n runtime.asyncJobTracker.stop();\n runtime.pollScheduler.stop();\n },\n };\n});\n\nexport type TeamServerScope = Awaited<ReturnType<typeof root>>['value'];\nexport default root;\n","import { defineRoot } from '@agimon-ai/doompi-core/extensionFile';\n\nimport contribution from './_lib/root.server';\n\nexport default defineRoot(contribution);\n","import { defineChannel } from '@agimon-ai/doompi-core/extensionFile';\nimport type {\n DoomHubChannelHost as HubChannelHost,\n DoomHubChannelSource as HubChannelSource,\n DoomHubSessionScope as HubSessionScope,\n DoomHubChannel as WebHubChannel,\n} from '@agimon-ai/doompi-core/hubChannel';\n\nimport { SUBAGENT_CATALOG_TYPE, type SubagentCatalogPayload } from '../../../../types/webSubagents';\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\nfunction isSubagentCatalogPayload(value: unknown): value is SubagentCatalogPayload {\n return (\n isRecord(value) &&\n typeof value.cwd === 'string' &&\n Array.isArray(value.agents) &&\n Array.isArray(value.models) &&\n value.models.every((model) => typeof model === 'string')\n );\n}\n\n/**\n * The subagent catalog data channel consumes the session-owned catalog event.\n * The direct event bus retains a bounded latest snapshot for late subscribers.\n */\nexport function createSubagentCatalogChannel(): WebHubChannel {\n return {\n frameType: SUBAGENT_CATALOG_TYPE,\n start(host: HubChannelHost) {\n const scopes = new Map<string, HubSessionScope>();\n const latest = new Map<string, SubagentCatalogPayload>();\n const subscriptions = new Map<string, () => void>();\n const publish = (scope: HubSessionScope, payload: SubagentCatalogPayload): void => {\n if (scopes.get(scope.sessionId) !== scope || payload.cwd !== scope.cwd) return;\n latest.set(scope.sessionId, payload);\n host.publish(scope.sessionId, payload);\n };\n const source: HubChannelSource = {\n payloadFor(scope) {\n return scopes.has(scope.sessionId) ? latest.get(scope.sessionId) : undefined;\n },\n sessionAdded(scope) {\n subscriptions.get(scope.sessionId)?.();\n scopes.set(scope.sessionId, scope);\n latest.delete(scope.sessionId);\n const unsubscribe = host.directEvents.subscribe(\n SUBAGENT_CATALOG_TYPE,\n scope.sessionId,\n (value) => {\n if (isSubagentCatalogPayload(value)) publish(scope, value);\n },\n { replayLatest: true },\n );\n subscriptions.set(scope.sessionId, unsubscribe);\n },\n sessionRemoved(sessionId) {\n subscriptions.get(sessionId)?.();\n subscriptions.delete(sessionId);\n scopes.delete(sessionId);\n latest.delete(sessionId);\n },\n close() {\n for (const unsubscribe of subscriptions.values()) unsubscribe();\n subscriptions.clear();\n scopes.clear();\n latest.clear();\n },\n };\n return source;\n },\n };\n}\n\nexport default defineChannel(createSubagentCatalogChannel);\n","import { defineChannel } from '@agimon-ai/doompi-core/extensionFile';\n\nimport contribution from './_lib/subagent-catalog';\n\nexport default defineChannel(contribution);\n","import { defineChannel } from '@agimon-ai/doompi-core/extensionFile';\nimport type {\n DoomHubChannelSource as HubChannelSource,\n DoomHubSessionScope,\n DoomHubChannel as WebHubChannel,\n} from '@agimon-ai/doompi-core/hubChannel';\n\nimport { SUBAGENT_RUNS_TYPE, type SubagentRun } from '../../../../types/webSubagents';\n\nconst RUN_ID_PATTERN = /^[\\w.-]+$/;\n\ninterface SessionRunProjection extends SubagentRun {\n /** Host-private child transcript path. Never published to the browser. */\n sessionFile?: string;\n}\n\ntype SessionRunProjectionPayload = { runs: SessionRunProjection[] };\ntype SubagentRunsPayload = { runs: SubagentRun[] };\n\nfunction isSubagentRunsPayload(value: unknown): value is SessionRunProjectionPayload {\n return typeof value === 'object' && value !== null && Array.isArray((value as { runs?: unknown }).runs);\n}\n\nfunction publicPayload(payload: SessionRunProjectionPayload): SubagentRunsPayload {\n return { runs: payload.runs.map(({ sessionFile: _sessionFile, ...run }) => run) };\n}\n\n/**\n * The built-in subagents data channel consumes current state from the\n * host-owned direct event bus. Its bounded latest replay seeds late subscribers.\n */\nexport function createSubagentsChannel(): WebHubChannel {\n return {\n frameType: SUBAGENT_RUNS_TYPE,\n start(host) {\n const scopes = new Map<string, DoomHubSessionScope>();\n const latest = new Map<string, SessionRunProjectionPayload>();\n const subscriptions = new Map<string, () => void>();\n const publish = (scope: DoomHubSessionScope, payload: SessionRunProjectionPayload): void => {\n if (scopes.get(scope.sessionId) !== scope) return;\n latest.set(scope.sessionId, payload);\n host.publish(scope.sessionId, publicPayload(payload));\n };\n const source: HubChannelSource = {\n payloadFor(scope) {\n const payload = scopes.has(scope.sessionId) ? latest.get(scope.sessionId) : undefined;\n return payload === undefined ? undefined : publicPayload(payload);\n },\n threadJournal(scope, runId) {\n if (!RUN_ID_PATTERN.test(runId)) return undefined;\n const projected = latest.get(scope.sessionId)?.runs.find((run) => run.runId === runId);\n return projected?.sessionFile;\n },\n sessionAdded(scope) {\n subscriptions.get(scope.sessionId)?.();\n scopes.set(scope.sessionId, scope);\n latest.delete(scope.sessionId);\n const unsubscribe = host.directEvents.subscribe(\n SUBAGENT_RUNS_TYPE,\n scope.sessionId,\n (value) => {\n if (isSubagentRunsPayload(value)) publish(scope, value);\n },\n { replayLatest: true },\n );\n subscriptions.set(scope.sessionId, unsubscribe);\n },\n sessionRemoved(sessionId) {\n subscriptions.get(sessionId)?.();\n subscriptions.delete(sessionId);\n scopes.delete(sessionId);\n latest.delete(sessionId);\n },\n close() {\n for (const unsubscribe of subscriptions.values()) unsubscribe();\n subscriptions.clear();\n scopes.clear();\n latest.clear();\n },\n };\n return source;\n },\n };\n}\n\nexport default defineChannel(createSubagentsChannel);\n","import { defineChannel } from '@agimon-ai/doompi-core/extensionFile';\n\nimport contribution from './_lib/subagent-runs';\n\nexport default defineChannel(contribution);\n","import type { WithRoot } from '@agimon-ai/doompi-core/extensionFile';\nimport type { DoomHeadlessExecutionContext } from '@agimon-ai/doompi-core/headless';\nimport type { DoomApi, DoomApiHandler } from '@agimon-ai/doompi-core/packageApi';\nimport type { DoomServerPluginContext } from '@agimon-ai/doompi-core/serverFacet';\n\nimport { AgentDiscoveryService, resolveActiveTeamModelSpecs } from '../../../../../../services/agentDiscovery';\nimport { loadConfig } from '../../../../../../services/config';\nimport { DoomTeamExpectedError } from '../../../../../../services/errors';\nimport type { ControlActionResult, SteerActionResult } from '../../../../../../services/managementActions';\nimport { toModelInfo } from '../../../../../../services/modelInfo';\nimport { createSessionScope } from '../../../../../../services/sessionPaths';\nimport type { TeamExtensionRuntime } from '../../../../../../services/teamRuntime';\nimport { catalogModels, presentCatalog, type CatalogAgentInput } from '../../../../../../services/webSubagentCatalog';\nimport type { TeamServerScope } from '../../_lib/root.server';\n\nexport const TEAM_API_BASE_PATH = 'team';\nexport const TEAM_CATALOG_ROUTE = '/catalog';\nexport const TEAM_RUN_ROUTE = '/run';\nexport const TEAM_STEER_ROUTE = '/steer';\nexport const TEAM_STOP_ROUTE = '/stop';\n\nexport interface TeamRunRequest {\n agent: string;\n task: string;\n fork: boolean;\n model?: string;\n}\n\nexport interface TeamSteerRequest {\n runId: string;\n message: string;\n}\n\nexport interface TeamStopRequest {\n runId: string;\n}\n\nexport interface TeamCatalogSnapshot {\n agents: CatalogAgentInput[];\n models: string[];\n}\n\nexport interface TeamApiOptions {\n cwd: string;\n environment?: Readonly<NodeJS.ProcessEnv>;\n read?: (cwd: string) => TeamCatalogSnapshot;\n launch?: (request: TeamRunRequest) => Promise<{ runId: string }>;\n steer?: (request: TeamSteerRequest, signal: AbortSignal) => Promise<SteerActionResult>;\n stop?: (request: TeamStopRequest) => Promise<ControlActionResult>;\n}\n\nfunction isRunRequest(value: unknown): value is TeamRunRequest {\n if (typeof value !== 'object' || value === null || Array.isArray(value)) return false;\n const request = value as Record<string, unknown>;\n return (\n typeof request.agent === 'string' &&\n request.agent.trim() !== '' &&\n typeof request.task === 'string' &&\n typeof request.fork === 'boolean' &&\n (request.model === undefined || (typeof request.model === 'string' && request.model.trim() !== '')) &&\n Object.keys(request).every((key) => ['agent', 'task', 'fork', 'model'].includes(key))\n );\n}\n\nfunction isSteerRequest(value: unknown): value is TeamSteerRequest {\n if (typeof value !== 'object' || value === null || Array.isArray(value)) return false;\n const request = value as Record<string, unknown>;\n return (\n typeof request.runId === 'string' &&\n request.runId.trim() !== '' &&\n typeof request.message === 'string' &&\n request.message.trim() !== '' &&\n Object.keys(request).every((key) => ['runId', 'message'].includes(key))\n );\n}\n\nfunction isStopRequest(value: unknown): value is TeamStopRequest {\n if (typeof value !== 'object' || value === null || Array.isArray(value)) return false;\n const request = value as Record<string, unknown>;\n return (\n typeof request.runId === 'string' &&\n request.runId.trim() !== '' &&\n Object.keys(request).every((key) => key === 'runId')\n );\n}\n\n/** The typed error's text carries a recovery hint written for the model, so a missing run gets a sentence for people. */\nfunction controlFailure(error: unknown): Response {\n if (error instanceof DoomTeamExpectedError && error.code === 'run_not_found')\n return Response.json({ error: 'This run is not active.' }, { status: 404 });\n return Response.json({ error: error instanceof Error ? error.message : String(error) }, { status: 409 });\n}\n\n/** Serves catalog discovery, run launch, and run steer and stop from the selected session process, never through a parent prompt. */\nexport function createTeamApiHandler(options: TeamApiOptions): DoomApiHandler {\n const discovery = new AgentDiscoveryService(options.environment);\n const read =\n options.read ??\n ((cwd: string): TeamCatalogSnapshot => ({\n agents: discovery.discover(cwd, 'both').agents,\n models: resolveActiveTeamModelSpecs(options.environment) ?? [],\n }));\n\n return {\n async fetch(request) {\n const url = new URL(request.url);\n if (request.method === 'POST' && url.pathname === TEAM_RUN_ROUTE && options.launch) {\n let input: unknown;\n try {\n input = await request.json();\n } catch {\n return Response.json({ error: 'Invalid run request.' }, { status: 400 });\n }\n if (!isRunRequest(input)) return Response.json({ error: 'Invalid run request.' }, { status: 400 });\n try {\n return Response.json(await options.launch(input), { status: 201 });\n } catch (error) {\n return Response.json({ error: error instanceof Error ? error.message : String(error) }, { status: 409 });\n }\n }\n if (request.method === 'POST' && url.pathname === TEAM_STEER_ROUTE && options.steer) {\n let input: unknown;\n try {\n input = await request.json();\n } catch {\n return Response.json({ error: 'Invalid steer request.' }, { status: 400 });\n }\n if (!isSteerRequest(input)) return Response.json({ error: 'Invalid steer request.' }, { status: 400 });\n try {\n return Response.json(\n await options.steer({ runId: input.runId.trim(), message: input.message.trim() }, request.signal),\n );\n } catch (error) {\n return controlFailure(error);\n }\n }\n if (request.method === 'POST' && url.pathname === TEAM_STOP_ROUTE && options.stop) {\n let input: unknown;\n try {\n input = await request.json();\n } catch {\n return Response.json({ error: 'Invalid stop request.' }, { status: 400 });\n }\n if (!isStopRequest(input)) return Response.json({ error: 'Invalid stop request.' }, { status: 400 });\n try {\n return Response.json(await options.stop({ runId: input.runId.trim() }));\n } catch (error) {\n return controlFailure(error);\n }\n }\n if (request.method !== 'GET' || url.pathname !== TEAM_CATALOG_ROUTE) {\n return Response.json({ error: 'Not found.' }, { status: 404 });\n }\n try {\n discovery.invalidate();\n const snapshot = read(options.cwd);\n return Response.json({\n cwd: options.cwd,\n agents: presentCatalog(snapshot.agents),\n models: catalogModels(snapshot.agents, snapshot.models),\n });\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n return Response.json({ error: message }, { status: 500 });\n }\n },\n close: () => undefined,\n };\n}\n\n/** One mounted session API, backed by the Team runtime that owns the subagent tool. */\nexport function createTeamSessionApi(runtime: TeamExtensionRuntime, execution: DoomHeadlessExecutionContext): DoomApi {\n const scope = createSessionScope(execution.sessionId);\n const jobs = runtime.asyncJobTracker.forSession(execution.sessionId, scope);\n\n const launch = async (request: TeamRunRequest): Promise<{ runId: string }> => {\n const parentForkSource = request.fork ? await execution.session.forkSource?.() : undefined;\n if (request.fork && !parentForkSource) throw new Error('This session cannot capture a fork source.');\n const plan = await runtime.spawnPlanner.spawn(\n {\n single: {\n agent: request.agent.trim(),\n task: request.task.trim(),\n context: request.fork ? 'fork' : 'fresh',\n ...(request.model ? { model: request.model } : {}),\n },\n cwd: execution.cwd,\n agentScope: 'both',\n sessionScope: scope,\n environment: execution.environment,\n parentSessionId: execution.sessionId,\n ...(parentForkSource ? { parentForkSource } : {}),\n availableModels: execution.model ? [toModelInfo(execution.model)] : [],\n ...(execution.model ? { parentModel: execution.model } : {}),\n },\n loadConfig().config,\n );\n const outcome = plan.outcomes[0];\n if (!outcome?.runId) throw new Error(outcome?.error ?? 'The agent did not start.');\n jobs.track(\n outcome.runId,\n outcome.identity ? { identity: outcome.identity, inline: outcome.inline ?? false } : undefined,\n );\n return { runId: outcome.runId };\n };\n\n return {\n basePath: TEAM_API_BASE_PATH,\n start: () =>\n createTeamApiHandler({\n cwd: execution.cwd,\n environment: execution.environment,\n launch,\n steer: (request, signal) => runtime.management.steer(request.runId, request.message, undefined, signal),\n stop: (request) => runtime.management.stop(request.runId),\n }),\n };\n}\n\nexport default (context: WithRoot<DoomServerPluginContext, TeamServerScope>) =>\n createTeamSessionApi(context.root.runtime, context.root.execution);\n","import { defineRoute } from '@agimon-ai/doompi-core/extensionFile';\n\nimport contribution from './_lib/route.server';\n\nexport default defineRoute(contribution);\n","import type { WithRoot } from '@agimon-ai/doompi-core/extensionFile';\nimport type { DoomServerPluginContext } from '@agimon-ai/doompi-core/serverFacet';\n\nimport { formatTeamContextSnapshot, readActiveTeamSnapshot } from '../../../../../../services/teamSnapshot';\nimport type { TeamServerScope } from '../../_lib/root.server';\n\n/**\n * The roster the model is allowed to see.\n *\n * Reads the public snapshot rather than `channel.current()`: the latter is the raw\n * `TeamMemberContext`, whose `token` is a session capability documented as never\n * leaving the direct context. A context resource is pasted into the system prompt,\n * sent to the provider and persisted, so the raw struct must not be serialized here.\n * `formatTeamContextSnapshot` is the same projection the Pi facet renders.\n */\nexport default (context: WithRoot<DoomServerPluginContext, TeamServerScope>) => ({\n name: 'doompi/team',\n kind: 'context' as const,\n // A roster of nobody says nothing; '' is dropped from the prompt by composeSystemPrompt.\n read: () => {\n const rendered = formatTeamContextSnapshot(readActiveTeamSnapshot(context.root.channel));\n return rendered === undefined || rendered === '(no active team members)' ? '' : rendered;\n },\n});\n","import { defineResource } from '@agimon-ai/doompi-core/extensionFile';\n\nimport contribution from './_lib/team.server';\n\nexport default defineResource(contribution);\n","import { defineServerTool, type WithRoot } from '@agimon-ai/doompi-core/extensionFile';\nimport type { DoomServerPluginContext } from '@agimon-ai/doompi-core/serverFacet';\n\nimport { createHeadlessIntercomTool } from '../../../../../services/headlessIntercomTool';\nimport type { TeamServerScope } from '../_lib/root.server';\n\nexport default defineServerTool((context: WithRoot<DoomServerPluginContext, TeamServerScope>) =>\n createHeadlessIntercomTool(context.root.channel),\n);\n","import { defineServerTool, type WithRoot } from '@agimon-ai/doompi-core/extensionFile';\nimport type { DoomServerPluginContext } from '@agimon-ai/doompi-core/serverFacet';\n\nimport { createHeadlessSubagentTool } from '../../../../../services/headlessSubagentTool';\nimport type { TeamServerScope } from '../_lib/root.server';\n\nexport default defineServerTool((context: WithRoot<DoomServerPluginContext, TeamServerScope>) =>\n createHeadlessSubagentTool(context.root.runtime, context.root.execution),\n);\n","// Generated by @agimon-ai/doompi-build. Do not edit by hand.\nimport { defineServerPlugin, type DoomServerSessionPlugin } from '@agimon-ai/doompi-core/serverFacet';\nimport { composeRootHooks } from '@agimon-ai/doompi-core/extensionFile';\n\nimport rootSession from '../src/extensions/workspaces/sessions/(backend)/root.server';\nimport channelSubagentCatalog from '../src/extensions/(backend)/channel/subagent-catalog.server';\nimport channelSubagentRuns from '../src/extensions/(backend)/channel/subagent-runs.server';\nimport apiRoute from '../src/extensions/workspaces/sessions/(backend)/api/route.server';\nimport resourceTeam from '../src/extensions/workspaces/sessions/(backend)/resource/team.server';\nimport toolIntercom from '../src/extensions/workspaces/sessions/(backend)/tool/intercom.server';\nimport toolSubagent from '../src/extensions/workspaces/sessions/(backend)/tool/subagent.server';\n\ntype Factory<T, C> = (context: C) => T;\nconst at = <T, C>(value: T | Factory<T, C>, context: C): T =>\n typeof value === 'function' ? (value as Factory<T, C>)(context) : value;\nconst via = <T>(identity: Record<string, unknown>, value: unknown): T =>\n (value === undefined ? undefined : { ...identity, ...(value as object) }) as T;\n\nexport const facet = defineServerPlugin({\n name: '@agimon-ai/doompi-team',\n global: () => ({\n get channels(): DoomServerSessionPlugin['channels'] { return [() => via({ frameType: 'subagent_catalog' }, channelSubagentCatalog()), () => via({ frameType: 'subagent_runs' }, channelSubagentRuns())]; },\n }),\n workspace: () => ({\n get channels(): DoomServerSessionPlugin['channels'] { return [() => via({ frameType: 'subagent_catalog' }, channelSubagentCatalog()), () => via({ frameType: 'subagent_runs' }, channelSubagentRuns())]; },\n }),\n session: async (context) => {\n const scopeSession = await rootSession(context);\n const contextSession = { ...context, root: scopeSession.value };\n return {\n ...composeRootHooks(scopeSession),\n get api(): DoomServerSessionPlugin['api'] { return [at(apiRoute, contextSession)]; },\n get channels(): DoomServerSessionPlugin['channels'] { return [() => via({ frameType: 'subagent_catalog' }, channelSubagentCatalog()), () => via({ frameType: 'subagent_runs' }, channelSubagentRuns())]; },\n get resources(): DoomServerSessionPlugin['resources'] { return [at(resourceTeam, contextSession)]; },\n get tools(): DoomServerSessionPlugin['tools'] { return [via({ name: 'intercom' }, at(toolIntercom, contextSession)), via({ name: 'subagent' }, at(toolSubagent, contextSession))]; },\n services: [...(scopeSession.services ?? [])],\n get activities(): DoomServerSessionPlugin['activities'] { return [...(scopeSession.activities ?? [])]; },\n };\n },\n});\n\nexport default facet;\n"],"mappings":"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"}
1
+ {"version":3,"file":"server.cjs","names":["TeamToolParamsSchema","toDoomHeadlessToolResult","createSessionScope","toModelInfo","SubagentToolSchema","validateSubagentParams","SUBAGENT_ACTIONS","DoomTeamExpectedError","formatAgentDetail","publicAgent","formatAgentList","loadConfig","formatFleetView","formatRunTranscript","listSuspendedRuns","formatSuspendedRuns","resolveTrackedRunId","isSuspendedRunResumable","defineRoot","createTeamExtensionRuntime","readDoomChildSessionService","createSessionScope","createDelegationBridge","loadConfig","formatCompletionHeadline","SUBAGENT_NOTIFY_MESSAGE_TYPE","toModelInfo","DOOM_DELEGATION_SERVICE","readDoomBackgroundWorkService","DOOM_SUBAGENT_POLICY_SERVICE","createSubagentPolicyService","resolveActiveTeamModelSpecs","openScopeAsync","formatSuspendedRuns","suspendScopeRuns","defineRoot","contribution","defineChannel","defineChannel","contribution","defineChannel","defineChannel","contribution","DoomTeamExpectedError","AgentDiscoveryService","resolveActiveTeamModelSpecs","createSessionScope","toModelInfo","loadConfig","defineRoute","contribution","formatTeamContextSnapshot","readActiveTeamSnapshot","defineResource","contribution","defineServerTool","defineServerTool","defineServerPlugin","channelSubagentCatalog","channelSubagentRuns","rootSession","composeRootHooks","apiRoute","resourceTeam","toolIntercom","toolSubagent"],"sources":["../../src/services/headlessIntercomTool/index.ts","../../src/services/headlessSubagentTool/index.ts","../../src/services/mcpTools/index.ts","../../src/services/nativeRunProjection/index.ts","../../src/services/webSubagentCatalog/index.ts","../../src/types/webSubagents.ts","../../src/extensions/workspaces/sessions/(backend)/_lib/root.server.ts","../../src/extensions/workspaces/sessions/(backend)/root.server.ts","../../src/extensions/(backend)/channel/_lib/subagent-catalog.ts","../../src/extensions/(backend)/channel/subagent-catalog.server.ts","../../src/extensions/(backend)/channel/_lib/subagent-runs.ts","../../src/extensions/(backend)/channel/subagent-runs.server.ts","../../src/extensions/workspaces/sessions/(backend)/api/_lib/route.server.ts","../../src/extensions/workspaces/sessions/(backend)/api/route.server.ts","../../src/extensions/workspaces/sessions/(backend)/resource/_lib/team.server.ts","../../src/extensions/workspaces/sessions/(backend)/resource/team.server.ts","../../src/extensions/workspaces/sessions/(backend)/tool/intercom.server.ts","../../src/extensions/workspaces/sessions/(backend)/tool/subagent.server.ts","../../generated/server.ts"],"sourcesContent":["import { toDoomHeadlessToolResult, type DoomHeadlessTool } from '@agimon-ai/doompi-core/headless';\n\nimport { TeamToolParamsSchema, type NativeTeamRuntime } from '../nativeTeamChannel';\n\nexport function createHeadlessIntercomTool(channel: NativeTeamRuntime): DoomHeadlessTool<typeof TeamToolParamsSchema> {\n return {\n name: 'intercom',\n label: 'Intercom',\n description: 'Communicate with active agents in this root session.',\n parameters: TeamToolParamsSchema,\n promptGuidelines: [\n 'Send only new progress, blockers, or decisions. Do not repeat task briefs or delegation instructions.',\n ],\n executionMode: 'serial',\n async execute(toolCallId, parameters, signal, onUpdate) {\n return toDoomHeadlessToolResult(\n await channel.execute(\n toolCallId,\n parameters,\n signal,\n onUpdate && ((partial) => onUpdate(toDoomHeadlessToolResult(partial))),\n ),\n );\n },\n };\n}\n","import type {\n DoomHeadlessExecutionContext,\n DoomHeadlessTool,\n DoomHeadlessToolResult,\n} from '@agimon-ai/doompi-core/headless';\n\nimport { SUBAGENT_ACTIONS, SubagentToolSchema, type SubagentToolParams } from '../../schemas/subagentTool';\nimport { resolveTrackedRunId } from '../asyncJobTracker';\nimport { loadConfig } from '../config';\nimport { DoomTeamExpectedError } from '../errors';\nimport { toModelInfo } from '../modelInfo';\nimport { createSessionScope } from '../sessionPaths';\nimport type { SpawnPlanResult } from '../spawnPlan';\nimport { formatFleetView, formatRunTranscript } from '../statusViews';\nimport {\n formatAgentDetail,\n formatAgentList,\n publicAgent,\n validateParams as validateSubagentParams,\n} from '../subagentTool';\nimport { clearSuspendedRun, formatSuspendedRuns, isSuspendedRunResumable, listSuspendedRuns } from '../suspendedRuns';\nimport { createTeamExtensionRuntime } from '../teamRuntime';\n\nconst SUBAGENT_DESCRIPTION =\n 'Discover agents, start and manage persistent background subagent runs, and inspect suspended work.';\n\n/**\n * Every result carries the text the MODEL reads and the structured details the\n * cockpit card reads. The text is always given explicitly: a serialized detail\n * object is not a tool result a model can act on, and the old default made that\n * the easy mistake to make.\n */\nfunction result(text: string, details: unknown, isError = false): DoomHeadlessToolResult {\n return { content: [{ type: 'text', text }], details, ...(isError ? { isError: true } : {}) };\n}\n\n/** The launch report, worded as the Pi path words it, next step included. */\nfunction formatSpawnPlan(plan: SpawnPlanResult): string {\n const started = plan.outcomes.filter((outcome) => outcome.runId);\n const failed = plan.outcomes.filter((outcome) => !outcome.runId);\n const lines = plan.outcomes.map(\n (outcome) =>\n `- ${outcome.agent}: ${outcome.runId ? outcome.runId : `failed: ${outcome.error ?? 'unknown error'}`}${outcome.warning ? `\\n Warning: ${outcome.warning}` : ''}`,\n );\n const label = plan.outcomes.length === 1 ? 'subagent' : 'subagents';\n const summary =\n failed.length === 0\n ? `Started ${started.length} ${label}:`\n : `Started ${started.length}/${plan.outcomes.length} ${label}; ${failed.length} failed:`;\n const next =\n failed.length === 0\n ? 'Completion will arrive asynchronously. Continue only non-overlapping work, or end your turn.'\n : 'Completion will arrive asynchronously for started runs. Do not resubmit them; retry only corrected failed entries.';\n return [summary, ...lines, '', next].join('\\n');\n}\n\nfunction scopeOf(value: string | undefined): 'user' | 'project' | 'both' {\n return value === 'user' || value === 'project' ? value : 'both';\n}\n\nexport function createHeadlessSubagentTool(\n runtime: ReturnType<typeof createTeamExtensionRuntime>,\n execution: DoomHeadlessExecutionContext,\n): DoomHeadlessTool<typeof SubagentToolSchema> {\n const scope = createSessionScope(execution.sessionId);\n const jobs = runtime.asyncJobTracker.forSession(execution.sessionId, scope);\n const availableModels = execution.model ? [toModelInfo(execution.model)] : [];\n return {\n name: 'subagent',\n label: 'Subagent',\n description: SUBAGENT_DESCRIPTION,\n parameters: SubagentToolSchema,\n promptSnippet: 'Discover, run, inspect, steer, stop, and restore persistent subagents',\n promptGuidelines: [\n 'Runs are persistent background work. Do not resubmit a run that already returned an id.',\n 'Use status or suspended before retrying a failed or interrupted operation.',\n ],\n executionMode: 'serial',\n async execute(_toolCallId, parameters, signal, onUpdate) {\n try {\n const params: SubagentToolParams = validateSubagentParams(parameters);\n if (params.action === SUBAGENT_ACTIONS.agents) {\n const scope = scopeOf(params.scope);\n const agents = runtime.discovery.discover(params.cwd ?? execution.cwd, scope).agents;\n const selected = params.name\n ? runtime.discovery.find(params.cwd ?? execution.cwd, scope, params.name)\n : undefined;\n if (params.name && !selected)\n throw new DoomTeamExpectedError(\n 'agent_not_found',\n `No executable agent matches '${params.name}'.`,\n false,\n 'Call subagent({\"action\":\"agents\"}) and retry with an exact agent name.',\n );\n if (selected) return result(formatAgentDetail(selected), { agents: [publicAgent(selected)] });\n return result(formatAgentList(agents), {\n agents: agents.map((agent) => ({\n name: agent.name,\n source: agent.source,\n description: agent.description,\n runtime: agent.runtime ?? 'pi',\n })),\n });\n }\n if (params.action === SUBAGENT_ACTIONS.run) {\n onUpdate?.(\n result(`Starting ${params.requests.length} subagent${params.requests.length === 1 ? '' : 's'}...`, {\n action: params.action,\n partial: true,\n }),\n );\n // An agent whose resolved default context is `fork` needs a parent\n // branch here too, not only on the delegation path. Accessed\n // defensively: a host that cannot offer a branch must degrade to a\n // fresh child, never fail the launch.\n const parentForkSource = await execution.session?.forkSource?.();\n const plan = await runtime.spawnPlanner.spawn(\n {\n tasks: params.requests.map((request) => ({\n agent: request.agent.trim(),\n task: request.task.trim(),\n ...(request.inlineAgent ? { inlineAgent: request.inlineAgent } : {}),\n ...(request.cwd ? { cwd: request.cwd } : {}),\n ...(request.model ? { model: request.model } : {}),\n ...(request.runtime ? { runtime: request.runtime } : {}),\n })),\n cwd: execution.cwd,\n agentScope: scopeOf(params.scope),\n sessionScope: createSessionScope(execution.sessionId),\n environment: execution.environment,\n parentSessionId: execution.sessionId,\n ...(params.concurrency === undefined ? {} : { concurrency: params.concurrency }),\n ...(params.artifacts === undefined ? {} : { artifacts: params.artifacts }),\n availableModels,\n ...(execution.model ? { parentModel: execution.model } : {}),\n ...(parentForkSource ? { parentForkSource } : {}),\n },\n loadConfig().config,\n );\n for (const outcome of plan.outcomes) {\n if (outcome.runId) {\n jobs.track(\n outcome.runId,\n outcome.identity ? { identity: outcome.identity, inline: outcome.inline ?? false } : undefined,\n );\n }\n }\n return result(formatSpawnPlan(plan), plan);\n }\n if (params.action === SUBAGENT_ACTIONS.status) {\n if (!('id' in params)) {\n const runs = jobs.list();\n return result(formatFleetView(runs), { runs });\n }\n const status = runtime.management.statusAsync\n ? await runtime.management.statusAsync(params.id)\n : runtime.management.status(params.id);\n const statusText = status.status\n ? [\n `Run '${status.runId}': ${status.status.state}`,\n status.status.summary ? `Summary: ${status.status.summary}` : undefined,\n ]\n .filter((line): line is string => line !== undefined)\n .join('\\n')\n : `Run '${status.runId}' has no status yet.`;\n const transcript =\n params.transcriptLines === undefined\n ? undefined\n : formatRunTranscript(status.status, params.transcriptLines);\n return result([statusText, transcript].filter((text): text is string => text !== undefined).join('\\n\\n'), {\n runId: status.runId,\n status: status.status,\n });\n }\n if (params.action === SUBAGENT_ACTIONS.suspended) {\n const suspended = listSuspendedRuns(createSessionScope(execution.sessionId));\n const text = suspended.length ? formatSuspendedRuns(suspended) : 'No suspended subagents in this session.';\n return result(text, { suspended, text });\n }\n const id = resolveTrackedRunId(jobs, params.id);\n if (params.action === SUBAGENT_ACTIONS.stop) {\n const control = await runtime.management.stop(id, params.reason);\n return result(`Stop requested for '${id}'.`, { runId: id, control });\n }\n if (params.action === SUBAGENT_ACTIONS.steer) {\n const steer = await runtime.management.steer(id, params.message, undefined, signal);\n return result(`Steer request '${steer.requestId}' for '${id}' is ${steer.state}: ${steer.message}`, {\n runId: id,\n steer,\n });\n }\n const suspended = listSuspendedRuns(createSessionScope(execution.sessionId)).find(\n (item) => item.runId === params.id,\n );\n if (!suspended) throw new Error(`No suspended run matches '${params.id}'.`);\n if (!isSuspendedRunResumable(suspended)) throw new Error(`Suspended run '${params.id}' is not resumable.`);\n const restored = await runtime.spawnPlanner.spawn(\n {\n single: {\n agent: suspended.agent,\n ...(suspended.inlineAgent ? { inlineAgent: suspended.inlineAgent } : {}),\n task: suspended.task,\n cwd: suspended.cwd,\n ...(suspended.model ? { model: suspended.model } : {}),\n sessionFile: suspended.sessionFile,\n ...(suspended.identity ? { identity: suspended.identity } : {}),\n },\n cwd: suspended.cwd,\n agentScope: 'both',\n sessionScope: createSessionScope(execution.sessionId),\n environment: execution.environment,\n runtime: 'pi',\n parentSessionId: execution.sessionId,\n availableModels,\n },\n loadConfig().config,\n );\n const outcome = restored.outcomes[0];\n if (!outcome?.runId)\n throw new Error(`Could not restore '${params.id}': ${outcome?.error ?? 'the spawn produced no run.'}`);\n clearSuspendedRun(createSessionScope(execution.sessionId), params.id);\n return result(`Restored '${params.id}' as '${outcome.runId}', continuing its transcript.`, {\n restore: { ...outcome, restoredFrom: params.id },\n });\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n return result(message, message, true);\n }\n },\n };\n}\n","import type { DoomHeadlessTool } from '@agimon-ai/doompi-core/headless';\nimport type { DoomMcpPluginContext } from '@agimon-ai/doompi-core/mcpFacet';\nimport type { Context } from '@deepseek-ai/cordis';\n\nexport const TEAM_MCP_TOOLS_SERVICE = 'doom/team-mcp-tools';\n\nexport interface McpToolCatalog {\n get(name: string): DoomHeadlessTool | undefined;\n}\n\nexport function mountMcpTools(tools: readonly DoomHeadlessTool[]) {\n return (context: Context): void => {\n context.plugin((providerContext) => {\n providerContext.provide(TEAM_MCP_TOOLS_SERVICE, {\n get: (name) => tools.find((tool) => tool.name === name),\n } satisfies McpToolCatalog);\n });\n };\n}\n\nexport function bindMcpTool(context: DoomMcpPluginContext, name: string): DoomHeadlessTool {\n const tool = context.services.get<McpToolCatalog>(TEAM_MCP_TOOLS_SERVICE)?.get(name);\n if (!tool) throw new Error(`Team tool is unavailable: ${name}`);\n return {\n ...tool,\n execute(toolCallId, parameters, signal, onUpdate) {\n const executionSignal = AbortSignal.any([context.signal, signal ?? context.signal]);\n return tool.execute(toolCallId, parameters, executionSignal, onUpdate, context.execution);\n },\n };\n}\n","import type { NativeAsyncJobProjection } from '../asyncJobTracker';\n\nexport type NativeRunProjectionListener = (runs: readonly NativeAsyncJobProjection[]) => void;\n\nexport interface NativeRunProjectionSink {\n publish(sessionId: string, projection: NativeAsyncJobProjection): void;\n dispose(sessionId: string): void;\n}\n\ninterface SessionProjection {\n readonly runs: Map<string, NativeAsyncJobProjection>;\n readonly listeners: Set<NativeRunProjectionListener>;\n}\n\nconst sessions = new Map<string, SessionProjection>();\n\nfunction projectionFor(sessionId: string): SessionProjection {\n let projection = sessions.get(sessionId);\n if (!projection) {\n projection = { runs: new Map(), listeners: new Set() };\n sessions.set(sessionId, projection);\n }\n return projection;\n}\n\nfunction snapshot(projection: SessionProjection): readonly NativeAsyncJobProjection[] {\n return [...projection.runs.values()];\n}\n\nexport const nativeRunProjection: NativeRunProjectionSink = {\n publish(sessionId, run) {\n const projection = projectionFor(sessionId);\n projection.runs.set(run.runId, run);\n const runs = snapshot(projection);\n for (const listener of projection.listeners) listener(runs);\n },\n dispose(sessionId) {\n const projection = sessions.get(sessionId);\n if (!projection) return;\n for (const listener of projection.listeners) listener([]);\n projection.listeners.clear();\n projection.runs.clear();\n sessions.delete(sessionId);\n },\n};\n\nexport function subscribeNativeRunProjection(sessionId: string, listener: NativeRunProjectionListener): () => void {\n const projection = projectionFor(sessionId);\n projection.listeners.add(listener);\n if (projection.runs.size > 0) listener(snapshot(projection));\n\n let closed = false;\n return () => {\n if (closed) return;\n closed = true;\n projection.listeners.delete(listener);\n if (projection.listeners.size === 0 && projection.runs.size === 0) sessions.delete(sessionId);\n };\n}\n","import type { SubagentCatalogAgent, SubagentCatalogSource } from '../../types/webSubagents';\n\n/** The fields the catalog reads off an agent definition; an AgentConfig satisfies it. */\nexport interface CatalogAgentInput {\n name: string;\n packageName?: string;\n description: string;\n model?: string;\n fallbackModels?: string[];\n tools?: string[];\n skills?: string[];\n extensions?: string[];\n defaultContext?: 'fresh' | 'fork';\n source: SubagentCatalogSource;\n filePath: string;\n}\n\n/** Nearest definition first: the order shadowing resolves in. */\nconst SOURCE_ORDER: Readonly<Record<SubagentCatalogSource, number>> = { project: 0, user: 1, plugin: 2 };\nconst DEFAULT_CONTEXT = 'fresh';\n\nexport function catalogAgentOf(agent: CatalogAgentInput): SubagentCatalogAgent {\n return {\n name: agent.name,\n source: agent.source,\n ...(agent.packageName === undefined ? {} : { packageName: agent.packageName }),\n description: agent.description,\n ...(agent.model === undefined ? {} : { model: agent.model }),\n fallbackModels: agent.fallbackModels ?? [],\n tools: agent.tools ?? [],\n skills: agent.skills ?? [],\n extensions: agent.extensions ?? [],\n defaultContext: agent.defaultContext ?? DEFAULT_CONTEXT,\n filePath: agent.filePath,\n };\n}\n\n/** The catalog's order: by source, nearest first, then by name. */\nexport function presentCatalog(agents: readonly CatalogAgentInput[]): SubagentCatalogAgent[] {\n return agents\n .map(catalogAgentOf)\n .sort((a, b) => SOURCE_ORDER[a.source] - SOURCE_ORDER[b.source] || a.name.localeCompare(b.name));\n}\n\n/** Every model spec a launch could name: the team's offer plus whatever the definitions pin, deduplicated in order. */\nexport function catalogModels(agents: readonly CatalogAgentInput[], teamModels: readonly string[]): string[] {\n const seen = new Set<string>();\n const models: string[] = [];\n for (const model of [\n ...teamModels,\n ...agents.flatMap((agent) => [agent.model ?? '', ...(agent.fallbackModels ?? [])]),\n ]) {\n if (model === '' || seen.has(model)) continue;\n seen.add(model);\n models.push(model);\n }\n return models;\n}\n","/**\n * Subagent run view types shared by this package's hub channel and its web\n * plugin. The shapes mirror the per-run status files this package's own\n * runtime writes; the cockpit renders them as 'subagent_runs' channel\n * payloads.\n */\n\n/** Coarse run state the cockpit renders; rawState keeps doom-team's exact word. */\nexport type SubagentRunState = 'queued' | 'running' | 'done' | 'failed' | 'stopped';\n\n/**\n * One subagent run of a session, read from doom-team's per-run status file.\n */\nexport interface SubagentRun {\n runId: string;\n agent: string;\n /**\n * Generated addressable identity, for example `alan-reviewer-3`.\n *\n * Additive and optional: a run projected before identities existed, and any\n * run whose claim could not be written, still arrives without one.\n */\n identity?: string;\n /** True when this run came from a one-shot inline agent definition. */\n inline?: boolean;\n state: SubagentRunState;\n rawState: string;\n /** The delegation prompt the main agent gave this run. */\n task: string;\n /** A doom-task binding, when the delegation named one; wins over task in the card. */\n taskRef?: string;\n model?: string;\n cwd: string;\n /** The child transcript path, when the session host exposes one. */\n sessionFile?: string;\n /** Epoch milliseconds, as doom-team writes them. */\n startedAt: number;\n endedAt?: number;\n lastUpdate: number;\n /** Live one-liner of what the run is doing right now. */\n currentTool?: string;\n toolCount?: number;\n tokens?: number;\n cost?: number;\n /** Final report, present once the run finished. */\n summary?: string;\n /** Failure reason, present when the run failed. */\n error?: string;\n /** Recent output lines, oldest first, capped. */\n tail: string[];\n}\n\nexport const SUBAGENT_RUNS_TYPE = 'subagent_runs';\n\n/** How the runtime answered one steer: delivered, refused by the run, or not yet acknowledged. */\nexport interface SubagentSteerResult {\n state: 'delivered' | 'failed' | 'pending';\n message: string;\n}\n/** Where an agent definition came from; the catalog groups by it, nearest first. */\nexport type SubagentCatalogSource = 'project' | 'user' | 'plugin';\n\n/** One launchable agent, as the catalog lists it. */\nexport interface SubagentCatalogAgent {\n name: string;\n source: SubagentCatalogSource;\n /** The package that staged a plugin agent. */\n packageName?: string;\n description: string;\n /** The model the definition pins; absent means the runtime's default. */\n model?: string;\n fallbackModels: string[];\n /** Empty means the definition does not narrow the tool set. */\n tools: string[];\n skills: string[];\n extensions: string[];\n defaultContext: 'fresh' | 'fork';\n filePath: string;\n}\n\n/** The 'subagent_catalog' channel payload: the agents a session's directory can launch. */\nexport interface SubagentCatalogPayload {\n cwd: string;\n agents: SubagentCatalogAgent[];\n /** Model specs the active team package offers, for the launch dialog's picker. */\n models: string[];\n /** Why the list may be incomplete, when discovery failed. */\n warning?: string;\n}\n\nexport const SUBAGENT_CATALOG_TYPE = 'subagent_catalog';\n","import { readDoomBackgroundWorkService } from '@agimon-ai/doompi-core/backgroundWork';\nimport { readDoomChildSessionService } from '@agimon-ai/doompi-core/childSession';\nimport { DOOM_DELEGATION_SERVICE } from '@agimon-ai/doompi-core/delegation';\nimport { defineRoot } from '@agimon-ai/doompi-core/extensionFile';\nimport type { DoomHeadlessActivity } from '@agimon-ai/doompi-core/headless';\nimport type { DoomDirectEventBus } from '@agimon-ai/doompi-core/hubChannel';\nimport type { DoomServerPluginContext } from '@agimon-ai/doompi-core/serverFacet';\nimport { provideBackgroundWorkService } from '@agimon-ai/doompi-session';\nimport type { Context } from '@deepseek-ai/cordis';\n\nimport { DOOM_SUBAGENT_POLICY_SERVICE } from '../../../../../schemas/subagentPolicy';\nimport { resolveActiveTeamModelSpecs } from '../../../../../services/agentDiscovery';\nimport type { NativeAsyncJobProjection, TrackedAsyncJob } from '../../../../../services/asyncJobTracker';\nimport { loadConfig } from '../../../../../services/config';\nimport { createDelegationBridge } from '../../../../../services/delegationBridge';\nimport { registerDirectRunBackgroundWork } from '../../../../../services/directRunBackgroundWork';\nimport { createHeadlessIntercomTool } from '../../../../../services/headlessIntercomTool';\nimport { createHeadlessSubagentTool } from '../../../../../services/headlessSubagentTool';\nimport { mountMcpTools } from '../../../../../services/mcpTools';\nimport { toModelInfo } from '../../../../../services/modelInfo';\nimport { nativeRunProjection } from '../../../../../services/nativeRunProjection';\nimport { subscribeNativeRunProjection } from '../../../../../services/nativeRunProjection';\nimport type { NativeTeamTransport } from '../../../../../services/nativeTeamChannel';\nimport { formatCompletionHeadline, SUBAGENT_NOTIFY_MESSAGE_TYPE } from '../../../../../services/notify';\nimport { openScopeAsync, suspendScopeRuns } from '../../../../../services/sessionLifecycle';\nimport { createSessionScope } from '../../../../../services/sessionPaths';\nimport { createSubagentPolicyService } from '../../../../../services/subagentPolicyService';\nimport { formatSuspendedRuns } from '../../../../../services/suspendedRuns';\nimport { createTeamExtensionRuntime } from '../../../../../services/teamRuntime';\nimport { catalogModels, presentCatalog } from '../../../../../services/webSubagentCatalog';\nimport {\n SUBAGENT_CATALOG_TYPE,\n SUBAGENT_RUNS_TYPE,\n type SubagentRun,\n type SubagentRunState,\n} from '../../../../../types/webSubagents';\n\ninterface SessionRunProjection extends SubagentRun {\n /** Host-private child transcript path consumed by the hub, not the browser. */\n sessionFile?: string;\n}\n\nconst TERMINAL_RUN_STATES = new Set(['completed', 'complete', 'failed', 'stopped', 'paused']);\n\nfunction runState(status: string): SubagentRunState {\n if (status === 'completed' || status === 'complete') return 'done';\n if (status === 'failed') return 'failed';\n if (status === 'stopped' || status === 'paused') return 'stopped';\n if (status === 'queued') return 'queued';\n return 'running';\n}\n\nfunction presentTrackedRun(run: TrackedAsyncJob): SessionRunProjection | undefined {\n if (!run.agent || !run.status || run.startedAt === undefined) return undefined;\n const lastUpdate = run.updatedAt ?? run.startedAt;\n return {\n runId: run.runId,\n agent: run.agent,\n ...(run.identity === undefined ? {} : { identity: run.identity }),\n ...(run.inline === undefined ? {} : { inline: run.inline }),\n state: runState(run.status),\n rawState: run.status,\n task: run.task ?? '',\n cwd: run.cwd ?? '',\n startedAt: run.startedAt,\n ...(TERMINAL_RUN_STATES.has(run.status) ? { endedAt: lastUpdate } : {}),\n lastUpdate,\n tail: [],\n ...(run.sessionFile === undefined ? {} : { sessionFile: run.sessionFile }),\n ...(run.summary === undefined ? {} : { summary: run.summary }),\n ...(run.error === undefined ? {} : { error: run.error }),\n };\n}\n\nfunction presentNativeRun(run: NativeAsyncJobProjection): SessionRunProjection {\n return {\n runId: run.runId,\n agent: run.agent,\n ...(run.identity === undefined ? {} : { identity: run.identity }),\n ...(run.inline === undefined ? {} : { inline: run.inline }),\n state: runState(run.status),\n rawState: run.status,\n task: run.task,\n cwd: run.cwd,\n startedAt: run.startedAt,\n ...(TERMINAL_RUN_STATES.has(run.status) ? { endedAt: run.updatedAt } : {}),\n lastUpdate: run.updatedAt,\n tail: [],\n ...(run.sessionFile === undefined ? {} : { sessionFile: run.sessionFile }),\n ...(run.summary === undefined ? {} : { summary: run.summary }),\n ...(run.error === undefined ? {} : { error: run.error }),\n };\n}\n\nfunction publishRuns(\n directEvents: DoomDirectEventBus,\n sessionId: string,\n jobs: readonly TrackedAsyncJob[],\n nativeRuns: ReadonlyMap<string, NativeAsyncJobProjection>,\n): void {\n const runs = jobs\n .filter((job) => !job.native)\n .map(presentTrackedRun)\n .filter((run): run is SessionRunProjection => run !== undefined);\n runs.push(...[...nativeRuns.values()].map(presentNativeRun));\n directEvents.publish(SUBAGENT_RUNS_TYPE, sessionId, { runs });\n}\n\nconst TEAM_COST_STATUS = 'doom-team-cost';\nconst COST_DECIMALS = 6;\n\nfunction updateTeamCost(\n client: { setStatus(source: string, text: string | undefined): void },\n jobs: readonly TrackedAsyncJob[],\n nativeRuns: ReadonlyMap<string, NativeAsyncJobProjection>,\n costs: Map<string, number>,\n previousText: string | undefined,\n attached: boolean,\n force = false,\n): string | undefined {\n const trackedCosts = new Map<string, number>();\n for (const job of jobs) {\n if (job.cost !== undefined && Number.isFinite(job.cost)) trackedCosts.set(job.runId, job.cost);\n }\n for (const [runId, run] of nativeRuns) {\n if (trackedCosts.has(runId) || run.cost === undefined || !Number.isFinite(run.cost)) continue;\n costs.set(runId, run.cost);\n }\n for (const [runId, cost] of trackedCosts) costs.set(runId, cost);\n\n let total = 0;\n for (const cost of costs.values()) total += cost;\n const text = total > 0 ? String(Number(total.toFixed(COST_DECIMALS))) : undefined;\n if (!force && text === previousText) return previousText;\n if (attached) client.setStatus(TEAM_COST_STATUS, text);\n return text;\n}\n\nconst root = defineRoot(({ context, host: serverHost, agent: host }: DoomServerPluginContext) => {\n if (!host) throw new Error('Team session requires the headless host.');\n if (serverHost.context.environment === undefined) {\n throw new Error('Team headless facet requires an admitted session environment.');\n }\n const directEvents = serverHost.context.directEvents;\n if (directEvents === undefined) {\n throw new Error('Team headless facet requires host-owned direct events.');\n }\n const execution = host.context;\n const runtime = createTeamExtensionRuntime(undefined, {\n environment: serverHost.context.environment,\n childSessions: { get: () => readDoomChildSessionService(context) },\n nativeRunProjection,\n });\n const scope = createSessionScope(execution.sessionId);\n runtime.management.bindSessionScope(scope);\n const jobs = runtime.asyncJobTracker.forSession(execution.sessionId, scope);\n const bridge = createDelegationBridge({\n planner: runtime.spawnPlanner,\n management: runtime.management,\n waiter: runtime.subagentWaiter,\n scheduler: runtime.pollScheduler,\n tracker: runtime.asyncJobTracker,\n loadConfig: () => loadConfig().config,\n });\n const nativeRuns = new Map<string, NativeAsyncJobProjection>();\n const childCosts = new Map<string, number>();\n let costText: string | undefined;\n let activityAttached = false;\n const publishRunSnapshot = (): void => {\n if (activityAttached) publishRuns(directEvents, execution.sessionId, jobs.list(), nativeRuns);\n };\n const publishCost = (force = false): void => {\n costText = updateTeamCost(execution.client, jobs.list(), nativeRuns, childCosts, costText, activityAttached, force);\n };\n const unsubscribeCostTracker = runtime.asyncJobTracker.subscribe(execution.sessionId, () => {\n publishCost();\n publishRunSnapshot();\n });\n const unsubscribeCostNative = subscribeNativeRunProjection(execution.sessionId, (runs) => {\n nativeRuns.clear();\n for (const run of runs) nativeRuns.set(run.runId, run);\n publishCost();\n publishRunSnapshot();\n });\n\n // Three jobs the Pi facet gets from one `ExtensionAPI.sendMessage`, which a\n // headless session has to do by hand:\n //\n // toast `client.notify` - operator-facing only. It writes a\n // `doom-notification` custom entry whose body is flattened to a\n // single line and capped at 4096 characters, and the model never\n // sees custom entries. So it gets a headline, not the result.\n // transcript `session.appendCustomEntry` - the durable record, under the\n // same custom type the TUI renderer uses, with the full\n // multi-line content and the structured details.\n // wake `session.admitPrompt(content, 'steer')` - the only call that\n // puts the completion in front of the model. 'steer' means \"how\n // to deliver if a turn is running\"; an idle agent is woken\n // either way. `session.prompt(_, 'steer')` would NOT do this: it\n // is enqueue-only and parks the message on an idle lane.\n //\n // Serialised through one tail promise. Failures bypass the notifier's batcher\n // (`services/notify`), so two runs failing in the same tick produce two\n // deliveries; sequencing them keeps each one observing settled lane state.\n let deliveries: Promise<void> = Promise.resolve();\n runtime.completionNotifier.attachHost({\n sendMessage: (message, options) => {\n const details = message.details ?? [];\n const headline = details.length > 0 ? formatCompletionHeadline(details) : message.content;\n const failed = details.some((detail) => detail.status !== 'completed');\n const delivery = deliveries.then(async () => {\n await execution.client.notify({ body: headline, level: failed ? 'warning' : 'info' });\n await execution.session.appendCustomEntry(SUBAGENT_NOTIFY_MESSAGE_TYPE, {\n content: message.content,\n details,\n });\n // `triggerTurn: false` has no faithful headless mapping: there is no\n // way to put text in model context without starting or joining a turn\n // (`appendCustomEntry` is journal-only). Keep today's behaviour - the\n // operator sees it, the model does not wake - rather than guessing.\n if (options?.triggerTurn === false) return;\n // Matching the voice facet, which also refuses rather than degrading:\n // `session.prompt(_, 'steer')` is NOT a fallback here, because it is\n // enqueue-only and would park the completion on an idle lane - the\n // original bug. Refusing surfaces as non-delivery, which keeps\n // `ResultWatcher`'s claim alive for a retry.\n if (!execution.session.admitPrompt) throw new Error('The session cannot admit a completion prompt.');\n await execution.session.admitPrompt(message.content, 'steer');\n });\n // The notifier reports non-delivery on a rejection, which keeps\n // `ResultWatcher`'s claim alive for a retry. The tail must not inherit\n // that rejection, or one failed completion would poison every later one.\n deliveries = delivery.catch(() => undefined);\n return delivery;\n },\n });\n const transport: NativeTeamTransport = {\n sendMessage: ((message) =>\n void execution.client.notify({\n body:\n typeof message.content === 'string'\n ? message.content\n : message.content.map((part) => ('text' in part ? part.text : '[image]')).join('\\n'),\n level: 'info',\n })) as NativeTeamTransport['sendMessage'],\n sendUserMessage: ((message) =>\n void execution.session.prompt(\n typeof message === 'string'\n ? message\n : message.map((part) => ('text' in part ? part.text : '[image]')).join('\\n'),\n 'steer',\n )) as NativeTeamTransport['sendUserMessage'],\n };\n const channel = runtime.teamChannel.createHeadlessRuntime(transport);\n const serverService = (ctx: Context) => {\n ctx.plugin((providerContext) => {\n const availableModels = execution.model ? [toModelInfo(execution.model)] : [];\n providerContext.provide(\n DOOM_DELEGATION_SERVICE,\n bridge.createService(providerContext, {\n sessionId: execution.sessionId,\n sessionScope: createSessionScope(execution.sessionId),\n availableModels,\n ...(execution.model ? { parentModel: execution.model } : {}),\n // Read fresh per request, exactly as the Pi facet does at root.cli.ts.\n // Omitting this is what made every headless `context: 'fork'`\n // delegation report that the parent had no capturable branch.\n captureForkSource: () => execution.session?.forkSource?.(),\n }),\n );\n const backgroundWork = readDoomBackgroundWorkService(providerContext);\n if (backgroundWork === undefined) throw new Error('Team requires the DoomPi Session foundation.');\n registerDirectRunBackgroundWork(providerContext, backgroundWork, execution.sessionId, runtime.asyncJobTracker);\n providerContext.provide(DOOM_SUBAGENT_POLICY_SERVICE, createSubagentPolicyService(runtime.capabilityPolicies));\n });\n };\n\n const environment = serverHost.context.environment;\n const activity: DoomHeadlessActivity = {\n name: '@agimon-ai/doompi-team',\n async start(activityContext) {\n activityAttached = true;\n publishCost(true);\n publishRunSnapshot();\n try {\n const discovered = runtime.discovery.discover(execution.cwd, 'both').agents;\n directEvents.publish(SUBAGENT_CATALOG_TYPE, execution.sessionId, {\n cwd: execution.cwd,\n agents: presentCatalog(discovered),\n models: catalogModels(discovered, resolveActiveTeamModelSpecs(environment) ?? []),\n });\n } catch (error) {\n directEvents.publish(SUBAGENT_CATALOG_TYPE, execution.sessionId, {\n cwd: execution.cwd,\n agents: [],\n models: [],\n warning: error instanceof Error ? error.message : String(error),\n });\n }\n try {\n const opened = await openScopeAsync(scope);\n if (opened.suspended.length)\n await activityContext.client.notify({ body: formatSuspendedRuns(opened.suspended), level: 'info' });\n channel.bindMainSession(activityContext.sessionId);\n return () => {\n if (!activityAttached) return;\n activityAttached = false;\n channel.dispose();\n execution.client.setStatus(TEAM_COST_STATUS, undefined);\n };\n } catch (error) {\n activityAttached = false;\n execution.client.setStatus(TEAM_COST_STATUS, undefined);\n throw error;\n }\n },\n };\n\n return {\n value: {\n runtime,\n execution,\n scope,\n jobs,\n bridge,\n channel,\n directEvents,\n environment: serverHost.context.environment,\n },\n services: [\n (context: Context) => {\n if (readDoomBackgroundWorkService(context) === undefined) provideBackgroundWorkService(context);\n },\n serverService,\n mountMcpTools([createHeadlessIntercomTool(channel), createHeadlessSubagentTool(runtime, execution)]),\n ],\n activities: [activity],\n // Mirrors `root.cli.ts`, which starts the scheduler in its own `onStart`.\n // Without this the delegation bridge's progress subscription never ticks\n // and `scheduler.wake()` is a no-op, so the pre-timeout nudge a long\n // delegation gets in the TUI never fires headless. `onDispose` below\n // already stops it; this is the missing half of that pair.\n onStart() {\n runtime.pollScheduler.start();\n },\n async onDispose() {\n activityAttached = false;\n execution.client.setStatus(TEAM_COST_STATUS, undefined);\n channel.dispose();\n runtime.completionNotifier.dispose();\n const suspension = suspendScopeRuns({\n scope,\n reason: 'headless session ended',\n jobs: jobs.list(),\n stop: (runId, reason) => runtime.management.stop(runId, reason),\n });\n const nativeShutdown = runtime.nativeRuns.close().finally(() => nativeRunProjection.dispose(execution.sessionId));\n const outcomes = await Promise.allSettled([suspension, nativeShutdown]);\n for (const outcome of outcomes) {\n if (outcome.status === 'rejected')\n process.emitWarning(`Could not shut down headless Team runs: ${String(outcome.reason)}`);\n }\n unsubscribeCostTracker();\n unsubscribeCostNative();\n nativeRuns.clear();\n childCosts.clear();\n costText = undefined;\n bridge.abandonAll();\n runtime.dispose();\n runtime.asyncJobTracker.stop();\n runtime.pollScheduler.stop();\n },\n };\n});\n\nexport type TeamServerScope = Awaited<ReturnType<typeof root>>['value'];\nexport default root;\n","import { defineRoot } from '@agimon-ai/doompi-core/extensionFile';\n\nimport contribution from './_lib/root.server';\n\nexport default defineRoot(contribution);\n","import { defineChannel } from '@agimon-ai/doompi-core/extensionFile';\nimport type {\n DoomHubChannelHost as HubChannelHost,\n DoomHubChannelSource as HubChannelSource,\n DoomHubSessionScope as HubSessionScope,\n DoomHubChannel as WebHubChannel,\n} from '@agimon-ai/doompi-core/hubChannel';\n\nimport { SUBAGENT_CATALOG_TYPE, type SubagentCatalogPayload } from '../../../../types/webSubagents';\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\nfunction isSubagentCatalogPayload(value: unknown): value is SubagentCatalogPayload {\n return (\n isRecord(value) &&\n typeof value.cwd === 'string' &&\n Array.isArray(value.agents) &&\n Array.isArray(value.models) &&\n value.models.every((model) => typeof model === 'string')\n );\n}\n\n/**\n * The subagent catalog data channel consumes the session-owned catalog event.\n * The direct event bus retains a bounded latest snapshot for late subscribers.\n */\nexport function createSubagentCatalogChannel(): WebHubChannel {\n return {\n frameType: SUBAGENT_CATALOG_TYPE,\n start(host: HubChannelHost) {\n const scopes = new Map<string, HubSessionScope>();\n const latest = new Map<string, SubagentCatalogPayload>();\n const subscriptions = new Map<string, () => void>();\n const publish = (scope: HubSessionScope, payload: SubagentCatalogPayload): void => {\n if (scopes.get(scope.sessionId) !== scope || payload.cwd !== scope.cwd) return;\n latest.set(scope.sessionId, payload);\n host.publish(scope.sessionId, payload);\n };\n const source: HubChannelSource = {\n payloadFor(scope) {\n return scopes.has(scope.sessionId) ? latest.get(scope.sessionId) : undefined;\n },\n sessionAdded(scope) {\n subscriptions.get(scope.sessionId)?.();\n scopes.set(scope.sessionId, scope);\n latest.delete(scope.sessionId);\n const unsubscribe = host.directEvents.subscribe(\n SUBAGENT_CATALOG_TYPE,\n scope.sessionId,\n (value) => {\n if (isSubagentCatalogPayload(value)) publish(scope, value);\n },\n { replayLatest: true },\n );\n subscriptions.set(scope.sessionId, unsubscribe);\n },\n sessionRemoved(sessionId) {\n subscriptions.get(sessionId)?.();\n subscriptions.delete(sessionId);\n scopes.delete(sessionId);\n latest.delete(sessionId);\n },\n close() {\n for (const unsubscribe of subscriptions.values()) unsubscribe();\n subscriptions.clear();\n scopes.clear();\n latest.clear();\n },\n };\n return source;\n },\n };\n}\n\nexport default defineChannel(createSubagentCatalogChannel);\n","import { defineChannel } from '@agimon-ai/doompi-core/extensionFile';\n\nimport contribution from './_lib/subagent-catalog';\n\nexport default defineChannel(contribution);\n","import { defineChannel } from '@agimon-ai/doompi-core/extensionFile';\nimport type {\n DoomHubChannelSource as HubChannelSource,\n DoomHubSessionScope,\n DoomHubChannel as WebHubChannel,\n} from '@agimon-ai/doompi-core/hubChannel';\n\nimport { SUBAGENT_RUNS_TYPE, type SubagentRun } from '../../../../types/webSubagents';\n\nconst RUN_ID_PATTERN = /^[\\w.-]+$/;\n\ninterface SessionRunProjection extends SubagentRun {\n /** Host-private child transcript path. Never published to the browser. */\n sessionFile?: string;\n}\n\ntype SessionRunProjectionPayload = { runs: SessionRunProjection[] };\ntype SubagentRunsPayload = { runs: SubagentRun[] };\n\nfunction isSubagentRunsPayload(value: unknown): value is SessionRunProjectionPayload {\n return typeof value === 'object' && value !== null && Array.isArray((value as { runs?: unknown }).runs);\n}\n\nfunction publicPayload(payload: SessionRunProjectionPayload): SubagentRunsPayload {\n return { runs: payload.runs.map(({ sessionFile: _sessionFile, ...run }) => run) };\n}\n\n/**\n * The built-in subagents data channel consumes current state from the\n * host-owned direct event bus. Its bounded latest replay seeds late subscribers.\n */\nexport function createSubagentsChannel(): WebHubChannel {\n return {\n frameType: SUBAGENT_RUNS_TYPE,\n start(host) {\n const scopes = new Map<string, DoomHubSessionScope>();\n const latest = new Map<string, SessionRunProjectionPayload>();\n const subscriptions = new Map<string, () => void>();\n const publish = (scope: DoomHubSessionScope, payload: SessionRunProjectionPayload): void => {\n if (scopes.get(scope.sessionId) !== scope) return;\n latest.set(scope.sessionId, payload);\n host.publish(scope.sessionId, publicPayload(payload));\n };\n const source: HubChannelSource = {\n payloadFor(scope) {\n const payload = scopes.has(scope.sessionId) ? latest.get(scope.sessionId) : undefined;\n return payload === undefined ? undefined : publicPayload(payload);\n },\n threadJournal(scope, runId) {\n if (!RUN_ID_PATTERN.test(runId)) return undefined;\n const projected = latest.get(scope.sessionId)?.runs.find((run) => run.runId === runId);\n return projected?.sessionFile;\n },\n sessionAdded(scope) {\n subscriptions.get(scope.sessionId)?.();\n scopes.set(scope.sessionId, scope);\n latest.delete(scope.sessionId);\n const unsubscribe = host.directEvents.subscribe(\n SUBAGENT_RUNS_TYPE,\n scope.sessionId,\n (value) => {\n if (isSubagentRunsPayload(value)) publish(scope, value);\n },\n { replayLatest: true },\n );\n subscriptions.set(scope.sessionId, unsubscribe);\n },\n sessionRemoved(sessionId) {\n subscriptions.get(sessionId)?.();\n subscriptions.delete(sessionId);\n scopes.delete(sessionId);\n latest.delete(sessionId);\n },\n close() {\n for (const unsubscribe of subscriptions.values()) unsubscribe();\n subscriptions.clear();\n scopes.clear();\n latest.clear();\n },\n };\n return source;\n },\n };\n}\n\nexport default defineChannel(createSubagentsChannel);\n","import { defineChannel } from '@agimon-ai/doompi-core/extensionFile';\n\nimport contribution from './_lib/subagent-runs';\n\nexport default defineChannel(contribution);\n","import type { WithRoot } from '@agimon-ai/doompi-core/extensionFile';\nimport type { DoomHeadlessExecutionContext } from '@agimon-ai/doompi-core/headless';\nimport type { DoomApi, DoomApiHandler } from '@agimon-ai/doompi-core/packageApi';\nimport type { DoomServerPluginContext } from '@agimon-ai/doompi-core/serverFacet';\n\nimport { AgentDiscoveryService, resolveActiveTeamModelSpecs } from '../../../../../../services/agentDiscovery';\nimport { loadConfig } from '../../../../../../services/config';\nimport { DoomTeamExpectedError } from '../../../../../../services/errors';\nimport type { ControlActionResult, SteerActionResult } from '../../../../../../services/managementActions';\nimport { toModelInfo } from '../../../../../../services/modelInfo';\nimport { createSessionScope } from '../../../../../../services/sessionPaths';\nimport type { TeamExtensionRuntime } from '../../../../../../services/teamRuntime';\nimport { catalogModels, presentCatalog, type CatalogAgentInput } from '../../../../../../services/webSubagentCatalog';\nimport type { TeamServerScope } from '../../_lib/root.server';\n\nexport const TEAM_API_BASE_PATH = 'team';\nexport const TEAM_CATALOG_ROUTE = '/catalog';\nexport const TEAM_RUN_ROUTE = '/run';\nexport const TEAM_STEER_ROUTE = '/steer';\nexport const TEAM_STOP_ROUTE = '/stop';\n\nexport interface TeamRunRequest {\n agent: string;\n task: string;\n fork: boolean;\n model?: string;\n}\n\nexport interface TeamSteerRequest {\n runId: string;\n message: string;\n}\n\nexport interface TeamStopRequest {\n runId: string;\n}\n\nexport interface TeamCatalogSnapshot {\n agents: CatalogAgentInput[];\n models: string[];\n}\n\nexport interface TeamApiOptions {\n cwd: string;\n environment?: Readonly<NodeJS.ProcessEnv>;\n read?: (cwd: string) => TeamCatalogSnapshot;\n launch?: (request: TeamRunRequest) => Promise<{ runId: string }>;\n steer?: (request: TeamSteerRequest, signal: AbortSignal) => Promise<SteerActionResult>;\n stop?: (request: TeamStopRequest) => Promise<ControlActionResult>;\n}\n\nfunction isRunRequest(value: unknown): value is TeamRunRequest {\n if (typeof value !== 'object' || value === null || Array.isArray(value)) return false;\n const request = value as Record<string, unknown>;\n return (\n typeof request.agent === 'string' &&\n request.agent.trim() !== '' &&\n typeof request.task === 'string' &&\n typeof request.fork === 'boolean' &&\n (request.model === undefined || (typeof request.model === 'string' && request.model.trim() !== '')) &&\n Object.keys(request).every((key) => ['agent', 'task', 'fork', 'model'].includes(key))\n );\n}\n\nfunction isSteerRequest(value: unknown): value is TeamSteerRequest {\n if (typeof value !== 'object' || value === null || Array.isArray(value)) return false;\n const request = value as Record<string, unknown>;\n return (\n typeof request.runId === 'string' &&\n request.runId.trim() !== '' &&\n typeof request.message === 'string' &&\n request.message.trim() !== '' &&\n Object.keys(request).every((key) => ['runId', 'message'].includes(key))\n );\n}\n\nfunction isStopRequest(value: unknown): value is TeamStopRequest {\n if (typeof value !== 'object' || value === null || Array.isArray(value)) return false;\n const request = value as Record<string, unknown>;\n return (\n typeof request.runId === 'string' &&\n request.runId.trim() !== '' &&\n Object.keys(request).every((key) => key === 'runId')\n );\n}\n\n/** The typed error's text carries a recovery hint written for the model, so a missing run gets a sentence for people. */\nfunction controlFailure(error: unknown): Response {\n if (error instanceof DoomTeamExpectedError && error.code === 'run_not_found')\n return Response.json({ error: 'This run is not active.' }, { status: 404 });\n return Response.json({ error: error instanceof Error ? error.message : String(error) }, { status: 409 });\n}\n\n/** Serves catalog discovery, run launch, and run steer and stop from the selected session process, never through a parent prompt. */\nexport function createTeamApiHandler(options: TeamApiOptions): DoomApiHandler {\n const discovery = new AgentDiscoveryService(options.environment);\n const read =\n options.read ??\n ((cwd: string): TeamCatalogSnapshot => ({\n agents: discovery.discover(cwd, 'both').agents,\n models: resolveActiveTeamModelSpecs(options.environment) ?? [],\n }));\n\n return {\n async fetch(request) {\n const url = new URL(request.url);\n if (request.method === 'POST' && url.pathname === TEAM_RUN_ROUTE && options.launch) {\n let input: unknown;\n try {\n input = await request.json();\n } catch {\n return Response.json({ error: 'Invalid run request.' }, { status: 400 });\n }\n if (!isRunRequest(input)) return Response.json({ error: 'Invalid run request.' }, { status: 400 });\n try {\n return Response.json(await options.launch(input), { status: 201 });\n } catch (error) {\n return Response.json({ error: error instanceof Error ? error.message : String(error) }, { status: 409 });\n }\n }\n if (request.method === 'POST' && url.pathname === TEAM_STEER_ROUTE && options.steer) {\n let input: unknown;\n try {\n input = await request.json();\n } catch {\n return Response.json({ error: 'Invalid steer request.' }, { status: 400 });\n }\n if (!isSteerRequest(input)) return Response.json({ error: 'Invalid steer request.' }, { status: 400 });\n try {\n return Response.json(\n await options.steer({ runId: input.runId.trim(), message: input.message.trim() }, request.signal),\n );\n } catch (error) {\n return controlFailure(error);\n }\n }\n if (request.method === 'POST' && url.pathname === TEAM_STOP_ROUTE && options.stop) {\n let input: unknown;\n try {\n input = await request.json();\n } catch {\n return Response.json({ error: 'Invalid stop request.' }, { status: 400 });\n }\n if (!isStopRequest(input)) return Response.json({ error: 'Invalid stop request.' }, { status: 400 });\n try {\n return Response.json(await options.stop({ runId: input.runId.trim() }));\n } catch (error) {\n return controlFailure(error);\n }\n }\n if (request.method !== 'GET' || url.pathname !== TEAM_CATALOG_ROUTE) {\n return Response.json({ error: 'Not found.' }, { status: 404 });\n }\n try {\n discovery.invalidate();\n const snapshot = read(options.cwd);\n return Response.json({\n cwd: options.cwd,\n agents: presentCatalog(snapshot.agents),\n models: catalogModels(snapshot.agents, snapshot.models),\n });\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n return Response.json({ error: message }, { status: 500 });\n }\n },\n close: () => undefined,\n };\n}\n\n/** One mounted session API, backed by the Team runtime that owns the subagent tool. */\nexport function createTeamSessionApi(runtime: TeamExtensionRuntime, execution: DoomHeadlessExecutionContext): DoomApi {\n const scope = createSessionScope(execution.sessionId);\n const jobs = runtime.asyncJobTracker.forSession(execution.sessionId, scope);\n\n const launch = async (request: TeamRunRequest): Promise<{ runId: string }> => {\n const parentForkSource = request.fork ? await execution.session.forkSource?.() : undefined;\n if (request.fork && !parentForkSource) throw new Error('This session cannot capture a fork source.');\n const plan = await runtime.spawnPlanner.spawn(\n {\n single: {\n agent: request.agent.trim(),\n task: request.task.trim(),\n context: request.fork ? 'fork' : 'fresh',\n ...(request.model ? { model: request.model } : {}),\n },\n cwd: execution.cwd,\n agentScope: 'both',\n sessionScope: scope,\n environment: execution.environment,\n parentSessionId: execution.sessionId,\n ...(parentForkSource ? { parentForkSource } : {}),\n availableModels: execution.model ? [toModelInfo(execution.model)] : [],\n ...(execution.model ? { parentModel: execution.model } : {}),\n },\n loadConfig().config,\n );\n const outcome = plan.outcomes[0];\n if (!outcome?.runId) throw new Error(outcome?.error ?? 'The agent did not start.');\n jobs.track(\n outcome.runId,\n outcome.identity ? { identity: outcome.identity, inline: outcome.inline ?? false } : undefined,\n );\n return { runId: outcome.runId };\n };\n\n return {\n basePath: TEAM_API_BASE_PATH,\n start: () =>\n createTeamApiHandler({\n cwd: execution.cwd,\n environment: execution.environment,\n launch,\n steer: (request, signal) => runtime.management.steer(request.runId, request.message, undefined, signal),\n stop: (request) => runtime.management.stop(request.runId),\n }),\n };\n}\n\nexport default (context: WithRoot<DoomServerPluginContext, TeamServerScope>) =>\n createTeamSessionApi(context.root.runtime, context.root.execution);\n","import { defineRoute } from '@agimon-ai/doompi-core/extensionFile';\n\nimport contribution from './_lib/route.server';\n\nexport default defineRoute(contribution);\n","import type { WithRoot } from '@agimon-ai/doompi-core/extensionFile';\nimport type { DoomServerPluginContext } from '@agimon-ai/doompi-core/serverFacet';\n\nimport { formatTeamContextSnapshot, readActiveTeamSnapshot } from '../../../../../../services/teamSnapshot';\nimport type { TeamServerScope } from '../../_lib/root.server';\n\n/**\n * The roster the model is allowed to see.\n *\n * Reads the public snapshot rather than `channel.current()`: the latter is the raw\n * `TeamMemberContext`, whose `token` is a session capability documented as never\n * leaving the direct context. A context resource is pasted into the system prompt,\n * sent to the provider and persisted, so the raw struct must not be serialized here.\n * `formatTeamContextSnapshot` is the same projection the Pi facet renders.\n */\nexport default (context: WithRoot<DoomServerPluginContext, TeamServerScope>) => ({\n name: 'doompi/team',\n kind: 'context' as const,\n // A roster of nobody says nothing; '' is dropped from the prompt by composeSystemPrompt.\n read: () => {\n const rendered = formatTeamContextSnapshot(readActiveTeamSnapshot(context.root.channel));\n return rendered === undefined || rendered === '(no active team members)' ? '' : rendered;\n },\n});\n","import { defineResource } from '@agimon-ai/doompi-core/extensionFile';\n\nimport contribution from './_lib/team.server';\n\nexport default defineResource(contribution);\n","import { defineServerTool, type WithRoot } from '@agimon-ai/doompi-core/extensionFile';\nimport type { DoomServerPluginContext } from '@agimon-ai/doompi-core/serverFacet';\n\nimport { createHeadlessIntercomTool } from '../../../../../services/headlessIntercomTool';\nimport type { TeamServerScope } from '../_lib/root.server';\n\nexport default defineServerTool((context: WithRoot<DoomServerPluginContext, TeamServerScope>) =>\n createHeadlessIntercomTool(context.root.channel),\n);\n","import { defineServerTool, type WithRoot } from '@agimon-ai/doompi-core/extensionFile';\nimport type { DoomServerPluginContext } from '@agimon-ai/doompi-core/serverFacet';\n\nimport { createHeadlessSubagentTool } from '../../../../../services/headlessSubagentTool';\nimport type { TeamServerScope } from '../_lib/root.server';\n\nexport default defineServerTool((context: WithRoot<DoomServerPluginContext, TeamServerScope>) =>\n createHeadlessSubagentTool(context.root.runtime, context.root.execution),\n);\n","// Generated by @agimon-ai/doompi-build. Do not edit by hand.\nimport { defineServerPlugin, type DoomServerSessionPlugin } from '@agimon-ai/doompi-core/serverFacet';\nimport { composeRootHooks } from '@agimon-ai/doompi-core/extensionFile';\n\nimport rootSession from '../src/extensions/workspaces/sessions/(backend)/root.server';\nimport channelSubagentCatalog from '../src/extensions/(backend)/channel/subagent-catalog.server';\nimport channelSubagentRuns from '../src/extensions/(backend)/channel/subagent-runs.server';\nimport apiRoute from '../src/extensions/workspaces/sessions/(backend)/api/route.server';\nimport resourceTeam from '../src/extensions/workspaces/sessions/(backend)/resource/team.server';\nimport toolIntercom from '../src/extensions/workspaces/sessions/(backend)/tool/intercom.server';\nimport toolSubagent from '../src/extensions/workspaces/sessions/(backend)/tool/subagent.server';\n\ntype Factory<T, C> = (context: C) => T;\nconst at = <T, C>(value: T | Factory<T, C>, context: C): T =>\n typeof value === 'function' ? (value as Factory<T, C>)(context) : value;\nconst via = <T>(identity: Record<string, unknown>, value: unknown): T =>\n (value === undefined ? undefined : { ...identity, ...(value as object) }) as T;\n\nexport const facet = defineServerPlugin({\n name: '@agimon-ai/doompi-team',\n global: () => ({\n get channels(): DoomServerSessionPlugin['channels'] { return [() => via({ frameType: 'subagent_catalog' }, channelSubagentCatalog()), () => via({ frameType: 'subagent_runs' }, channelSubagentRuns())]; },\n }),\n workspace: () => ({\n get channels(): DoomServerSessionPlugin['channels'] { return [() => via({ frameType: 'subagent_catalog' }, channelSubagentCatalog()), () => via({ frameType: 'subagent_runs' }, channelSubagentRuns())]; },\n }),\n session: async (context) => {\n const scopeSession = await rootSession(context);\n const contextSession = { ...context, root: scopeSession.value };\n return {\n ...composeRootHooks(scopeSession),\n get api(): DoomServerSessionPlugin['api'] { return [at(apiRoute, contextSession)]; },\n get channels(): DoomServerSessionPlugin['channels'] { return [() => via({ frameType: 'subagent_catalog' }, channelSubagentCatalog()), () => via({ frameType: 'subagent_runs' }, channelSubagentRuns())]; },\n get resources(): DoomServerSessionPlugin['resources'] { return [at(resourceTeam, contextSession)]; },\n get tools(): DoomServerSessionPlugin['tools'] { return [via({ name: 'intercom' }, at(toolIntercom, contextSession)), via({ name: 'subagent' }, at(toolSubagent, contextSession))]; },\n services: [...(scopeSession.services ?? [])],\n get activities(): DoomServerSessionPlugin['activities'] { return [...(scopeSession.activities ?? [])]; },\n };\n },\n});\n\nexport default facet;\n"],"mappings":"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"}
@@ -10,6 +10,7 @@ import { readDoomBackgroundWorkService } from "@agimon-ai/doompi-core/background
10
10
  import { readDoomChildSessionService } from "@agimon-ai/doompi-core/childSession";
11
11
  import { provideBackgroundWorkService } from "@agimon-ai/doompi-session";
12
12
  import { defineServerPlugin } from "@agimon-ai/doompi-core/serverFacet";
13
+ import { toDoomHeadlessToolResult } from "@agimon-ai/doompi-core/headless";
13
14
  //#region src/services/headlessIntercomTool/index.ts
14
15
  function createHeadlessIntercomTool(channel) {
15
16
  return {
@@ -20,7 +21,7 @@ function createHeadlessIntercomTool(channel) {
20
21
  promptGuidelines: ["Send only new progress, blockers, or decisions. Do not repeat task briefs or delegation instructions."],
21
22
  executionMode: "serial",
22
23
  async execute(toolCallId, parameters, signal, onUpdate) {
23
- return channel.execute(toolCallId, parameters, signal, onUpdate);
24
+ return toDoomHeadlessToolResult(await channel.execute(toolCallId, parameters, signal, onUpdate && ((partial) => onUpdate(toDoomHeadlessToolResult(partial)))));
24
25
  }
25
26
  };
26
27
  }
@@ -1 +1 @@
1
- {"version":3,"file":"server.mjs","names":["validateSubagentParams","contribution","contribution","contribution","contribution","contribution","channelSubagentCatalog","channelSubagentRuns","rootSession","apiRoute","resourceTeam","toolIntercom","toolSubagent"],"sources":["../../src/services/headlessIntercomTool/index.ts","../../src/services/headlessSubagentTool/index.ts","../../src/services/mcpTools/index.ts","../../src/services/nativeRunProjection/index.ts","../../src/services/webSubagentCatalog/index.ts","../../src/types/webSubagents.ts","../../src/extensions/workspaces/sessions/(backend)/_lib/root.server.ts","../../src/extensions/workspaces/sessions/(backend)/root.server.ts","../../src/extensions/(backend)/channel/_lib/subagent-catalog.ts","../../src/extensions/(backend)/channel/subagent-catalog.server.ts","../../src/extensions/(backend)/channel/_lib/subagent-runs.ts","../../src/extensions/(backend)/channel/subagent-runs.server.ts","../../src/extensions/workspaces/sessions/(backend)/api/_lib/route.server.ts","../../src/extensions/workspaces/sessions/(backend)/api/route.server.ts","../../src/extensions/workspaces/sessions/(backend)/resource/_lib/team.server.ts","../../src/extensions/workspaces/sessions/(backend)/resource/team.server.ts","../../src/extensions/workspaces/sessions/(backend)/tool/intercom.server.ts","../../src/extensions/workspaces/sessions/(backend)/tool/subagent.server.ts","../../generated/server.ts"],"sourcesContent":["import type { DoomHeadlessTool } from '@agimon-ai/doompi-core/headless';\n\nimport { TeamToolParamsSchema, type NativeTeamRuntime } from '../nativeTeamChannel';\n\nexport function createHeadlessIntercomTool(channel: NativeTeamRuntime): DoomHeadlessTool<typeof TeamToolParamsSchema> {\n return {\n name: 'intercom',\n label: 'Intercom',\n description: 'Communicate with active agents in this root session.',\n parameters: TeamToolParamsSchema,\n promptGuidelines: [\n 'Send only new progress, blockers, or decisions. Do not repeat task briefs or delegation instructions.',\n ],\n executionMode: 'serial',\n async execute(toolCallId, parameters, signal, onUpdate) {\n return channel.execute(toolCallId, parameters, signal, onUpdate);\n },\n };\n}\n","import type {\n DoomHeadlessExecutionContext,\n DoomHeadlessTool,\n DoomHeadlessToolResult,\n} from '@agimon-ai/doompi-core/headless';\n\nimport { SUBAGENT_ACTIONS, SubagentToolSchema, type SubagentToolParams } from '../../schemas/subagentTool';\nimport { resolveTrackedRunId } from '../asyncJobTracker';\nimport { loadConfig } from '../config';\nimport { DoomTeamExpectedError } from '../errors';\nimport { toModelInfo } from '../modelInfo';\nimport { createSessionScope } from '../sessionPaths';\nimport type { SpawnPlanResult } from '../spawnPlan';\nimport { formatFleetView, formatRunTranscript } from '../statusViews';\nimport {\n formatAgentDetail,\n formatAgentList,\n publicAgent,\n validateParams as validateSubagentParams,\n} from '../subagentTool';\nimport { clearSuspendedRun, formatSuspendedRuns, isSuspendedRunResumable, listSuspendedRuns } from '../suspendedRuns';\nimport { createTeamExtensionRuntime } from '../teamRuntime';\n\nconst SUBAGENT_DESCRIPTION =\n 'Discover agents, start and manage persistent background subagent runs, and inspect suspended work.';\n\n/**\n * Every result carries the text the MODEL reads and the structured details the\n * cockpit card reads. The text is always given explicitly: a serialized detail\n * object is not a tool result a model can act on, and the old default made that\n * the easy mistake to make.\n */\nfunction result(text: string, details: unknown, isError = false): DoomHeadlessToolResult {\n return { content: [{ type: 'text', text }], details, ...(isError ? { isError: true } : {}) };\n}\n\n/** The launch report, worded as the Pi path words it, next step included. */\nfunction formatSpawnPlan(plan: SpawnPlanResult): string {\n const started = plan.outcomes.filter((outcome) => outcome.runId);\n const failed = plan.outcomes.filter((outcome) => !outcome.runId);\n const lines = plan.outcomes.map(\n (outcome) =>\n `- ${outcome.agent}: ${outcome.runId ? outcome.runId : `failed: ${outcome.error ?? 'unknown error'}`}${outcome.warning ? `\\n Warning: ${outcome.warning}` : ''}`,\n );\n const label = plan.outcomes.length === 1 ? 'subagent' : 'subagents';\n const summary =\n failed.length === 0\n ? `Started ${started.length} ${label}:`\n : `Started ${started.length}/${plan.outcomes.length} ${label}; ${failed.length} failed:`;\n const next =\n failed.length === 0\n ? 'Completion will arrive asynchronously. Continue only non-overlapping work, or end your turn.'\n : 'Completion will arrive asynchronously for started runs. Do not resubmit them; retry only corrected failed entries.';\n return [summary, ...lines, '', next].join('\\n');\n}\n\nfunction scopeOf(value: string | undefined): 'user' | 'project' | 'both' {\n return value === 'user' || value === 'project' ? value : 'both';\n}\n\nexport function createHeadlessSubagentTool(\n runtime: ReturnType<typeof createTeamExtensionRuntime>,\n execution: DoomHeadlessExecutionContext,\n): DoomHeadlessTool<typeof SubagentToolSchema> {\n const scope = createSessionScope(execution.sessionId);\n const jobs = runtime.asyncJobTracker.forSession(execution.sessionId, scope);\n const availableModels = execution.model ? [toModelInfo(execution.model)] : [];\n return {\n name: 'subagent',\n label: 'Subagent',\n description: SUBAGENT_DESCRIPTION,\n parameters: SubagentToolSchema,\n promptSnippet: 'Discover, run, inspect, steer, stop, and restore persistent subagents',\n promptGuidelines: [\n 'Runs are persistent background work. Do not resubmit a run that already returned an id.',\n 'Use status or suspended before retrying a failed or interrupted operation.',\n ],\n executionMode: 'serial',\n async execute(_toolCallId, parameters, signal, onUpdate) {\n try {\n const params: SubagentToolParams = validateSubagentParams(parameters);\n if (params.action === SUBAGENT_ACTIONS.agents) {\n const scope = scopeOf(params.scope);\n const agents = runtime.discovery.discover(params.cwd ?? execution.cwd, scope).agents;\n const selected = params.name\n ? runtime.discovery.find(params.cwd ?? execution.cwd, scope, params.name)\n : undefined;\n if (params.name && !selected)\n throw new DoomTeamExpectedError(\n 'agent_not_found',\n `No executable agent matches '${params.name}'.`,\n false,\n 'Call subagent({\"action\":\"agents\"}) and retry with an exact agent name.',\n );\n if (selected) return result(formatAgentDetail(selected), { agents: [publicAgent(selected)] });\n return result(formatAgentList(agents), {\n agents: agents.map((agent) => ({\n name: agent.name,\n source: agent.source,\n description: agent.description,\n runtime: agent.runtime ?? 'pi',\n })),\n });\n }\n if (params.action === SUBAGENT_ACTIONS.run) {\n onUpdate?.(\n result(`Starting ${params.requests.length} subagent${params.requests.length === 1 ? '' : 's'}...`, {\n action: params.action,\n partial: true,\n }),\n );\n // An agent whose resolved default context is `fork` needs a parent\n // branch here too, not only on the delegation path. Accessed\n // defensively: a host that cannot offer a branch must degrade to a\n // fresh child, never fail the launch.\n const parentForkSource = await execution.session?.forkSource?.();\n const plan = await runtime.spawnPlanner.spawn(\n {\n tasks: params.requests.map((request) => ({\n agent: request.agent.trim(),\n task: request.task.trim(),\n ...(request.inlineAgent ? { inlineAgent: request.inlineAgent } : {}),\n ...(request.cwd ? { cwd: request.cwd } : {}),\n ...(request.model ? { model: request.model } : {}),\n ...(request.runtime ? { runtime: request.runtime } : {}),\n })),\n cwd: execution.cwd,\n agentScope: scopeOf(params.scope),\n sessionScope: createSessionScope(execution.sessionId),\n environment: execution.environment,\n parentSessionId: execution.sessionId,\n ...(params.concurrency === undefined ? {} : { concurrency: params.concurrency }),\n ...(params.artifacts === undefined ? {} : { artifacts: params.artifacts }),\n availableModels,\n ...(execution.model ? { parentModel: execution.model } : {}),\n ...(parentForkSource ? { parentForkSource } : {}),\n },\n loadConfig().config,\n );\n for (const outcome of plan.outcomes) {\n if (outcome.runId) {\n jobs.track(\n outcome.runId,\n outcome.identity ? { identity: outcome.identity, inline: outcome.inline ?? false } : undefined,\n );\n }\n }\n return result(formatSpawnPlan(plan), plan);\n }\n if (params.action === SUBAGENT_ACTIONS.status) {\n if (!('id' in params)) {\n const runs = jobs.list();\n return result(formatFleetView(runs), { runs });\n }\n const status = runtime.management.statusAsync\n ? await runtime.management.statusAsync(params.id)\n : runtime.management.status(params.id);\n const statusText = status.status\n ? [\n `Run '${status.runId}': ${status.status.state}`,\n status.status.summary ? `Summary: ${status.status.summary}` : undefined,\n ]\n .filter((line): line is string => line !== undefined)\n .join('\\n')\n : `Run '${status.runId}' has no status yet.`;\n const transcript =\n params.transcriptLines === undefined\n ? undefined\n : formatRunTranscript(status.status, params.transcriptLines);\n return result([statusText, transcript].filter((text): text is string => text !== undefined).join('\\n\\n'), {\n runId: status.runId,\n status: status.status,\n });\n }\n if (params.action === SUBAGENT_ACTIONS.suspended) {\n const suspended = listSuspendedRuns(createSessionScope(execution.sessionId));\n const text = suspended.length ? formatSuspendedRuns(suspended) : 'No suspended subagents in this session.';\n return result(text, { suspended, text });\n }\n const id = resolveTrackedRunId(jobs, params.id);\n if (params.action === SUBAGENT_ACTIONS.stop) {\n const control = await runtime.management.stop(id, params.reason);\n return result(`Stop requested for '${id}'.`, { runId: id, control });\n }\n if (params.action === SUBAGENT_ACTIONS.steer) {\n const steer = await runtime.management.steer(id, params.message, undefined, signal);\n return result(`Steer request '${steer.requestId}' for '${id}' is ${steer.state}: ${steer.message}`, {\n runId: id,\n steer,\n });\n }\n const suspended = listSuspendedRuns(createSessionScope(execution.sessionId)).find(\n (item) => item.runId === params.id,\n );\n if (!suspended) throw new Error(`No suspended run matches '${params.id}'.`);\n if (!isSuspendedRunResumable(suspended)) throw new Error(`Suspended run '${params.id}' is not resumable.`);\n const restored = await runtime.spawnPlanner.spawn(\n {\n single: {\n agent: suspended.agent,\n ...(suspended.inlineAgent ? { inlineAgent: suspended.inlineAgent } : {}),\n task: suspended.task,\n cwd: suspended.cwd,\n ...(suspended.model ? { model: suspended.model } : {}),\n sessionFile: suspended.sessionFile,\n ...(suspended.identity ? { identity: suspended.identity } : {}),\n },\n cwd: suspended.cwd,\n agentScope: 'both',\n sessionScope: createSessionScope(execution.sessionId),\n environment: execution.environment,\n runtime: 'pi',\n parentSessionId: execution.sessionId,\n availableModels,\n },\n loadConfig().config,\n );\n const outcome = restored.outcomes[0];\n if (!outcome?.runId)\n throw new Error(`Could not restore '${params.id}': ${outcome?.error ?? 'the spawn produced no run.'}`);\n clearSuspendedRun(createSessionScope(execution.sessionId), params.id);\n return result(`Restored '${params.id}' as '${outcome.runId}', continuing its transcript.`, {\n restore: { ...outcome, restoredFrom: params.id },\n });\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n return result(message, message, true);\n }\n },\n };\n}\n","import type { DoomHeadlessTool } from '@agimon-ai/doompi-core/headless';\nimport type { DoomMcpPluginContext } from '@agimon-ai/doompi-core/mcpFacet';\nimport type { Context } from '@deepseek-ai/cordis';\n\nexport const TEAM_MCP_TOOLS_SERVICE = 'doom/team-mcp-tools';\n\nexport interface McpToolCatalog {\n get(name: string): DoomHeadlessTool | undefined;\n}\n\nexport function mountMcpTools(tools: readonly DoomHeadlessTool[]) {\n return (context: Context): void => {\n context.plugin((providerContext) => {\n providerContext.provide(TEAM_MCP_TOOLS_SERVICE, {\n get: (name) => tools.find((tool) => tool.name === name),\n } satisfies McpToolCatalog);\n });\n };\n}\n\nexport function bindMcpTool(context: DoomMcpPluginContext, name: string): DoomHeadlessTool {\n const tool = context.services.get<McpToolCatalog>(TEAM_MCP_TOOLS_SERVICE)?.get(name);\n if (!tool) throw new Error(`Team tool is unavailable: ${name}`);\n return {\n ...tool,\n execute(toolCallId, parameters, signal, onUpdate) {\n const executionSignal = AbortSignal.any([context.signal, signal ?? context.signal]);\n return tool.execute(toolCallId, parameters, executionSignal, onUpdate, context.execution);\n },\n };\n}\n","import type { NativeAsyncJobProjection } from '../asyncJobTracker';\n\nexport type NativeRunProjectionListener = (runs: readonly NativeAsyncJobProjection[]) => void;\n\nexport interface NativeRunProjectionSink {\n publish(sessionId: string, projection: NativeAsyncJobProjection): void;\n dispose(sessionId: string): void;\n}\n\ninterface SessionProjection {\n readonly runs: Map<string, NativeAsyncJobProjection>;\n readonly listeners: Set<NativeRunProjectionListener>;\n}\n\nconst sessions = new Map<string, SessionProjection>();\n\nfunction projectionFor(sessionId: string): SessionProjection {\n let projection = sessions.get(sessionId);\n if (!projection) {\n projection = { runs: new Map(), listeners: new Set() };\n sessions.set(sessionId, projection);\n }\n return projection;\n}\n\nfunction snapshot(projection: SessionProjection): readonly NativeAsyncJobProjection[] {\n return [...projection.runs.values()];\n}\n\nexport const nativeRunProjection: NativeRunProjectionSink = {\n publish(sessionId, run) {\n const projection = projectionFor(sessionId);\n projection.runs.set(run.runId, run);\n const runs = snapshot(projection);\n for (const listener of projection.listeners) listener(runs);\n },\n dispose(sessionId) {\n const projection = sessions.get(sessionId);\n if (!projection) return;\n for (const listener of projection.listeners) listener([]);\n projection.listeners.clear();\n projection.runs.clear();\n sessions.delete(sessionId);\n },\n};\n\nexport function subscribeNativeRunProjection(sessionId: string, listener: NativeRunProjectionListener): () => void {\n const projection = projectionFor(sessionId);\n projection.listeners.add(listener);\n if (projection.runs.size > 0) listener(snapshot(projection));\n\n let closed = false;\n return () => {\n if (closed) return;\n closed = true;\n projection.listeners.delete(listener);\n if (projection.listeners.size === 0 && projection.runs.size === 0) sessions.delete(sessionId);\n };\n}\n","import type { SubagentCatalogAgent, SubagentCatalogSource } from '../../types/webSubagents';\n\n/** The fields the catalog reads off an agent definition; an AgentConfig satisfies it. */\nexport interface CatalogAgentInput {\n name: string;\n packageName?: string;\n description: string;\n model?: string;\n fallbackModels?: string[];\n tools?: string[];\n skills?: string[];\n extensions?: string[];\n defaultContext?: 'fresh' | 'fork';\n source: SubagentCatalogSource;\n filePath: string;\n}\n\n/** Nearest definition first: the order shadowing resolves in. */\nconst SOURCE_ORDER: Readonly<Record<SubagentCatalogSource, number>> = { project: 0, user: 1, plugin: 2 };\nconst DEFAULT_CONTEXT = 'fresh';\n\nexport function catalogAgentOf(agent: CatalogAgentInput): SubagentCatalogAgent {\n return {\n name: agent.name,\n source: agent.source,\n ...(agent.packageName === undefined ? {} : { packageName: agent.packageName }),\n description: agent.description,\n ...(agent.model === undefined ? {} : { model: agent.model }),\n fallbackModels: agent.fallbackModels ?? [],\n tools: agent.tools ?? [],\n skills: agent.skills ?? [],\n extensions: agent.extensions ?? [],\n defaultContext: agent.defaultContext ?? DEFAULT_CONTEXT,\n filePath: agent.filePath,\n };\n}\n\n/** The catalog's order: by source, nearest first, then by name. */\nexport function presentCatalog(agents: readonly CatalogAgentInput[]): SubagentCatalogAgent[] {\n return agents\n .map(catalogAgentOf)\n .sort((a, b) => SOURCE_ORDER[a.source] - SOURCE_ORDER[b.source] || a.name.localeCompare(b.name));\n}\n\n/** Every model spec a launch could name: the team's offer plus whatever the definitions pin, deduplicated in order. */\nexport function catalogModels(agents: readonly CatalogAgentInput[], teamModels: readonly string[]): string[] {\n const seen = new Set<string>();\n const models: string[] = [];\n for (const model of [\n ...teamModels,\n ...agents.flatMap((agent) => [agent.model ?? '', ...(agent.fallbackModels ?? [])]),\n ]) {\n if (model === '' || seen.has(model)) continue;\n seen.add(model);\n models.push(model);\n }\n return models;\n}\n","/**\n * Subagent run view types shared by this package's hub channel and its web\n * plugin. The shapes mirror the per-run status files this package's own\n * runtime writes; the cockpit renders them as 'subagent_runs' channel\n * payloads.\n */\n\n/** Coarse run state the cockpit renders; rawState keeps doom-team's exact word. */\nexport type SubagentRunState = 'queued' | 'running' | 'done' | 'failed' | 'stopped';\n\n/**\n * One subagent run of a session, read from doom-team's per-run status file.\n */\nexport interface SubagentRun {\n runId: string;\n agent: string;\n /**\n * Generated addressable identity, for example `alan-reviewer-3`.\n *\n * Additive and optional: a run projected before identities existed, and any\n * run whose claim could not be written, still arrives without one.\n */\n identity?: string;\n /** True when this run came from a one-shot inline agent definition. */\n inline?: boolean;\n state: SubagentRunState;\n rawState: string;\n /** The delegation prompt the main agent gave this run. */\n task: string;\n /** A doom-task binding, when the delegation named one; wins over task in the card. */\n taskRef?: string;\n model?: string;\n cwd: string;\n /** The child transcript path, when the session host exposes one. */\n sessionFile?: string;\n /** Epoch milliseconds, as doom-team writes them. */\n startedAt: number;\n endedAt?: number;\n lastUpdate: number;\n /** Live one-liner of what the run is doing right now. */\n currentTool?: string;\n toolCount?: number;\n tokens?: number;\n cost?: number;\n /** Final report, present once the run finished. */\n summary?: string;\n /** Failure reason, present when the run failed. */\n error?: string;\n /** Recent output lines, oldest first, capped. */\n tail: string[];\n}\n\nexport const SUBAGENT_RUNS_TYPE = 'subagent_runs';\n\n/** How the runtime answered one steer: delivered, refused by the run, or not yet acknowledged. */\nexport interface SubagentSteerResult {\n state: 'delivered' | 'failed' | 'pending';\n message: string;\n}\n/** Where an agent definition came from; the catalog groups by it, nearest first. */\nexport type SubagentCatalogSource = 'project' | 'user' | 'plugin';\n\n/** One launchable agent, as the catalog lists it. */\nexport interface SubagentCatalogAgent {\n name: string;\n source: SubagentCatalogSource;\n /** The package that staged a plugin agent. */\n packageName?: string;\n description: string;\n /** The model the definition pins; absent means the runtime's default. */\n model?: string;\n fallbackModels: string[];\n /** Empty means the definition does not narrow the tool set. */\n tools: string[];\n skills: string[];\n extensions: string[];\n defaultContext: 'fresh' | 'fork';\n filePath: string;\n}\n\n/** The 'subagent_catalog' channel payload: the agents a session's directory can launch. */\nexport interface SubagentCatalogPayload {\n cwd: string;\n agents: SubagentCatalogAgent[];\n /** Model specs the active team package offers, for the launch dialog's picker. */\n models: string[];\n /** Why the list may be incomplete, when discovery failed. */\n warning?: string;\n}\n\nexport const SUBAGENT_CATALOG_TYPE = 'subagent_catalog';\n","import { readDoomBackgroundWorkService } from '@agimon-ai/doompi-core/backgroundWork';\nimport { readDoomChildSessionService } from '@agimon-ai/doompi-core/childSession';\nimport { DOOM_DELEGATION_SERVICE } from '@agimon-ai/doompi-core/delegation';\nimport { defineRoot } from '@agimon-ai/doompi-core/extensionFile';\nimport type { DoomHeadlessActivity } from '@agimon-ai/doompi-core/headless';\nimport type { DoomDirectEventBus } from '@agimon-ai/doompi-core/hubChannel';\nimport type { DoomServerPluginContext } from '@agimon-ai/doompi-core/serverFacet';\nimport { provideBackgroundWorkService } from '@agimon-ai/doompi-session';\nimport type { Context } from '@deepseek-ai/cordis';\n\nimport { DOOM_SUBAGENT_POLICY_SERVICE } from '../../../../../schemas/subagentPolicy';\nimport { resolveActiveTeamModelSpecs } from '../../../../../services/agentDiscovery';\nimport type { NativeAsyncJobProjection, TrackedAsyncJob } from '../../../../../services/asyncJobTracker';\nimport { loadConfig } from '../../../../../services/config';\nimport { createDelegationBridge } from '../../../../../services/delegationBridge';\nimport { registerDirectRunBackgroundWork } from '../../../../../services/directRunBackgroundWork';\nimport { createHeadlessIntercomTool } from '../../../../../services/headlessIntercomTool';\nimport { createHeadlessSubagentTool } from '../../../../../services/headlessSubagentTool';\nimport { mountMcpTools } from '../../../../../services/mcpTools';\nimport { toModelInfo } from '../../../../../services/modelInfo';\nimport { nativeRunProjection } from '../../../../../services/nativeRunProjection';\nimport { subscribeNativeRunProjection } from '../../../../../services/nativeRunProjection';\nimport type { NativeTeamTransport } from '../../../../../services/nativeTeamChannel';\nimport { formatCompletionHeadline, SUBAGENT_NOTIFY_MESSAGE_TYPE } from '../../../../../services/notify';\nimport { openScopeAsync, suspendScopeRuns } from '../../../../../services/sessionLifecycle';\nimport { createSessionScope } from '../../../../../services/sessionPaths';\nimport { createSubagentPolicyService } from '../../../../../services/subagentPolicyService';\nimport { formatSuspendedRuns } from '../../../../../services/suspendedRuns';\nimport { createTeamExtensionRuntime } from '../../../../../services/teamRuntime';\nimport { catalogModels, presentCatalog } from '../../../../../services/webSubagentCatalog';\nimport {\n SUBAGENT_CATALOG_TYPE,\n SUBAGENT_RUNS_TYPE,\n type SubagentRun,\n type SubagentRunState,\n} from '../../../../../types/webSubagents';\n\ninterface SessionRunProjection extends SubagentRun {\n /** Host-private child transcript path consumed by the hub, not the browser. */\n sessionFile?: string;\n}\n\nconst TERMINAL_RUN_STATES = new Set(['completed', 'complete', 'failed', 'stopped', 'paused']);\n\nfunction runState(status: string): SubagentRunState {\n if (status === 'completed' || status === 'complete') return 'done';\n if (status === 'failed') return 'failed';\n if (status === 'stopped' || status === 'paused') return 'stopped';\n if (status === 'queued') return 'queued';\n return 'running';\n}\n\nfunction presentTrackedRun(run: TrackedAsyncJob): SessionRunProjection | undefined {\n if (!run.agent || !run.status || run.startedAt === undefined) return undefined;\n const lastUpdate = run.updatedAt ?? run.startedAt;\n return {\n runId: run.runId,\n agent: run.agent,\n ...(run.identity === undefined ? {} : { identity: run.identity }),\n ...(run.inline === undefined ? {} : { inline: run.inline }),\n state: runState(run.status),\n rawState: run.status,\n task: run.task ?? '',\n cwd: run.cwd ?? '',\n startedAt: run.startedAt,\n ...(TERMINAL_RUN_STATES.has(run.status) ? { endedAt: lastUpdate } : {}),\n lastUpdate,\n tail: [],\n ...(run.sessionFile === undefined ? {} : { sessionFile: run.sessionFile }),\n ...(run.summary === undefined ? {} : { summary: run.summary }),\n ...(run.error === undefined ? {} : { error: run.error }),\n };\n}\n\nfunction presentNativeRun(run: NativeAsyncJobProjection): SessionRunProjection {\n return {\n runId: run.runId,\n agent: run.agent,\n ...(run.identity === undefined ? {} : { identity: run.identity }),\n ...(run.inline === undefined ? {} : { inline: run.inline }),\n state: runState(run.status),\n rawState: run.status,\n task: run.task,\n cwd: run.cwd,\n startedAt: run.startedAt,\n ...(TERMINAL_RUN_STATES.has(run.status) ? { endedAt: run.updatedAt } : {}),\n lastUpdate: run.updatedAt,\n tail: [],\n ...(run.sessionFile === undefined ? {} : { sessionFile: run.sessionFile }),\n ...(run.summary === undefined ? {} : { summary: run.summary }),\n ...(run.error === undefined ? {} : { error: run.error }),\n };\n}\n\nfunction publishRuns(\n directEvents: DoomDirectEventBus,\n sessionId: string,\n jobs: readonly TrackedAsyncJob[],\n nativeRuns: ReadonlyMap<string, NativeAsyncJobProjection>,\n): void {\n const runs = jobs\n .filter((job) => !job.native)\n .map(presentTrackedRun)\n .filter((run): run is SessionRunProjection => run !== undefined);\n runs.push(...[...nativeRuns.values()].map(presentNativeRun));\n directEvents.publish(SUBAGENT_RUNS_TYPE, sessionId, { runs });\n}\n\nconst TEAM_COST_STATUS = 'doom-team-cost';\nconst COST_DECIMALS = 6;\n\nfunction updateTeamCost(\n client: { setStatus(source: string, text: string | undefined): void },\n jobs: readonly TrackedAsyncJob[],\n nativeRuns: ReadonlyMap<string, NativeAsyncJobProjection>,\n costs: Map<string, number>,\n previousText: string | undefined,\n attached: boolean,\n force = false,\n): string | undefined {\n const trackedCosts = new Map<string, number>();\n for (const job of jobs) {\n if (job.cost !== undefined && Number.isFinite(job.cost)) trackedCosts.set(job.runId, job.cost);\n }\n for (const [runId, run] of nativeRuns) {\n if (trackedCosts.has(runId) || run.cost === undefined || !Number.isFinite(run.cost)) continue;\n costs.set(runId, run.cost);\n }\n for (const [runId, cost] of trackedCosts) costs.set(runId, cost);\n\n let total = 0;\n for (const cost of costs.values()) total += cost;\n const text = total > 0 ? String(Number(total.toFixed(COST_DECIMALS))) : undefined;\n if (!force && text === previousText) return previousText;\n if (attached) client.setStatus(TEAM_COST_STATUS, text);\n return text;\n}\n\nconst root = defineRoot(({ context, host: serverHost, agent: host }: DoomServerPluginContext) => {\n if (!host) throw new Error('Team session requires the headless host.');\n if (serverHost.context.environment === undefined) {\n throw new Error('Team headless facet requires an admitted session environment.');\n }\n const directEvents = serverHost.context.directEvents;\n if (directEvents === undefined) {\n throw new Error('Team headless facet requires host-owned direct events.');\n }\n const execution = host.context;\n const runtime = createTeamExtensionRuntime(undefined, {\n environment: serverHost.context.environment,\n childSessions: { get: () => readDoomChildSessionService(context) },\n nativeRunProjection,\n });\n const scope = createSessionScope(execution.sessionId);\n runtime.management.bindSessionScope(scope);\n const jobs = runtime.asyncJobTracker.forSession(execution.sessionId, scope);\n const bridge = createDelegationBridge({\n planner: runtime.spawnPlanner,\n management: runtime.management,\n waiter: runtime.subagentWaiter,\n scheduler: runtime.pollScheduler,\n tracker: runtime.asyncJobTracker,\n loadConfig: () => loadConfig().config,\n });\n const nativeRuns = new Map<string, NativeAsyncJobProjection>();\n const childCosts = new Map<string, number>();\n let costText: string | undefined;\n let activityAttached = false;\n const publishRunSnapshot = (): void => {\n if (activityAttached) publishRuns(directEvents, execution.sessionId, jobs.list(), nativeRuns);\n };\n const publishCost = (force = false): void => {\n costText = updateTeamCost(execution.client, jobs.list(), nativeRuns, childCosts, costText, activityAttached, force);\n };\n const unsubscribeCostTracker = runtime.asyncJobTracker.subscribe(execution.sessionId, () => {\n publishCost();\n publishRunSnapshot();\n });\n const unsubscribeCostNative = subscribeNativeRunProjection(execution.sessionId, (runs) => {\n nativeRuns.clear();\n for (const run of runs) nativeRuns.set(run.runId, run);\n publishCost();\n publishRunSnapshot();\n });\n\n // Three jobs the Pi facet gets from one `ExtensionAPI.sendMessage`, which a\n // headless session has to do by hand:\n //\n // toast `client.notify` - operator-facing only. It writes a\n // `doom-notification` custom entry whose body is flattened to a\n // single line and capped at 4096 characters, and the model never\n // sees custom entries. So it gets a headline, not the result.\n // transcript `session.appendCustomEntry` - the durable record, under the\n // same custom type the TUI renderer uses, with the full\n // multi-line content and the structured details.\n // wake `session.admitPrompt(content, 'steer')` - the only call that\n // puts the completion in front of the model. 'steer' means \"how\n // to deliver if a turn is running\"; an idle agent is woken\n // either way. `session.prompt(_, 'steer')` would NOT do this: it\n // is enqueue-only and parks the message on an idle lane.\n //\n // Serialised through one tail promise. Failures bypass the notifier's batcher\n // (`services/notify`), so two runs failing in the same tick produce two\n // deliveries; sequencing them keeps each one observing settled lane state.\n let deliveries: Promise<void> = Promise.resolve();\n runtime.completionNotifier.attachHost({\n sendMessage: (message, options) => {\n const details = message.details ?? [];\n const headline = details.length > 0 ? formatCompletionHeadline(details) : message.content;\n const failed = details.some((detail) => detail.status !== 'completed');\n const delivery = deliveries.then(async () => {\n await execution.client.notify({ body: headline, level: failed ? 'warning' : 'info' });\n await execution.session.appendCustomEntry(SUBAGENT_NOTIFY_MESSAGE_TYPE, {\n content: message.content,\n details,\n });\n // `triggerTurn: false` has no faithful headless mapping: there is no\n // way to put text in model context without starting or joining a turn\n // (`appendCustomEntry` is journal-only). Keep today's behaviour - the\n // operator sees it, the model does not wake - rather than guessing.\n if (options?.triggerTurn === false) return;\n // Matching the voice facet, which also refuses rather than degrading:\n // `session.prompt(_, 'steer')` is NOT a fallback here, because it is\n // enqueue-only and would park the completion on an idle lane - the\n // original bug. Refusing surfaces as non-delivery, which keeps\n // `ResultWatcher`'s claim alive for a retry.\n if (!execution.session.admitPrompt) throw new Error('The session cannot admit a completion prompt.');\n await execution.session.admitPrompt(message.content, 'steer');\n });\n // The notifier reports non-delivery on a rejection, which keeps\n // `ResultWatcher`'s claim alive for a retry. The tail must not inherit\n // that rejection, or one failed completion would poison every later one.\n deliveries = delivery.catch(() => undefined);\n return delivery;\n },\n });\n const transport: NativeTeamTransport = {\n sendMessage: ((message) =>\n void execution.client.notify({\n body:\n typeof message.content === 'string'\n ? message.content\n : message.content.map((part) => ('text' in part ? part.text : '[image]')).join('\\n'),\n level: 'info',\n })) as NativeTeamTransport['sendMessage'],\n sendUserMessage: ((message) =>\n void execution.session.prompt(\n typeof message === 'string'\n ? message\n : message.map((part) => ('text' in part ? part.text : '[image]')).join('\\n'),\n 'steer',\n )) as NativeTeamTransport['sendUserMessage'],\n };\n const channel = runtime.teamChannel.createHeadlessRuntime(transport);\n const serverService = (ctx: Context) => {\n ctx.plugin((providerContext) => {\n const availableModels = execution.model ? [toModelInfo(execution.model)] : [];\n providerContext.provide(\n DOOM_DELEGATION_SERVICE,\n bridge.createService(providerContext, {\n sessionId: execution.sessionId,\n sessionScope: createSessionScope(execution.sessionId),\n availableModels,\n ...(execution.model ? { parentModel: execution.model } : {}),\n // Read fresh per request, exactly as the Pi facet does at root.cli.ts.\n // Omitting this is what made every headless `context: 'fork'`\n // delegation report that the parent had no capturable branch.\n captureForkSource: () => execution.session?.forkSource?.(),\n }),\n );\n const backgroundWork = readDoomBackgroundWorkService(providerContext);\n if (backgroundWork === undefined) throw new Error('Team requires the DoomPi Session foundation.');\n registerDirectRunBackgroundWork(providerContext, backgroundWork, execution.sessionId, runtime.asyncJobTracker);\n providerContext.provide(DOOM_SUBAGENT_POLICY_SERVICE, createSubagentPolicyService(runtime.capabilityPolicies));\n });\n };\n\n const environment = serverHost.context.environment;\n const activity: DoomHeadlessActivity = {\n name: '@agimon-ai/doompi-team',\n async start(activityContext) {\n activityAttached = true;\n publishCost(true);\n publishRunSnapshot();\n try {\n const discovered = runtime.discovery.discover(execution.cwd, 'both').agents;\n directEvents.publish(SUBAGENT_CATALOG_TYPE, execution.sessionId, {\n cwd: execution.cwd,\n agents: presentCatalog(discovered),\n models: catalogModels(discovered, resolveActiveTeamModelSpecs(environment) ?? []),\n });\n } catch (error) {\n directEvents.publish(SUBAGENT_CATALOG_TYPE, execution.sessionId, {\n cwd: execution.cwd,\n agents: [],\n models: [],\n warning: error instanceof Error ? error.message : String(error),\n });\n }\n try {\n const opened = await openScopeAsync(scope);\n if (opened.suspended.length)\n await activityContext.client.notify({ body: formatSuspendedRuns(opened.suspended), level: 'info' });\n channel.bindMainSession(activityContext.sessionId);\n return () => {\n if (!activityAttached) return;\n activityAttached = false;\n channel.dispose();\n execution.client.setStatus(TEAM_COST_STATUS, undefined);\n };\n } catch (error) {\n activityAttached = false;\n execution.client.setStatus(TEAM_COST_STATUS, undefined);\n throw error;\n }\n },\n };\n\n return {\n value: {\n runtime,\n execution,\n scope,\n jobs,\n bridge,\n channel,\n directEvents,\n environment: serverHost.context.environment,\n },\n services: [\n (context: Context) => {\n if (readDoomBackgroundWorkService(context) === undefined) provideBackgroundWorkService(context);\n },\n serverService,\n mountMcpTools([createHeadlessIntercomTool(channel), createHeadlessSubagentTool(runtime, execution)]),\n ],\n activities: [activity],\n // Mirrors `root.cli.ts`, which starts the scheduler in its own `onStart`.\n // Without this the delegation bridge's progress subscription never ticks\n // and `scheduler.wake()` is a no-op, so the pre-timeout nudge a long\n // delegation gets in the TUI never fires headless. `onDispose` below\n // already stops it; this is the missing half of that pair.\n onStart() {\n runtime.pollScheduler.start();\n },\n async onDispose() {\n activityAttached = false;\n execution.client.setStatus(TEAM_COST_STATUS, undefined);\n channel.dispose();\n runtime.completionNotifier.dispose();\n const suspension = suspendScopeRuns({\n scope,\n reason: 'headless session ended',\n jobs: jobs.list(),\n stop: (runId, reason) => runtime.management.stop(runId, reason),\n });\n const nativeShutdown = runtime.nativeRuns.close().finally(() => nativeRunProjection.dispose(execution.sessionId));\n const outcomes = await Promise.allSettled([suspension, nativeShutdown]);\n for (const outcome of outcomes) {\n if (outcome.status === 'rejected')\n process.emitWarning(`Could not shut down headless Team runs: ${String(outcome.reason)}`);\n }\n unsubscribeCostTracker();\n unsubscribeCostNative();\n nativeRuns.clear();\n childCosts.clear();\n costText = undefined;\n bridge.abandonAll();\n runtime.dispose();\n runtime.asyncJobTracker.stop();\n runtime.pollScheduler.stop();\n },\n };\n});\n\nexport type TeamServerScope = Awaited<ReturnType<typeof root>>['value'];\nexport default root;\n","import { defineRoot } from '@agimon-ai/doompi-core/extensionFile';\n\nimport contribution from './_lib/root.server';\n\nexport default defineRoot(contribution);\n","import { defineChannel } from '@agimon-ai/doompi-core/extensionFile';\nimport type {\n DoomHubChannelHost as HubChannelHost,\n DoomHubChannelSource as HubChannelSource,\n DoomHubSessionScope as HubSessionScope,\n DoomHubChannel as WebHubChannel,\n} from '@agimon-ai/doompi-core/hubChannel';\n\nimport { SUBAGENT_CATALOG_TYPE, type SubagentCatalogPayload } from '../../../../types/webSubagents';\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\nfunction isSubagentCatalogPayload(value: unknown): value is SubagentCatalogPayload {\n return (\n isRecord(value) &&\n typeof value.cwd === 'string' &&\n Array.isArray(value.agents) &&\n Array.isArray(value.models) &&\n value.models.every((model) => typeof model === 'string')\n );\n}\n\n/**\n * The subagent catalog data channel consumes the session-owned catalog event.\n * The direct event bus retains a bounded latest snapshot for late subscribers.\n */\nexport function createSubagentCatalogChannel(): WebHubChannel {\n return {\n frameType: SUBAGENT_CATALOG_TYPE,\n start(host: HubChannelHost) {\n const scopes = new Map<string, HubSessionScope>();\n const latest = new Map<string, SubagentCatalogPayload>();\n const subscriptions = new Map<string, () => void>();\n const publish = (scope: HubSessionScope, payload: SubagentCatalogPayload): void => {\n if (scopes.get(scope.sessionId) !== scope || payload.cwd !== scope.cwd) return;\n latest.set(scope.sessionId, payload);\n host.publish(scope.sessionId, payload);\n };\n const source: HubChannelSource = {\n payloadFor(scope) {\n return scopes.has(scope.sessionId) ? latest.get(scope.sessionId) : undefined;\n },\n sessionAdded(scope) {\n subscriptions.get(scope.sessionId)?.();\n scopes.set(scope.sessionId, scope);\n latest.delete(scope.sessionId);\n const unsubscribe = host.directEvents.subscribe(\n SUBAGENT_CATALOG_TYPE,\n scope.sessionId,\n (value) => {\n if (isSubagentCatalogPayload(value)) publish(scope, value);\n },\n { replayLatest: true },\n );\n subscriptions.set(scope.sessionId, unsubscribe);\n },\n sessionRemoved(sessionId) {\n subscriptions.get(sessionId)?.();\n subscriptions.delete(sessionId);\n scopes.delete(sessionId);\n latest.delete(sessionId);\n },\n close() {\n for (const unsubscribe of subscriptions.values()) unsubscribe();\n subscriptions.clear();\n scopes.clear();\n latest.clear();\n },\n };\n return source;\n },\n };\n}\n\nexport default defineChannel(createSubagentCatalogChannel);\n","import { defineChannel } from '@agimon-ai/doompi-core/extensionFile';\n\nimport contribution from './_lib/subagent-catalog';\n\nexport default defineChannel(contribution);\n","import { defineChannel } from '@agimon-ai/doompi-core/extensionFile';\nimport type {\n DoomHubChannelSource as HubChannelSource,\n DoomHubSessionScope,\n DoomHubChannel as WebHubChannel,\n} from '@agimon-ai/doompi-core/hubChannel';\n\nimport { SUBAGENT_RUNS_TYPE, type SubagentRun } from '../../../../types/webSubagents';\n\nconst RUN_ID_PATTERN = /^[\\w.-]+$/;\n\ninterface SessionRunProjection extends SubagentRun {\n /** Host-private child transcript path. Never published to the browser. */\n sessionFile?: string;\n}\n\ntype SessionRunProjectionPayload = { runs: SessionRunProjection[] };\ntype SubagentRunsPayload = { runs: SubagentRun[] };\n\nfunction isSubagentRunsPayload(value: unknown): value is SessionRunProjectionPayload {\n return typeof value === 'object' && value !== null && Array.isArray((value as { runs?: unknown }).runs);\n}\n\nfunction publicPayload(payload: SessionRunProjectionPayload): SubagentRunsPayload {\n return { runs: payload.runs.map(({ sessionFile: _sessionFile, ...run }) => run) };\n}\n\n/**\n * The built-in subagents data channel consumes current state from the\n * host-owned direct event bus. Its bounded latest replay seeds late subscribers.\n */\nexport function createSubagentsChannel(): WebHubChannel {\n return {\n frameType: SUBAGENT_RUNS_TYPE,\n start(host) {\n const scopes = new Map<string, DoomHubSessionScope>();\n const latest = new Map<string, SessionRunProjectionPayload>();\n const subscriptions = new Map<string, () => void>();\n const publish = (scope: DoomHubSessionScope, payload: SessionRunProjectionPayload): void => {\n if (scopes.get(scope.sessionId) !== scope) return;\n latest.set(scope.sessionId, payload);\n host.publish(scope.sessionId, publicPayload(payload));\n };\n const source: HubChannelSource = {\n payloadFor(scope) {\n const payload = scopes.has(scope.sessionId) ? latest.get(scope.sessionId) : undefined;\n return payload === undefined ? undefined : publicPayload(payload);\n },\n threadJournal(scope, runId) {\n if (!RUN_ID_PATTERN.test(runId)) return undefined;\n const projected = latest.get(scope.sessionId)?.runs.find((run) => run.runId === runId);\n return projected?.sessionFile;\n },\n sessionAdded(scope) {\n subscriptions.get(scope.sessionId)?.();\n scopes.set(scope.sessionId, scope);\n latest.delete(scope.sessionId);\n const unsubscribe = host.directEvents.subscribe(\n SUBAGENT_RUNS_TYPE,\n scope.sessionId,\n (value) => {\n if (isSubagentRunsPayload(value)) publish(scope, value);\n },\n { replayLatest: true },\n );\n subscriptions.set(scope.sessionId, unsubscribe);\n },\n sessionRemoved(sessionId) {\n subscriptions.get(sessionId)?.();\n subscriptions.delete(sessionId);\n scopes.delete(sessionId);\n latest.delete(sessionId);\n },\n close() {\n for (const unsubscribe of subscriptions.values()) unsubscribe();\n subscriptions.clear();\n scopes.clear();\n latest.clear();\n },\n };\n return source;\n },\n };\n}\n\nexport default defineChannel(createSubagentsChannel);\n","import { defineChannel } from '@agimon-ai/doompi-core/extensionFile';\n\nimport contribution from './_lib/subagent-runs';\n\nexport default defineChannel(contribution);\n","import type { WithRoot } from '@agimon-ai/doompi-core/extensionFile';\nimport type { DoomHeadlessExecutionContext } from '@agimon-ai/doompi-core/headless';\nimport type { DoomApi, DoomApiHandler } from '@agimon-ai/doompi-core/packageApi';\nimport type { DoomServerPluginContext } from '@agimon-ai/doompi-core/serverFacet';\n\nimport { AgentDiscoveryService, resolveActiveTeamModelSpecs } from '../../../../../../services/agentDiscovery';\nimport { loadConfig } from '../../../../../../services/config';\nimport { DoomTeamExpectedError } from '../../../../../../services/errors';\nimport type { ControlActionResult, SteerActionResult } from '../../../../../../services/managementActions';\nimport { toModelInfo } from '../../../../../../services/modelInfo';\nimport { createSessionScope } from '../../../../../../services/sessionPaths';\nimport type { TeamExtensionRuntime } from '../../../../../../services/teamRuntime';\nimport { catalogModels, presentCatalog, type CatalogAgentInput } from '../../../../../../services/webSubagentCatalog';\nimport type { TeamServerScope } from '../../_lib/root.server';\n\nexport const TEAM_API_BASE_PATH = 'team';\nexport const TEAM_CATALOG_ROUTE = '/catalog';\nexport const TEAM_RUN_ROUTE = '/run';\nexport const TEAM_STEER_ROUTE = '/steer';\nexport const TEAM_STOP_ROUTE = '/stop';\n\nexport interface TeamRunRequest {\n agent: string;\n task: string;\n fork: boolean;\n model?: string;\n}\n\nexport interface TeamSteerRequest {\n runId: string;\n message: string;\n}\n\nexport interface TeamStopRequest {\n runId: string;\n}\n\nexport interface TeamCatalogSnapshot {\n agents: CatalogAgentInput[];\n models: string[];\n}\n\nexport interface TeamApiOptions {\n cwd: string;\n environment?: Readonly<NodeJS.ProcessEnv>;\n read?: (cwd: string) => TeamCatalogSnapshot;\n launch?: (request: TeamRunRequest) => Promise<{ runId: string }>;\n steer?: (request: TeamSteerRequest, signal: AbortSignal) => Promise<SteerActionResult>;\n stop?: (request: TeamStopRequest) => Promise<ControlActionResult>;\n}\n\nfunction isRunRequest(value: unknown): value is TeamRunRequest {\n if (typeof value !== 'object' || value === null || Array.isArray(value)) return false;\n const request = value as Record<string, unknown>;\n return (\n typeof request.agent === 'string' &&\n request.agent.trim() !== '' &&\n typeof request.task === 'string' &&\n typeof request.fork === 'boolean' &&\n (request.model === undefined || (typeof request.model === 'string' && request.model.trim() !== '')) &&\n Object.keys(request).every((key) => ['agent', 'task', 'fork', 'model'].includes(key))\n );\n}\n\nfunction isSteerRequest(value: unknown): value is TeamSteerRequest {\n if (typeof value !== 'object' || value === null || Array.isArray(value)) return false;\n const request = value as Record<string, unknown>;\n return (\n typeof request.runId === 'string' &&\n request.runId.trim() !== '' &&\n typeof request.message === 'string' &&\n request.message.trim() !== '' &&\n Object.keys(request).every((key) => ['runId', 'message'].includes(key))\n );\n}\n\nfunction isStopRequest(value: unknown): value is TeamStopRequest {\n if (typeof value !== 'object' || value === null || Array.isArray(value)) return false;\n const request = value as Record<string, unknown>;\n return (\n typeof request.runId === 'string' &&\n request.runId.trim() !== '' &&\n Object.keys(request).every((key) => key === 'runId')\n );\n}\n\n/** The typed error's text carries a recovery hint written for the model, so a missing run gets a sentence for people. */\nfunction controlFailure(error: unknown): Response {\n if (error instanceof DoomTeamExpectedError && error.code === 'run_not_found')\n return Response.json({ error: 'This run is not active.' }, { status: 404 });\n return Response.json({ error: error instanceof Error ? error.message : String(error) }, { status: 409 });\n}\n\n/** Serves catalog discovery, run launch, and run steer and stop from the selected session process, never through a parent prompt. */\nexport function createTeamApiHandler(options: TeamApiOptions): DoomApiHandler {\n const discovery = new AgentDiscoveryService(options.environment);\n const read =\n options.read ??\n ((cwd: string): TeamCatalogSnapshot => ({\n agents: discovery.discover(cwd, 'both').agents,\n models: resolveActiveTeamModelSpecs(options.environment) ?? [],\n }));\n\n return {\n async fetch(request) {\n const url = new URL(request.url);\n if (request.method === 'POST' && url.pathname === TEAM_RUN_ROUTE && options.launch) {\n let input: unknown;\n try {\n input = await request.json();\n } catch {\n return Response.json({ error: 'Invalid run request.' }, { status: 400 });\n }\n if (!isRunRequest(input)) return Response.json({ error: 'Invalid run request.' }, { status: 400 });\n try {\n return Response.json(await options.launch(input), { status: 201 });\n } catch (error) {\n return Response.json({ error: error instanceof Error ? error.message : String(error) }, { status: 409 });\n }\n }\n if (request.method === 'POST' && url.pathname === TEAM_STEER_ROUTE && options.steer) {\n let input: unknown;\n try {\n input = await request.json();\n } catch {\n return Response.json({ error: 'Invalid steer request.' }, { status: 400 });\n }\n if (!isSteerRequest(input)) return Response.json({ error: 'Invalid steer request.' }, { status: 400 });\n try {\n return Response.json(\n await options.steer({ runId: input.runId.trim(), message: input.message.trim() }, request.signal),\n );\n } catch (error) {\n return controlFailure(error);\n }\n }\n if (request.method === 'POST' && url.pathname === TEAM_STOP_ROUTE && options.stop) {\n let input: unknown;\n try {\n input = await request.json();\n } catch {\n return Response.json({ error: 'Invalid stop request.' }, { status: 400 });\n }\n if (!isStopRequest(input)) return Response.json({ error: 'Invalid stop request.' }, { status: 400 });\n try {\n return Response.json(await options.stop({ runId: input.runId.trim() }));\n } catch (error) {\n return controlFailure(error);\n }\n }\n if (request.method !== 'GET' || url.pathname !== TEAM_CATALOG_ROUTE) {\n return Response.json({ error: 'Not found.' }, { status: 404 });\n }\n try {\n discovery.invalidate();\n const snapshot = read(options.cwd);\n return Response.json({\n cwd: options.cwd,\n agents: presentCatalog(snapshot.agents),\n models: catalogModels(snapshot.agents, snapshot.models),\n });\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n return Response.json({ error: message }, { status: 500 });\n }\n },\n close: () => undefined,\n };\n}\n\n/** One mounted session API, backed by the Team runtime that owns the subagent tool. */\nexport function createTeamSessionApi(runtime: TeamExtensionRuntime, execution: DoomHeadlessExecutionContext): DoomApi {\n const scope = createSessionScope(execution.sessionId);\n const jobs = runtime.asyncJobTracker.forSession(execution.sessionId, scope);\n\n const launch = async (request: TeamRunRequest): Promise<{ runId: string }> => {\n const parentForkSource = request.fork ? await execution.session.forkSource?.() : undefined;\n if (request.fork && !parentForkSource) throw new Error('This session cannot capture a fork source.');\n const plan = await runtime.spawnPlanner.spawn(\n {\n single: {\n agent: request.agent.trim(),\n task: request.task.trim(),\n context: request.fork ? 'fork' : 'fresh',\n ...(request.model ? { model: request.model } : {}),\n },\n cwd: execution.cwd,\n agentScope: 'both',\n sessionScope: scope,\n environment: execution.environment,\n parentSessionId: execution.sessionId,\n ...(parentForkSource ? { parentForkSource } : {}),\n availableModels: execution.model ? [toModelInfo(execution.model)] : [],\n ...(execution.model ? { parentModel: execution.model } : {}),\n },\n loadConfig().config,\n );\n const outcome = plan.outcomes[0];\n if (!outcome?.runId) throw new Error(outcome?.error ?? 'The agent did not start.');\n jobs.track(\n outcome.runId,\n outcome.identity ? { identity: outcome.identity, inline: outcome.inline ?? false } : undefined,\n );\n return { runId: outcome.runId };\n };\n\n return {\n basePath: TEAM_API_BASE_PATH,\n start: () =>\n createTeamApiHandler({\n cwd: execution.cwd,\n environment: execution.environment,\n launch,\n steer: (request, signal) => runtime.management.steer(request.runId, request.message, undefined, signal),\n stop: (request) => runtime.management.stop(request.runId),\n }),\n };\n}\n\nexport default (context: WithRoot<DoomServerPluginContext, TeamServerScope>) =>\n createTeamSessionApi(context.root.runtime, context.root.execution);\n","import { defineRoute } from '@agimon-ai/doompi-core/extensionFile';\n\nimport contribution from './_lib/route.server';\n\nexport default defineRoute(contribution);\n","import type { WithRoot } from '@agimon-ai/doompi-core/extensionFile';\nimport type { DoomServerPluginContext } from '@agimon-ai/doompi-core/serverFacet';\n\nimport { formatTeamContextSnapshot, readActiveTeamSnapshot } from '../../../../../../services/teamSnapshot';\nimport type { TeamServerScope } from '../../_lib/root.server';\n\n/**\n * The roster the model is allowed to see.\n *\n * Reads the public snapshot rather than `channel.current()`: the latter is the raw\n * `TeamMemberContext`, whose `token` is a session capability documented as never\n * leaving the direct context. A context resource is pasted into the system prompt,\n * sent to the provider and persisted, so the raw struct must not be serialized here.\n * `formatTeamContextSnapshot` is the same projection the Pi facet renders.\n */\nexport default (context: WithRoot<DoomServerPluginContext, TeamServerScope>) => ({\n name: 'doompi/team',\n kind: 'context' as const,\n // A roster of nobody says nothing; '' is dropped from the prompt by composeSystemPrompt.\n read: () => {\n const rendered = formatTeamContextSnapshot(readActiveTeamSnapshot(context.root.channel));\n return rendered === undefined || rendered === '(no active team members)' ? '' : rendered;\n },\n});\n","import { defineResource } from '@agimon-ai/doompi-core/extensionFile';\n\nimport contribution from './_lib/team.server';\n\nexport default defineResource(contribution);\n","import { defineServerTool, type WithRoot } from '@agimon-ai/doompi-core/extensionFile';\nimport type { DoomServerPluginContext } from '@agimon-ai/doompi-core/serverFacet';\n\nimport { createHeadlessIntercomTool } from '../../../../../services/headlessIntercomTool';\nimport type { TeamServerScope } from '../_lib/root.server';\n\nexport default defineServerTool((context: WithRoot<DoomServerPluginContext, TeamServerScope>) =>\n createHeadlessIntercomTool(context.root.channel),\n);\n","import { defineServerTool, type WithRoot } from '@agimon-ai/doompi-core/extensionFile';\nimport type { DoomServerPluginContext } from '@agimon-ai/doompi-core/serverFacet';\n\nimport { createHeadlessSubagentTool } from '../../../../../services/headlessSubagentTool';\nimport type { TeamServerScope } from '../_lib/root.server';\n\nexport default defineServerTool((context: WithRoot<DoomServerPluginContext, TeamServerScope>) =>\n createHeadlessSubagentTool(context.root.runtime, context.root.execution),\n);\n","// Generated by @agimon-ai/doompi-build. Do not edit by hand.\nimport { defineServerPlugin, type DoomServerSessionPlugin } from '@agimon-ai/doompi-core/serverFacet';\nimport { composeRootHooks } from '@agimon-ai/doompi-core/extensionFile';\n\nimport rootSession from '../src/extensions/workspaces/sessions/(backend)/root.server';\nimport channelSubagentCatalog from '../src/extensions/(backend)/channel/subagent-catalog.server';\nimport channelSubagentRuns from '../src/extensions/(backend)/channel/subagent-runs.server';\nimport apiRoute from '../src/extensions/workspaces/sessions/(backend)/api/route.server';\nimport resourceTeam from '../src/extensions/workspaces/sessions/(backend)/resource/team.server';\nimport toolIntercom from '../src/extensions/workspaces/sessions/(backend)/tool/intercom.server';\nimport toolSubagent from '../src/extensions/workspaces/sessions/(backend)/tool/subagent.server';\n\ntype Factory<T, C> = (context: C) => T;\nconst at = <T, C>(value: T | Factory<T, C>, context: C): T =>\n typeof value === 'function' ? (value as Factory<T, C>)(context) : value;\nconst via = <T>(identity: Record<string, unknown>, value: unknown): T =>\n (value === undefined ? undefined : { ...identity, ...(value as object) }) as T;\n\nexport const facet = defineServerPlugin({\n name: '@agimon-ai/doompi-team',\n global: () => ({\n get channels(): DoomServerSessionPlugin['channels'] { return [() => via({ frameType: 'subagent_catalog' }, channelSubagentCatalog()), () => via({ frameType: 'subagent_runs' }, channelSubagentRuns())]; },\n }),\n workspace: () => ({\n get channels(): DoomServerSessionPlugin['channels'] { return [() => via({ frameType: 'subagent_catalog' }, channelSubagentCatalog()), () => via({ frameType: 'subagent_runs' }, channelSubagentRuns())]; },\n }),\n session: async (context) => {\n const scopeSession = await rootSession(context);\n const contextSession = { ...context, root: scopeSession.value };\n return {\n ...composeRootHooks(scopeSession),\n get api(): DoomServerSessionPlugin['api'] { return [at(apiRoute, contextSession)]; },\n get channels(): DoomServerSessionPlugin['channels'] { return [() => via({ frameType: 'subagent_catalog' }, channelSubagentCatalog()), () => via({ frameType: 'subagent_runs' }, channelSubagentRuns())]; },\n get resources(): DoomServerSessionPlugin['resources'] { return [at(resourceTeam, contextSession)]; },\n get tools(): DoomServerSessionPlugin['tools'] { return [via({ name: 'intercom' }, at(toolIntercom, contextSession)), via({ name: 'subagent' }, at(toolSubagent, contextSession))]; },\n services: [...(scopeSession.services ?? [])],\n get activities(): DoomServerSessionPlugin['activities'] { return [...(scopeSession.activities ?? [])]; },\n };\n },\n});\n\nexport default facet;\n"],"mappings":"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"}
1
+ {"version":3,"file":"server.mjs","names":["validateSubagentParams","contribution","contribution","contribution","contribution","contribution","channelSubagentCatalog","channelSubagentRuns","rootSession","apiRoute","resourceTeam","toolIntercom","toolSubagent"],"sources":["../../src/services/headlessIntercomTool/index.ts","../../src/services/headlessSubagentTool/index.ts","../../src/services/mcpTools/index.ts","../../src/services/nativeRunProjection/index.ts","../../src/services/webSubagentCatalog/index.ts","../../src/types/webSubagents.ts","../../src/extensions/workspaces/sessions/(backend)/_lib/root.server.ts","../../src/extensions/workspaces/sessions/(backend)/root.server.ts","../../src/extensions/(backend)/channel/_lib/subagent-catalog.ts","../../src/extensions/(backend)/channel/subagent-catalog.server.ts","../../src/extensions/(backend)/channel/_lib/subagent-runs.ts","../../src/extensions/(backend)/channel/subagent-runs.server.ts","../../src/extensions/workspaces/sessions/(backend)/api/_lib/route.server.ts","../../src/extensions/workspaces/sessions/(backend)/api/route.server.ts","../../src/extensions/workspaces/sessions/(backend)/resource/_lib/team.server.ts","../../src/extensions/workspaces/sessions/(backend)/resource/team.server.ts","../../src/extensions/workspaces/sessions/(backend)/tool/intercom.server.ts","../../src/extensions/workspaces/sessions/(backend)/tool/subagent.server.ts","../../generated/server.ts"],"sourcesContent":["import { toDoomHeadlessToolResult, type DoomHeadlessTool } from '@agimon-ai/doompi-core/headless';\n\nimport { TeamToolParamsSchema, type NativeTeamRuntime } from '../nativeTeamChannel';\n\nexport function createHeadlessIntercomTool(channel: NativeTeamRuntime): DoomHeadlessTool<typeof TeamToolParamsSchema> {\n return {\n name: 'intercom',\n label: 'Intercom',\n description: 'Communicate with active agents in this root session.',\n parameters: TeamToolParamsSchema,\n promptGuidelines: [\n 'Send only new progress, blockers, or decisions. Do not repeat task briefs or delegation instructions.',\n ],\n executionMode: 'serial',\n async execute(toolCallId, parameters, signal, onUpdate) {\n return toDoomHeadlessToolResult(\n await channel.execute(\n toolCallId,\n parameters,\n signal,\n onUpdate && ((partial) => onUpdate(toDoomHeadlessToolResult(partial))),\n ),\n );\n },\n };\n}\n","import type {\n DoomHeadlessExecutionContext,\n DoomHeadlessTool,\n DoomHeadlessToolResult,\n} from '@agimon-ai/doompi-core/headless';\n\nimport { SUBAGENT_ACTIONS, SubagentToolSchema, type SubagentToolParams } from '../../schemas/subagentTool';\nimport { resolveTrackedRunId } from '../asyncJobTracker';\nimport { loadConfig } from '../config';\nimport { DoomTeamExpectedError } from '../errors';\nimport { toModelInfo } from '../modelInfo';\nimport { createSessionScope } from '../sessionPaths';\nimport type { SpawnPlanResult } from '../spawnPlan';\nimport { formatFleetView, formatRunTranscript } from '../statusViews';\nimport {\n formatAgentDetail,\n formatAgentList,\n publicAgent,\n validateParams as validateSubagentParams,\n} from '../subagentTool';\nimport { clearSuspendedRun, formatSuspendedRuns, isSuspendedRunResumable, listSuspendedRuns } from '../suspendedRuns';\nimport { createTeamExtensionRuntime } from '../teamRuntime';\n\nconst SUBAGENT_DESCRIPTION =\n 'Discover agents, start and manage persistent background subagent runs, and inspect suspended work.';\n\n/**\n * Every result carries the text the MODEL reads and the structured details the\n * cockpit card reads. The text is always given explicitly: a serialized detail\n * object is not a tool result a model can act on, and the old default made that\n * the easy mistake to make.\n */\nfunction result(text: string, details: unknown, isError = false): DoomHeadlessToolResult {\n return { content: [{ type: 'text', text }], details, ...(isError ? { isError: true } : {}) };\n}\n\n/** The launch report, worded as the Pi path words it, next step included. */\nfunction formatSpawnPlan(plan: SpawnPlanResult): string {\n const started = plan.outcomes.filter((outcome) => outcome.runId);\n const failed = plan.outcomes.filter((outcome) => !outcome.runId);\n const lines = plan.outcomes.map(\n (outcome) =>\n `- ${outcome.agent}: ${outcome.runId ? outcome.runId : `failed: ${outcome.error ?? 'unknown error'}`}${outcome.warning ? `\\n Warning: ${outcome.warning}` : ''}`,\n );\n const label = plan.outcomes.length === 1 ? 'subagent' : 'subagents';\n const summary =\n failed.length === 0\n ? `Started ${started.length} ${label}:`\n : `Started ${started.length}/${plan.outcomes.length} ${label}; ${failed.length} failed:`;\n const next =\n failed.length === 0\n ? 'Completion will arrive asynchronously. Continue only non-overlapping work, or end your turn.'\n : 'Completion will arrive asynchronously for started runs. Do not resubmit them; retry only corrected failed entries.';\n return [summary, ...lines, '', next].join('\\n');\n}\n\nfunction scopeOf(value: string | undefined): 'user' | 'project' | 'both' {\n return value === 'user' || value === 'project' ? value : 'both';\n}\n\nexport function createHeadlessSubagentTool(\n runtime: ReturnType<typeof createTeamExtensionRuntime>,\n execution: DoomHeadlessExecutionContext,\n): DoomHeadlessTool<typeof SubagentToolSchema> {\n const scope = createSessionScope(execution.sessionId);\n const jobs = runtime.asyncJobTracker.forSession(execution.sessionId, scope);\n const availableModels = execution.model ? [toModelInfo(execution.model)] : [];\n return {\n name: 'subagent',\n label: 'Subagent',\n description: SUBAGENT_DESCRIPTION,\n parameters: SubagentToolSchema,\n promptSnippet: 'Discover, run, inspect, steer, stop, and restore persistent subagents',\n promptGuidelines: [\n 'Runs are persistent background work. Do not resubmit a run that already returned an id.',\n 'Use status or suspended before retrying a failed or interrupted operation.',\n ],\n executionMode: 'serial',\n async execute(_toolCallId, parameters, signal, onUpdate) {\n try {\n const params: SubagentToolParams = validateSubagentParams(parameters);\n if (params.action === SUBAGENT_ACTIONS.agents) {\n const scope = scopeOf(params.scope);\n const agents = runtime.discovery.discover(params.cwd ?? execution.cwd, scope).agents;\n const selected = params.name\n ? runtime.discovery.find(params.cwd ?? execution.cwd, scope, params.name)\n : undefined;\n if (params.name && !selected)\n throw new DoomTeamExpectedError(\n 'agent_not_found',\n `No executable agent matches '${params.name}'.`,\n false,\n 'Call subagent({\"action\":\"agents\"}) and retry with an exact agent name.',\n );\n if (selected) return result(formatAgentDetail(selected), { agents: [publicAgent(selected)] });\n return result(formatAgentList(agents), {\n agents: agents.map((agent) => ({\n name: agent.name,\n source: agent.source,\n description: agent.description,\n runtime: agent.runtime ?? 'pi',\n })),\n });\n }\n if (params.action === SUBAGENT_ACTIONS.run) {\n onUpdate?.(\n result(`Starting ${params.requests.length} subagent${params.requests.length === 1 ? '' : 's'}...`, {\n action: params.action,\n partial: true,\n }),\n );\n // An agent whose resolved default context is `fork` needs a parent\n // branch here too, not only on the delegation path. Accessed\n // defensively: a host that cannot offer a branch must degrade to a\n // fresh child, never fail the launch.\n const parentForkSource = await execution.session?.forkSource?.();\n const plan = await runtime.spawnPlanner.spawn(\n {\n tasks: params.requests.map((request) => ({\n agent: request.agent.trim(),\n task: request.task.trim(),\n ...(request.inlineAgent ? { inlineAgent: request.inlineAgent } : {}),\n ...(request.cwd ? { cwd: request.cwd } : {}),\n ...(request.model ? { model: request.model } : {}),\n ...(request.runtime ? { runtime: request.runtime } : {}),\n })),\n cwd: execution.cwd,\n agentScope: scopeOf(params.scope),\n sessionScope: createSessionScope(execution.sessionId),\n environment: execution.environment,\n parentSessionId: execution.sessionId,\n ...(params.concurrency === undefined ? {} : { concurrency: params.concurrency }),\n ...(params.artifacts === undefined ? {} : { artifacts: params.artifacts }),\n availableModels,\n ...(execution.model ? { parentModel: execution.model } : {}),\n ...(parentForkSource ? { parentForkSource } : {}),\n },\n loadConfig().config,\n );\n for (const outcome of plan.outcomes) {\n if (outcome.runId) {\n jobs.track(\n outcome.runId,\n outcome.identity ? { identity: outcome.identity, inline: outcome.inline ?? false } : undefined,\n );\n }\n }\n return result(formatSpawnPlan(plan), plan);\n }\n if (params.action === SUBAGENT_ACTIONS.status) {\n if (!('id' in params)) {\n const runs = jobs.list();\n return result(formatFleetView(runs), { runs });\n }\n const status = runtime.management.statusAsync\n ? await runtime.management.statusAsync(params.id)\n : runtime.management.status(params.id);\n const statusText = status.status\n ? [\n `Run '${status.runId}': ${status.status.state}`,\n status.status.summary ? `Summary: ${status.status.summary}` : undefined,\n ]\n .filter((line): line is string => line !== undefined)\n .join('\\n')\n : `Run '${status.runId}' has no status yet.`;\n const transcript =\n params.transcriptLines === undefined\n ? undefined\n : formatRunTranscript(status.status, params.transcriptLines);\n return result([statusText, transcript].filter((text): text is string => text !== undefined).join('\\n\\n'), {\n runId: status.runId,\n status: status.status,\n });\n }\n if (params.action === SUBAGENT_ACTIONS.suspended) {\n const suspended = listSuspendedRuns(createSessionScope(execution.sessionId));\n const text = suspended.length ? formatSuspendedRuns(suspended) : 'No suspended subagents in this session.';\n return result(text, { suspended, text });\n }\n const id = resolveTrackedRunId(jobs, params.id);\n if (params.action === SUBAGENT_ACTIONS.stop) {\n const control = await runtime.management.stop(id, params.reason);\n return result(`Stop requested for '${id}'.`, { runId: id, control });\n }\n if (params.action === SUBAGENT_ACTIONS.steer) {\n const steer = await runtime.management.steer(id, params.message, undefined, signal);\n return result(`Steer request '${steer.requestId}' for '${id}' is ${steer.state}: ${steer.message}`, {\n runId: id,\n steer,\n });\n }\n const suspended = listSuspendedRuns(createSessionScope(execution.sessionId)).find(\n (item) => item.runId === params.id,\n );\n if (!suspended) throw new Error(`No suspended run matches '${params.id}'.`);\n if (!isSuspendedRunResumable(suspended)) throw new Error(`Suspended run '${params.id}' is not resumable.`);\n const restored = await runtime.spawnPlanner.spawn(\n {\n single: {\n agent: suspended.agent,\n ...(suspended.inlineAgent ? { inlineAgent: suspended.inlineAgent } : {}),\n task: suspended.task,\n cwd: suspended.cwd,\n ...(suspended.model ? { model: suspended.model } : {}),\n sessionFile: suspended.sessionFile,\n ...(suspended.identity ? { identity: suspended.identity } : {}),\n },\n cwd: suspended.cwd,\n agentScope: 'both',\n sessionScope: createSessionScope(execution.sessionId),\n environment: execution.environment,\n runtime: 'pi',\n parentSessionId: execution.sessionId,\n availableModels,\n },\n loadConfig().config,\n );\n const outcome = restored.outcomes[0];\n if (!outcome?.runId)\n throw new Error(`Could not restore '${params.id}': ${outcome?.error ?? 'the spawn produced no run.'}`);\n clearSuspendedRun(createSessionScope(execution.sessionId), params.id);\n return result(`Restored '${params.id}' as '${outcome.runId}', continuing its transcript.`, {\n restore: { ...outcome, restoredFrom: params.id },\n });\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n return result(message, message, true);\n }\n },\n };\n}\n","import type { DoomHeadlessTool } from '@agimon-ai/doompi-core/headless';\nimport type { DoomMcpPluginContext } from '@agimon-ai/doompi-core/mcpFacet';\nimport type { Context } from '@deepseek-ai/cordis';\n\nexport const TEAM_MCP_TOOLS_SERVICE = 'doom/team-mcp-tools';\n\nexport interface McpToolCatalog {\n get(name: string): DoomHeadlessTool | undefined;\n}\n\nexport function mountMcpTools(tools: readonly DoomHeadlessTool[]) {\n return (context: Context): void => {\n context.plugin((providerContext) => {\n providerContext.provide(TEAM_MCP_TOOLS_SERVICE, {\n get: (name) => tools.find((tool) => tool.name === name),\n } satisfies McpToolCatalog);\n });\n };\n}\n\nexport function bindMcpTool(context: DoomMcpPluginContext, name: string): DoomHeadlessTool {\n const tool = context.services.get<McpToolCatalog>(TEAM_MCP_TOOLS_SERVICE)?.get(name);\n if (!tool) throw new Error(`Team tool is unavailable: ${name}`);\n return {\n ...tool,\n execute(toolCallId, parameters, signal, onUpdate) {\n const executionSignal = AbortSignal.any([context.signal, signal ?? context.signal]);\n return tool.execute(toolCallId, parameters, executionSignal, onUpdate, context.execution);\n },\n };\n}\n","import type { NativeAsyncJobProjection } from '../asyncJobTracker';\n\nexport type NativeRunProjectionListener = (runs: readonly NativeAsyncJobProjection[]) => void;\n\nexport interface NativeRunProjectionSink {\n publish(sessionId: string, projection: NativeAsyncJobProjection): void;\n dispose(sessionId: string): void;\n}\n\ninterface SessionProjection {\n readonly runs: Map<string, NativeAsyncJobProjection>;\n readonly listeners: Set<NativeRunProjectionListener>;\n}\n\nconst sessions = new Map<string, SessionProjection>();\n\nfunction projectionFor(sessionId: string): SessionProjection {\n let projection = sessions.get(sessionId);\n if (!projection) {\n projection = { runs: new Map(), listeners: new Set() };\n sessions.set(sessionId, projection);\n }\n return projection;\n}\n\nfunction snapshot(projection: SessionProjection): readonly NativeAsyncJobProjection[] {\n return [...projection.runs.values()];\n}\n\nexport const nativeRunProjection: NativeRunProjectionSink = {\n publish(sessionId, run) {\n const projection = projectionFor(sessionId);\n projection.runs.set(run.runId, run);\n const runs = snapshot(projection);\n for (const listener of projection.listeners) listener(runs);\n },\n dispose(sessionId) {\n const projection = sessions.get(sessionId);\n if (!projection) return;\n for (const listener of projection.listeners) listener([]);\n projection.listeners.clear();\n projection.runs.clear();\n sessions.delete(sessionId);\n },\n};\n\nexport function subscribeNativeRunProjection(sessionId: string, listener: NativeRunProjectionListener): () => void {\n const projection = projectionFor(sessionId);\n projection.listeners.add(listener);\n if (projection.runs.size > 0) listener(snapshot(projection));\n\n let closed = false;\n return () => {\n if (closed) return;\n closed = true;\n projection.listeners.delete(listener);\n if (projection.listeners.size === 0 && projection.runs.size === 0) sessions.delete(sessionId);\n };\n}\n","import type { SubagentCatalogAgent, SubagentCatalogSource } from '../../types/webSubagents';\n\n/** The fields the catalog reads off an agent definition; an AgentConfig satisfies it. */\nexport interface CatalogAgentInput {\n name: string;\n packageName?: string;\n description: string;\n model?: string;\n fallbackModels?: string[];\n tools?: string[];\n skills?: string[];\n extensions?: string[];\n defaultContext?: 'fresh' | 'fork';\n source: SubagentCatalogSource;\n filePath: string;\n}\n\n/** Nearest definition first: the order shadowing resolves in. */\nconst SOURCE_ORDER: Readonly<Record<SubagentCatalogSource, number>> = { project: 0, user: 1, plugin: 2 };\nconst DEFAULT_CONTEXT = 'fresh';\n\nexport function catalogAgentOf(agent: CatalogAgentInput): SubagentCatalogAgent {\n return {\n name: agent.name,\n source: agent.source,\n ...(agent.packageName === undefined ? {} : { packageName: agent.packageName }),\n description: agent.description,\n ...(agent.model === undefined ? {} : { model: agent.model }),\n fallbackModels: agent.fallbackModels ?? [],\n tools: agent.tools ?? [],\n skills: agent.skills ?? [],\n extensions: agent.extensions ?? [],\n defaultContext: agent.defaultContext ?? DEFAULT_CONTEXT,\n filePath: agent.filePath,\n };\n}\n\n/** The catalog's order: by source, nearest first, then by name. */\nexport function presentCatalog(agents: readonly CatalogAgentInput[]): SubagentCatalogAgent[] {\n return agents\n .map(catalogAgentOf)\n .sort((a, b) => SOURCE_ORDER[a.source] - SOURCE_ORDER[b.source] || a.name.localeCompare(b.name));\n}\n\n/** Every model spec a launch could name: the team's offer plus whatever the definitions pin, deduplicated in order. */\nexport function catalogModels(agents: readonly CatalogAgentInput[], teamModels: readonly string[]): string[] {\n const seen = new Set<string>();\n const models: string[] = [];\n for (const model of [\n ...teamModels,\n ...agents.flatMap((agent) => [agent.model ?? '', ...(agent.fallbackModels ?? [])]),\n ]) {\n if (model === '' || seen.has(model)) continue;\n seen.add(model);\n models.push(model);\n }\n return models;\n}\n","/**\n * Subagent run view types shared by this package's hub channel and its web\n * plugin. The shapes mirror the per-run status files this package's own\n * runtime writes; the cockpit renders them as 'subagent_runs' channel\n * payloads.\n */\n\n/** Coarse run state the cockpit renders; rawState keeps doom-team's exact word. */\nexport type SubagentRunState = 'queued' | 'running' | 'done' | 'failed' | 'stopped';\n\n/**\n * One subagent run of a session, read from doom-team's per-run status file.\n */\nexport interface SubagentRun {\n runId: string;\n agent: string;\n /**\n * Generated addressable identity, for example `alan-reviewer-3`.\n *\n * Additive and optional: a run projected before identities existed, and any\n * run whose claim could not be written, still arrives without one.\n */\n identity?: string;\n /** True when this run came from a one-shot inline agent definition. */\n inline?: boolean;\n state: SubagentRunState;\n rawState: string;\n /** The delegation prompt the main agent gave this run. */\n task: string;\n /** A doom-task binding, when the delegation named one; wins over task in the card. */\n taskRef?: string;\n model?: string;\n cwd: string;\n /** The child transcript path, when the session host exposes one. */\n sessionFile?: string;\n /** Epoch milliseconds, as doom-team writes them. */\n startedAt: number;\n endedAt?: number;\n lastUpdate: number;\n /** Live one-liner of what the run is doing right now. */\n currentTool?: string;\n toolCount?: number;\n tokens?: number;\n cost?: number;\n /** Final report, present once the run finished. */\n summary?: string;\n /** Failure reason, present when the run failed. */\n error?: string;\n /** Recent output lines, oldest first, capped. */\n tail: string[];\n}\n\nexport const SUBAGENT_RUNS_TYPE = 'subagent_runs';\n\n/** How the runtime answered one steer: delivered, refused by the run, or not yet acknowledged. */\nexport interface SubagentSteerResult {\n state: 'delivered' | 'failed' | 'pending';\n message: string;\n}\n/** Where an agent definition came from; the catalog groups by it, nearest first. */\nexport type SubagentCatalogSource = 'project' | 'user' | 'plugin';\n\n/** One launchable agent, as the catalog lists it. */\nexport interface SubagentCatalogAgent {\n name: string;\n source: SubagentCatalogSource;\n /** The package that staged a plugin agent. */\n packageName?: string;\n description: string;\n /** The model the definition pins; absent means the runtime's default. */\n model?: string;\n fallbackModels: string[];\n /** Empty means the definition does not narrow the tool set. */\n tools: string[];\n skills: string[];\n extensions: string[];\n defaultContext: 'fresh' | 'fork';\n filePath: string;\n}\n\n/** The 'subagent_catalog' channel payload: the agents a session's directory can launch. */\nexport interface SubagentCatalogPayload {\n cwd: string;\n agents: SubagentCatalogAgent[];\n /** Model specs the active team package offers, for the launch dialog's picker. */\n models: string[];\n /** Why the list may be incomplete, when discovery failed. */\n warning?: string;\n}\n\nexport const SUBAGENT_CATALOG_TYPE = 'subagent_catalog';\n","import { readDoomBackgroundWorkService } from '@agimon-ai/doompi-core/backgroundWork';\nimport { readDoomChildSessionService } from '@agimon-ai/doompi-core/childSession';\nimport { DOOM_DELEGATION_SERVICE } from '@agimon-ai/doompi-core/delegation';\nimport { defineRoot } from '@agimon-ai/doompi-core/extensionFile';\nimport type { DoomHeadlessActivity } from '@agimon-ai/doompi-core/headless';\nimport type { DoomDirectEventBus } from '@agimon-ai/doompi-core/hubChannel';\nimport type { DoomServerPluginContext } from '@agimon-ai/doompi-core/serverFacet';\nimport { provideBackgroundWorkService } from '@agimon-ai/doompi-session';\nimport type { Context } from '@deepseek-ai/cordis';\n\nimport { DOOM_SUBAGENT_POLICY_SERVICE } from '../../../../../schemas/subagentPolicy';\nimport { resolveActiveTeamModelSpecs } from '../../../../../services/agentDiscovery';\nimport type { NativeAsyncJobProjection, TrackedAsyncJob } from '../../../../../services/asyncJobTracker';\nimport { loadConfig } from '../../../../../services/config';\nimport { createDelegationBridge } from '../../../../../services/delegationBridge';\nimport { registerDirectRunBackgroundWork } from '../../../../../services/directRunBackgroundWork';\nimport { createHeadlessIntercomTool } from '../../../../../services/headlessIntercomTool';\nimport { createHeadlessSubagentTool } from '../../../../../services/headlessSubagentTool';\nimport { mountMcpTools } from '../../../../../services/mcpTools';\nimport { toModelInfo } from '../../../../../services/modelInfo';\nimport { nativeRunProjection } from '../../../../../services/nativeRunProjection';\nimport { subscribeNativeRunProjection } from '../../../../../services/nativeRunProjection';\nimport type { NativeTeamTransport } from '../../../../../services/nativeTeamChannel';\nimport { formatCompletionHeadline, SUBAGENT_NOTIFY_MESSAGE_TYPE } from '../../../../../services/notify';\nimport { openScopeAsync, suspendScopeRuns } from '../../../../../services/sessionLifecycle';\nimport { createSessionScope } from '../../../../../services/sessionPaths';\nimport { createSubagentPolicyService } from '../../../../../services/subagentPolicyService';\nimport { formatSuspendedRuns } from '../../../../../services/suspendedRuns';\nimport { createTeamExtensionRuntime } from '../../../../../services/teamRuntime';\nimport { catalogModels, presentCatalog } from '../../../../../services/webSubagentCatalog';\nimport {\n SUBAGENT_CATALOG_TYPE,\n SUBAGENT_RUNS_TYPE,\n type SubagentRun,\n type SubagentRunState,\n} from '../../../../../types/webSubagents';\n\ninterface SessionRunProjection extends SubagentRun {\n /** Host-private child transcript path consumed by the hub, not the browser. */\n sessionFile?: string;\n}\n\nconst TERMINAL_RUN_STATES = new Set(['completed', 'complete', 'failed', 'stopped', 'paused']);\n\nfunction runState(status: string): SubagentRunState {\n if (status === 'completed' || status === 'complete') return 'done';\n if (status === 'failed') return 'failed';\n if (status === 'stopped' || status === 'paused') return 'stopped';\n if (status === 'queued') return 'queued';\n return 'running';\n}\n\nfunction presentTrackedRun(run: TrackedAsyncJob): SessionRunProjection | undefined {\n if (!run.agent || !run.status || run.startedAt === undefined) return undefined;\n const lastUpdate = run.updatedAt ?? run.startedAt;\n return {\n runId: run.runId,\n agent: run.agent,\n ...(run.identity === undefined ? {} : { identity: run.identity }),\n ...(run.inline === undefined ? {} : { inline: run.inline }),\n state: runState(run.status),\n rawState: run.status,\n task: run.task ?? '',\n cwd: run.cwd ?? '',\n startedAt: run.startedAt,\n ...(TERMINAL_RUN_STATES.has(run.status) ? { endedAt: lastUpdate } : {}),\n lastUpdate,\n tail: [],\n ...(run.sessionFile === undefined ? {} : { sessionFile: run.sessionFile }),\n ...(run.summary === undefined ? {} : { summary: run.summary }),\n ...(run.error === undefined ? {} : { error: run.error }),\n };\n}\n\nfunction presentNativeRun(run: NativeAsyncJobProjection): SessionRunProjection {\n return {\n runId: run.runId,\n agent: run.agent,\n ...(run.identity === undefined ? {} : { identity: run.identity }),\n ...(run.inline === undefined ? {} : { inline: run.inline }),\n state: runState(run.status),\n rawState: run.status,\n task: run.task,\n cwd: run.cwd,\n startedAt: run.startedAt,\n ...(TERMINAL_RUN_STATES.has(run.status) ? { endedAt: run.updatedAt } : {}),\n lastUpdate: run.updatedAt,\n tail: [],\n ...(run.sessionFile === undefined ? {} : { sessionFile: run.sessionFile }),\n ...(run.summary === undefined ? {} : { summary: run.summary }),\n ...(run.error === undefined ? {} : { error: run.error }),\n };\n}\n\nfunction publishRuns(\n directEvents: DoomDirectEventBus,\n sessionId: string,\n jobs: readonly TrackedAsyncJob[],\n nativeRuns: ReadonlyMap<string, NativeAsyncJobProjection>,\n): void {\n const runs = jobs\n .filter((job) => !job.native)\n .map(presentTrackedRun)\n .filter((run): run is SessionRunProjection => run !== undefined);\n runs.push(...[...nativeRuns.values()].map(presentNativeRun));\n directEvents.publish(SUBAGENT_RUNS_TYPE, sessionId, { runs });\n}\n\nconst TEAM_COST_STATUS = 'doom-team-cost';\nconst COST_DECIMALS = 6;\n\nfunction updateTeamCost(\n client: { setStatus(source: string, text: string | undefined): void },\n jobs: readonly TrackedAsyncJob[],\n nativeRuns: ReadonlyMap<string, NativeAsyncJobProjection>,\n costs: Map<string, number>,\n previousText: string | undefined,\n attached: boolean,\n force = false,\n): string | undefined {\n const trackedCosts = new Map<string, number>();\n for (const job of jobs) {\n if (job.cost !== undefined && Number.isFinite(job.cost)) trackedCosts.set(job.runId, job.cost);\n }\n for (const [runId, run] of nativeRuns) {\n if (trackedCosts.has(runId) || run.cost === undefined || !Number.isFinite(run.cost)) continue;\n costs.set(runId, run.cost);\n }\n for (const [runId, cost] of trackedCosts) costs.set(runId, cost);\n\n let total = 0;\n for (const cost of costs.values()) total += cost;\n const text = total > 0 ? String(Number(total.toFixed(COST_DECIMALS))) : undefined;\n if (!force && text === previousText) return previousText;\n if (attached) client.setStatus(TEAM_COST_STATUS, text);\n return text;\n}\n\nconst root = defineRoot(({ context, host: serverHost, agent: host }: DoomServerPluginContext) => {\n if (!host) throw new Error('Team session requires the headless host.');\n if (serverHost.context.environment === undefined) {\n throw new Error('Team headless facet requires an admitted session environment.');\n }\n const directEvents = serverHost.context.directEvents;\n if (directEvents === undefined) {\n throw new Error('Team headless facet requires host-owned direct events.');\n }\n const execution = host.context;\n const runtime = createTeamExtensionRuntime(undefined, {\n environment: serverHost.context.environment,\n childSessions: { get: () => readDoomChildSessionService(context) },\n nativeRunProjection,\n });\n const scope = createSessionScope(execution.sessionId);\n runtime.management.bindSessionScope(scope);\n const jobs = runtime.asyncJobTracker.forSession(execution.sessionId, scope);\n const bridge = createDelegationBridge({\n planner: runtime.spawnPlanner,\n management: runtime.management,\n waiter: runtime.subagentWaiter,\n scheduler: runtime.pollScheduler,\n tracker: runtime.asyncJobTracker,\n loadConfig: () => loadConfig().config,\n });\n const nativeRuns = new Map<string, NativeAsyncJobProjection>();\n const childCosts = new Map<string, number>();\n let costText: string | undefined;\n let activityAttached = false;\n const publishRunSnapshot = (): void => {\n if (activityAttached) publishRuns(directEvents, execution.sessionId, jobs.list(), nativeRuns);\n };\n const publishCost = (force = false): void => {\n costText = updateTeamCost(execution.client, jobs.list(), nativeRuns, childCosts, costText, activityAttached, force);\n };\n const unsubscribeCostTracker = runtime.asyncJobTracker.subscribe(execution.sessionId, () => {\n publishCost();\n publishRunSnapshot();\n });\n const unsubscribeCostNative = subscribeNativeRunProjection(execution.sessionId, (runs) => {\n nativeRuns.clear();\n for (const run of runs) nativeRuns.set(run.runId, run);\n publishCost();\n publishRunSnapshot();\n });\n\n // Three jobs the Pi facet gets from one `ExtensionAPI.sendMessage`, which a\n // headless session has to do by hand:\n //\n // toast `client.notify` - operator-facing only. It writes a\n // `doom-notification` custom entry whose body is flattened to a\n // single line and capped at 4096 characters, and the model never\n // sees custom entries. So it gets a headline, not the result.\n // transcript `session.appendCustomEntry` - the durable record, under the\n // same custom type the TUI renderer uses, with the full\n // multi-line content and the structured details.\n // wake `session.admitPrompt(content, 'steer')` - the only call that\n // puts the completion in front of the model. 'steer' means \"how\n // to deliver if a turn is running\"; an idle agent is woken\n // either way. `session.prompt(_, 'steer')` would NOT do this: it\n // is enqueue-only and parks the message on an idle lane.\n //\n // Serialised through one tail promise. Failures bypass the notifier's batcher\n // (`services/notify`), so two runs failing in the same tick produce two\n // deliveries; sequencing them keeps each one observing settled lane state.\n let deliveries: Promise<void> = Promise.resolve();\n runtime.completionNotifier.attachHost({\n sendMessage: (message, options) => {\n const details = message.details ?? [];\n const headline = details.length > 0 ? formatCompletionHeadline(details) : message.content;\n const failed = details.some((detail) => detail.status !== 'completed');\n const delivery = deliveries.then(async () => {\n await execution.client.notify({ body: headline, level: failed ? 'warning' : 'info' });\n await execution.session.appendCustomEntry(SUBAGENT_NOTIFY_MESSAGE_TYPE, {\n content: message.content,\n details,\n });\n // `triggerTurn: false` has no faithful headless mapping: there is no\n // way to put text in model context without starting or joining a turn\n // (`appendCustomEntry` is journal-only). Keep today's behaviour - the\n // operator sees it, the model does not wake - rather than guessing.\n if (options?.triggerTurn === false) return;\n // Matching the voice facet, which also refuses rather than degrading:\n // `session.prompt(_, 'steer')` is NOT a fallback here, because it is\n // enqueue-only and would park the completion on an idle lane - the\n // original bug. Refusing surfaces as non-delivery, which keeps\n // `ResultWatcher`'s claim alive for a retry.\n if (!execution.session.admitPrompt) throw new Error('The session cannot admit a completion prompt.');\n await execution.session.admitPrompt(message.content, 'steer');\n });\n // The notifier reports non-delivery on a rejection, which keeps\n // `ResultWatcher`'s claim alive for a retry. The tail must not inherit\n // that rejection, or one failed completion would poison every later one.\n deliveries = delivery.catch(() => undefined);\n return delivery;\n },\n });\n const transport: NativeTeamTransport = {\n sendMessage: ((message) =>\n void execution.client.notify({\n body:\n typeof message.content === 'string'\n ? message.content\n : message.content.map((part) => ('text' in part ? part.text : '[image]')).join('\\n'),\n level: 'info',\n })) as NativeTeamTransport['sendMessage'],\n sendUserMessage: ((message) =>\n void execution.session.prompt(\n typeof message === 'string'\n ? message\n : message.map((part) => ('text' in part ? part.text : '[image]')).join('\\n'),\n 'steer',\n )) as NativeTeamTransport['sendUserMessage'],\n };\n const channel = runtime.teamChannel.createHeadlessRuntime(transport);\n const serverService = (ctx: Context) => {\n ctx.plugin((providerContext) => {\n const availableModels = execution.model ? [toModelInfo(execution.model)] : [];\n providerContext.provide(\n DOOM_DELEGATION_SERVICE,\n bridge.createService(providerContext, {\n sessionId: execution.sessionId,\n sessionScope: createSessionScope(execution.sessionId),\n availableModels,\n ...(execution.model ? { parentModel: execution.model } : {}),\n // Read fresh per request, exactly as the Pi facet does at root.cli.ts.\n // Omitting this is what made every headless `context: 'fork'`\n // delegation report that the parent had no capturable branch.\n captureForkSource: () => execution.session?.forkSource?.(),\n }),\n );\n const backgroundWork = readDoomBackgroundWorkService(providerContext);\n if (backgroundWork === undefined) throw new Error('Team requires the DoomPi Session foundation.');\n registerDirectRunBackgroundWork(providerContext, backgroundWork, execution.sessionId, runtime.asyncJobTracker);\n providerContext.provide(DOOM_SUBAGENT_POLICY_SERVICE, createSubagentPolicyService(runtime.capabilityPolicies));\n });\n };\n\n const environment = serverHost.context.environment;\n const activity: DoomHeadlessActivity = {\n name: '@agimon-ai/doompi-team',\n async start(activityContext) {\n activityAttached = true;\n publishCost(true);\n publishRunSnapshot();\n try {\n const discovered = runtime.discovery.discover(execution.cwd, 'both').agents;\n directEvents.publish(SUBAGENT_CATALOG_TYPE, execution.sessionId, {\n cwd: execution.cwd,\n agents: presentCatalog(discovered),\n models: catalogModels(discovered, resolveActiveTeamModelSpecs(environment) ?? []),\n });\n } catch (error) {\n directEvents.publish(SUBAGENT_CATALOG_TYPE, execution.sessionId, {\n cwd: execution.cwd,\n agents: [],\n models: [],\n warning: error instanceof Error ? error.message : String(error),\n });\n }\n try {\n const opened = await openScopeAsync(scope);\n if (opened.suspended.length)\n await activityContext.client.notify({ body: formatSuspendedRuns(opened.suspended), level: 'info' });\n channel.bindMainSession(activityContext.sessionId);\n return () => {\n if (!activityAttached) return;\n activityAttached = false;\n channel.dispose();\n execution.client.setStatus(TEAM_COST_STATUS, undefined);\n };\n } catch (error) {\n activityAttached = false;\n execution.client.setStatus(TEAM_COST_STATUS, undefined);\n throw error;\n }\n },\n };\n\n return {\n value: {\n runtime,\n execution,\n scope,\n jobs,\n bridge,\n channel,\n directEvents,\n environment: serverHost.context.environment,\n },\n services: [\n (context: Context) => {\n if (readDoomBackgroundWorkService(context) === undefined) provideBackgroundWorkService(context);\n },\n serverService,\n mountMcpTools([createHeadlessIntercomTool(channel), createHeadlessSubagentTool(runtime, execution)]),\n ],\n activities: [activity],\n // Mirrors `root.cli.ts`, which starts the scheduler in its own `onStart`.\n // Without this the delegation bridge's progress subscription never ticks\n // and `scheduler.wake()` is a no-op, so the pre-timeout nudge a long\n // delegation gets in the TUI never fires headless. `onDispose` below\n // already stops it; this is the missing half of that pair.\n onStart() {\n runtime.pollScheduler.start();\n },\n async onDispose() {\n activityAttached = false;\n execution.client.setStatus(TEAM_COST_STATUS, undefined);\n channel.dispose();\n runtime.completionNotifier.dispose();\n const suspension = suspendScopeRuns({\n scope,\n reason: 'headless session ended',\n jobs: jobs.list(),\n stop: (runId, reason) => runtime.management.stop(runId, reason),\n });\n const nativeShutdown = runtime.nativeRuns.close().finally(() => nativeRunProjection.dispose(execution.sessionId));\n const outcomes = await Promise.allSettled([suspension, nativeShutdown]);\n for (const outcome of outcomes) {\n if (outcome.status === 'rejected')\n process.emitWarning(`Could not shut down headless Team runs: ${String(outcome.reason)}`);\n }\n unsubscribeCostTracker();\n unsubscribeCostNative();\n nativeRuns.clear();\n childCosts.clear();\n costText = undefined;\n bridge.abandonAll();\n runtime.dispose();\n runtime.asyncJobTracker.stop();\n runtime.pollScheduler.stop();\n },\n };\n});\n\nexport type TeamServerScope = Awaited<ReturnType<typeof root>>['value'];\nexport default root;\n","import { defineRoot } from '@agimon-ai/doompi-core/extensionFile';\n\nimport contribution from './_lib/root.server';\n\nexport default defineRoot(contribution);\n","import { defineChannel } from '@agimon-ai/doompi-core/extensionFile';\nimport type {\n DoomHubChannelHost as HubChannelHost,\n DoomHubChannelSource as HubChannelSource,\n DoomHubSessionScope as HubSessionScope,\n DoomHubChannel as WebHubChannel,\n} from '@agimon-ai/doompi-core/hubChannel';\n\nimport { SUBAGENT_CATALOG_TYPE, type SubagentCatalogPayload } from '../../../../types/webSubagents';\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\nfunction isSubagentCatalogPayload(value: unknown): value is SubagentCatalogPayload {\n return (\n isRecord(value) &&\n typeof value.cwd === 'string' &&\n Array.isArray(value.agents) &&\n Array.isArray(value.models) &&\n value.models.every((model) => typeof model === 'string')\n );\n}\n\n/**\n * The subagent catalog data channel consumes the session-owned catalog event.\n * The direct event bus retains a bounded latest snapshot for late subscribers.\n */\nexport function createSubagentCatalogChannel(): WebHubChannel {\n return {\n frameType: SUBAGENT_CATALOG_TYPE,\n start(host: HubChannelHost) {\n const scopes = new Map<string, HubSessionScope>();\n const latest = new Map<string, SubagentCatalogPayload>();\n const subscriptions = new Map<string, () => void>();\n const publish = (scope: HubSessionScope, payload: SubagentCatalogPayload): void => {\n if (scopes.get(scope.sessionId) !== scope || payload.cwd !== scope.cwd) return;\n latest.set(scope.sessionId, payload);\n host.publish(scope.sessionId, payload);\n };\n const source: HubChannelSource = {\n payloadFor(scope) {\n return scopes.has(scope.sessionId) ? latest.get(scope.sessionId) : undefined;\n },\n sessionAdded(scope) {\n subscriptions.get(scope.sessionId)?.();\n scopes.set(scope.sessionId, scope);\n latest.delete(scope.sessionId);\n const unsubscribe = host.directEvents.subscribe(\n SUBAGENT_CATALOG_TYPE,\n scope.sessionId,\n (value) => {\n if (isSubagentCatalogPayload(value)) publish(scope, value);\n },\n { replayLatest: true },\n );\n subscriptions.set(scope.sessionId, unsubscribe);\n },\n sessionRemoved(sessionId) {\n subscriptions.get(sessionId)?.();\n subscriptions.delete(sessionId);\n scopes.delete(sessionId);\n latest.delete(sessionId);\n },\n close() {\n for (const unsubscribe of subscriptions.values()) unsubscribe();\n subscriptions.clear();\n scopes.clear();\n latest.clear();\n },\n };\n return source;\n },\n };\n}\n\nexport default defineChannel(createSubagentCatalogChannel);\n","import { defineChannel } from '@agimon-ai/doompi-core/extensionFile';\n\nimport contribution from './_lib/subagent-catalog';\n\nexport default defineChannel(contribution);\n","import { defineChannel } from '@agimon-ai/doompi-core/extensionFile';\nimport type {\n DoomHubChannelSource as HubChannelSource,\n DoomHubSessionScope,\n DoomHubChannel as WebHubChannel,\n} from '@agimon-ai/doompi-core/hubChannel';\n\nimport { SUBAGENT_RUNS_TYPE, type SubagentRun } from '../../../../types/webSubagents';\n\nconst RUN_ID_PATTERN = /^[\\w.-]+$/;\n\ninterface SessionRunProjection extends SubagentRun {\n /** Host-private child transcript path. Never published to the browser. */\n sessionFile?: string;\n}\n\ntype SessionRunProjectionPayload = { runs: SessionRunProjection[] };\ntype SubagentRunsPayload = { runs: SubagentRun[] };\n\nfunction isSubagentRunsPayload(value: unknown): value is SessionRunProjectionPayload {\n return typeof value === 'object' && value !== null && Array.isArray((value as { runs?: unknown }).runs);\n}\n\nfunction publicPayload(payload: SessionRunProjectionPayload): SubagentRunsPayload {\n return { runs: payload.runs.map(({ sessionFile: _sessionFile, ...run }) => run) };\n}\n\n/**\n * The built-in subagents data channel consumes current state from the\n * host-owned direct event bus. Its bounded latest replay seeds late subscribers.\n */\nexport function createSubagentsChannel(): WebHubChannel {\n return {\n frameType: SUBAGENT_RUNS_TYPE,\n start(host) {\n const scopes = new Map<string, DoomHubSessionScope>();\n const latest = new Map<string, SessionRunProjectionPayload>();\n const subscriptions = new Map<string, () => void>();\n const publish = (scope: DoomHubSessionScope, payload: SessionRunProjectionPayload): void => {\n if (scopes.get(scope.sessionId) !== scope) return;\n latest.set(scope.sessionId, payload);\n host.publish(scope.sessionId, publicPayload(payload));\n };\n const source: HubChannelSource = {\n payloadFor(scope) {\n const payload = scopes.has(scope.sessionId) ? latest.get(scope.sessionId) : undefined;\n return payload === undefined ? undefined : publicPayload(payload);\n },\n threadJournal(scope, runId) {\n if (!RUN_ID_PATTERN.test(runId)) return undefined;\n const projected = latest.get(scope.sessionId)?.runs.find((run) => run.runId === runId);\n return projected?.sessionFile;\n },\n sessionAdded(scope) {\n subscriptions.get(scope.sessionId)?.();\n scopes.set(scope.sessionId, scope);\n latest.delete(scope.sessionId);\n const unsubscribe = host.directEvents.subscribe(\n SUBAGENT_RUNS_TYPE,\n scope.sessionId,\n (value) => {\n if (isSubagentRunsPayload(value)) publish(scope, value);\n },\n { replayLatest: true },\n );\n subscriptions.set(scope.sessionId, unsubscribe);\n },\n sessionRemoved(sessionId) {\n subscriptions.get(sessionId)?.();\n subscriptions.delete(sessionId);\n scopes.delete(sessionId);\n latest.delete(sessionId);\n },\n close() {\n for (const unsubscribe of subscriptions.values()) unsubscribe();\n subscriptions.clear();\n scopes.clear();\n latest.clear();\n },\n };\n return source;\n },\n };\n}\n\nexport default defineChannel(createSubagentsChannel);\n","import { defineChannel } from '@agimon-ai/doompi-core/extensionFile';\n\nimport contribution from './_lib/subagent-runs';\n\nexport default defineChannel(contribution);\n","import type { WithRoot } from '@agimon-ai/doompi-core/extensionFile';\nimport type { DoomHeadlessExecutionContext } from '@agimon-ai/doompi-core/headless';\nimport type { DoomApi, DoomApiHandler } from '@agimon-ai/doompi-core/packageApi';\nimport type { DoomServerPluginContext } from '@agimon-ai/doompi-core/serverFacet';\n\nimport { AgentDiscoveryService, resolveActiveTeamModelSpecs } from '../../../../../../services/agentDiscovery';\nimport { loadConfig } from '../../../../../../services/config';\nimport { DoomTeamExpectedError } from '../../../../../../services/errors';\nimport type { ControlActionResult, SteerActionResult } from '../../../../../../services/managementActions';\nimport { toModelInfo } from '../../../../../../services/modelInfo';\nimport { createSessionScope } from '../../../../../../services/sessionPaths';\nimport type { TeamExtensionRuntime } from '../../../../../../services/teamRuntime';\nimport { catalogModels, presentCatalog, type CatalogAgentInput } from '../../../../../../services/webSubagentCatalog';\nimport type { TeamServerScope } from '../../_lib/root.server';\n\nexport const TEAM_API_BASE_PATH = 'team';\nexport const TEAM_CATALOG_ROUTE = '/catalog';\nexport const TEAM_RUN_ROUTE = '/run';\nexport const TEAM_STEER_ROUTE = '/steer';\nexport const TEAM_STOP_ROUTE = '/stop';\n\nexport interface TeamRunRequest {\n agent: string;\n task: string;\n fork: boolean;\n model?: string;\n}\n\nexport interface TeamSteerRequest {\n runId: string;\n message: string;\n}\n\nexport interface TeamStopRequest {\n runId: string;\n}\n\nexport interface TeamCatalogSnapshot {\n agents: CatalogAgentInput[];\n models: string[];\n}\n\nexport interface TeamApiOptions {\n cwd: string;\n environment?: Readonly<NodeJS.ProcessEnv>;\n read?: (cwd: string) => TeamCatalogSnapshot;\n launch?: (request: TeamRunRequest) => Promise<{ runId: string }>;\n steer?: (request: TeamSteerRequest, signal: AbortSignal) => Promise<SteerActionResult>;\n stop?: (request: TeamStopRequest) => Promise<ControlActionResult>;\n}\n\nfunction isRunRequest(value: unknown): value is TeamRunRequest {\n if (typeof value !== 'object' || value === null || Array.isArray(value)) return false;\n const request = value as Record<string, unknown>;\n return (\n typeof request.agent === 'string' &&\n request.agent.trim() !== '' &&\n typeof request.task === 'string' &&\n typeof request.fork === 'boolean' &&\n (request.model === undefined || (typeof request.model === 'string' && request.model.trim() !== '')) &&\n Object.keys(request).every((key) => ['agent', 'task', 'fork', 'model'].includes(key))\n );\n}\n\nfunction isSteerRequest(value: unknown): value is TeamSteerRequest {\n if (typeof value !== 'object' || value === null || Array.isArray(value)) return false;\n const request = value as Record<string, unknown>;\n return (\n typeof request.runId === 'string' &&\n request.runId.trim() !== '' &&\n typeof request.message === 'string' &&\n request.message.trim() !== '' &&\n Object.keys(request).every((key) => ['runId', 'message'].includes(key))\n );\n}\n\nfunction isStopRequest(value: unknown): value is TeamStopRequest {\n if (typeof value !== 'object' || value === null || Array.isArray(value)) return false;\n const request = value as Record<string, unknown>;\n return (\n typeof request.runId === 'string' &&\n request.runId.trim() !== '' &&\n Object.keys(request).every((key) => key === 'runId')\n );\n}\n\n/** The typed error's text carries a recovery hint written for the model, so a missing run gets a sentence for people. */\nfunction controlFailure(error: unknown): Response {\n if (error instanceof DoomTeamExpectedError && error.code === 'run_not_found')\n return Response.json({ error: 'This run is not active.' }, { status: 404 });\n return Response.json({ error: error instanceof Error ? error.message : String(error) }, { status: 409 });\n}\n\n/** Serves catalog discovery, run launch, and run steer and stop from the selected session process, never through a parent prompt. */\nexport function createTeamApiHandler(options: TeamApiOptions): DoomApiHandler {\n const discovery = new AgentDiscoveryService(options.environment);\n const read =\n options.read ??\n ((cwd: string): TeamCatalogSnapshot => ({\n agents: discovery.discover(cwd, 'both').agents,\n models: resolveActiveTeamModelSpecs(options.environment) ?? [],\n }));\n\n return {\n async fetch(request) {\n const url = new URL(request.url);\n if (request.method === 'POST' && url.pathname === TEAM_RUN_ROUTE && options.launch) {\n let input: unknown;\n try {\n input = await request.json();\n } catch {\n return Response.json({ error: 'Invalid run request.' }, { status: 400 });\n }\n if (!isRunRequest(input)) return Response.json({ error: 'Invalid run request.' }, { status: 400 });\n try {\n return Response.json(await options.launch(input), { status: 201 });\n } catch (error) {\n return Response.json({ error: error instanceof Error ? error.message : String(error) }, { status: 409 });\n }\n }\n if (request.method === 'POST' && url.pathname === TEAM_STEER_ROUTE && options.steer) {\n let input: unknown;\n try {\n input = await request.json();\n } catch {\n return Response.json({ error: 'Invalid steer request.' }, { status: 400 });\n }\n if (!isSteerRequest(input)) return Response.json({ error: 'Invalid steer request.' }, { status: 400 });\n try {\n return Response.json(\n await options.steer({ runId: input.runId.trim(), message: input.message.trim() }, request.signal),\n );\n } catch (error) {\n return controlFailure(error);\n }\n }\n if (request.method === 'POST' && url.pathname === TEAM_STOP_ROUTE && options.stop) {\n let input: unknown;\n try {\n input = await request.json();\n } catch {\n return Response.json({ error: 'Invalid stop request.' }, { status: 400 });\n }\n if (!isStopRequest(input)) return Response.json({ error: 'Invalid stop request.' }, { status: 400 });\n try {\n return Response.json(await options.stop({ runId: input.runId.trim() }));\n } catch (error) {\n return controlFailure(error);\n }\n }\n if (request.method !== 'GET' || url.pathname !== TEAM_CATALOG_ROUTE) {\n return Response.json({ error: 'Not found.' }, { status: 404 });\n }\n try {\n discovery.invalidate();\n const snapshot = read(options.cwd);\n return Response.json({\n cwd: options.cwd,\n agents: presentCatalog(snapshot.agents),\n models: catalogModels(snapshot.agents, snapshot.models),\n });\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n return Response.json({ error: message }, { status: 500 });\n }\n },\n close: () => undefined,\n };\n}\n\n/** One mounted session API, backed by the Team runtime that owns the subagent tool. */\nexport function createTeamSessionApi(runtime: TeamExtensionRuntime, execution: DoomHeadlessExecutionContext): DoomApi {\n const scope = createSessionScope(execution.sessionId);\n const jobs = runtime.asyncJobTracker.forSession(execution.sessionId, scope);\n\n const launch = async (request: TeamRunRequest): Promise<{ runId: string }> => {\n const parentForkSource = request.fork ? await execution.session.forkSource?.() : undefined;\n if (request.fork && !parentForkSource) throw new Error('This session cannot capture a fork source.');\n const plan = await runtime.spawnPlanner.spawn(\n {\n single: {\n agent: request.agent.trim(),\n task: request.task.trim(),\n context: request.fork ? 'fork' : 'fresh',\n ...(request.model ? { model: request.model } : {}),\n },\n cwd: execution.cwd,\n agentScope: 'both',\n sessionScope: scope,\n environment: execution.environment,\n parentSessionId: execution.sessionId,\n ...(parentForkSource ? { parentForkSource } : {}),\n availableModels: execution.model ? [toModelInfo(execution.model)] : [],\n ...(execution.model ? { parentModel: execution.model } : {}),\n },\n loadConfig().config,\n );\n const outcome = plan.outcomes[0];\n if (!outcome?.runId) throw new Error(outcome?.error ?? 'The agent did not start.');\n jobs.track(\n outcome.runId,\n outcome.identity ? { identity: outcome.identity, inline: outcome.inline ?? false } : undefined,\n );\n return { runId: outcome.runId };\n };\n\n return {\n basePath: TEAM_API_BASE_PATH,\n start: () =>\n createTeamApiHandler({\n cwd: execution.cwd,\n environment: execution.environment,\n launch,\n steer: (request, signal) => runtime.management.steer(request.runId, request.message, undefined, signal),\n stop: (request) => runtime.management.stop(request.runId),\n }),\n };\n}\n\nexport default (context: WithRoot<DoomServerPluginContext, TeamServerScope>) =>\n createTeamSessionApi(context.root.runtime, context.root.execution);\n","import { defineRoute } from '@agimon-ai/doompi-core/extensionFile';\n\nimport contribution from './_lib/route.server';\n\nexport default defineRoute(contribution);\n","import type { WithRoot } from '@agimon-ai/doompi-core/extensionFile';\nimport type { DoomServerPluginContext } from '@agimon-ai/doompi-core/serverFacet';\n\nimport { formatTeamContextSnapshot, readActiveTeamSnapshot } from '../../../../../../services/teamSnapshot';\nimport type { TeamServerScope } from '../../_lib/root.server';\n\n/**\n * The roster the model is allowed to see.\n *\n * Reads the public snapshot rather than `channel.current()`: the latter is the raw\n * `TeamMemberContext`, whose `token` is a session capability documented as never\n * leaving the direct context. A context resource is pasted into the system prompt,\n * sent to the provider and persisted, so the raw struct must not be serialized here.\n * `formatTeamContextSnapshot` is the same projection the Pi facet renders.\n */\nexport default (context: WithRoot<DoomServerPluginContext, TeamServerScope>) => ({\n name: 'doompi/team',\n kind: 'context' as const,\n // A roster of nobody says nothing; '' is dropped from the prompt by composeSystemPrompt.\n read: () => {\n const rendered = formatTeamContextSnapshot(readActiveTeamSnapshot(context.root.channel));\n return rendered === undefined || rendered === '(no active team members)' ? '' : rendered;\n },\n});\n","import { defineResource } from '@agimon-ai/doompi-core/extensionFile';\n\nimport contribution from './_lib/team.server';\n\nexport default defineResource(contribution);\n","import { defineServerTool, type WithRoot } from '@agimon-ai/doompi-core/extensionFile';\nimport type { DoomServerPluginContext } from '@agimon-ai/doompi-core/serverFacet';\n\nimport { createHeadlessIntercomTool } from '../../../../../services/headlessIntercomTool';\nimport type { TeamServerScope } from '../_lib/root.server';\n\nexport default defineServerTool((context: WithRoot<DoomServerPluginContext, TeamServerScope>) =>\n createHeadlessIntercomTool(context.root.channel),\n);\n","import { defineServerTool, type WithRoot } from '@agimon-ai/doompi-core/extensionFile';\nimport type { DoomServerPluginContext } from '@agimon-ai/doompi-core/serverFacet';\n\nimport { createHeadlessSubagentTool } from '../../../../../services/headlessSubagentTool';\nimport type { TeamServerScope } from '../_lib/root.server';\n\nexport default defineServerTool((context: WithRoot<DoomServerPluginContext, TeamServerScope>) =>\n createHeadlessSubagentTool(context.root.runtime, context.root.execution),\n);\n","// Generated by @agimon-ai/doompi-build. Do not edit by hand.\nimport { defineServerPlugin, type DoomServerSessionPlugin } from '@agimon-ai/doompi-core/serverFacet';\nimport { composeRootHooks } from '@agimon-ai/doompi-core/extensionFile';\n\nimport rootSession from '../src/extensions/workspaces/sessions/(backend)/root.server';\nimport channelSubagentCatalog from '../src/extensions/(backend)/channel/subagent-catalog.server';\nimport channelSubagentRuns from '../src/extensions/(backend)/channel/subagent-runs.server';\nimport apiRoute from '../src/extensions/workspaces/sessions/(backend)/api/route.server';\nimport resourceTeam from '../src/extensions/workspaces/sessions/(backend)/resource/team.server';\nimport toolIntercom from '../src/extensions/workspaces/sessions/(backend)/tool/intercom.server';\nimport toolSubagent from '../src/extensions/workspaces/sessions/(backend)/tool/subagent.server';\n\ntype Factory<T, C> = (context: C) => T;\nconst at = <T, C>(value: T | Factory<T, C>, context: C): T =>\n typeof value === 'function' ? (value as Factory<T, C>)(context) : value;\nconst via = <T>(identity: Record<string, unknown>, value: unknown): T =>\n (value === undefined ? undefined : { ...identity, ...(value as object) }) as T;\n\nexport const facet = defineServerPlugin({\n name: '@agimon-ai/doompi-team',\n global: () => ({\n get channels(): DoomServerSessionPlugin['channels'] { return [() => via({ frameType: 'subagent_catalog' }, channelSubagentCatalog()), () => via({ frameType: 'subagent_runs' }, channelSubagentRuns())]; },\n }),\n workspace: () => ({\n get channels(): DoomServerSessionPlugin['channels'] { return [() => via({ frameType: 'subagent_catalog' }, channelSubagentCatalog()), () => via({ frameType: 'subagent_runs' }, channelSubagentRuns())]; },\n }),\n session: async (context) => {\n const scopeSession = await rootSession(context);\n const contextSession = { ...context, root: scopeSession.value };\n return {\n ...composeRootHooks(scopeSession),\n get api(): DoomServerSessionPlugin['api'] { return [at(apiRoute, contextSession)]; },\n get channels(): DoomServerSessionPlugin['channels'] { return [() => via({ frameType: 'subagent_catalog' }, channelSubagentCatalog()), () => via({ frameType: 'subagent_runs' }, channelSubagentRuns())]; },\n get resources(): DoomServerSessionPlugin['resources'] { return [at(resourceTeam, contextSession)]; },\n get tools(): DoomServerSessionPlugin['tools'] { return [via({ name: 'intercom' }, at(toolIntercom, contextSession)), via({ name: 'subagent' }, at(toolSubagent, contextSession))]; },\n services: [...(scopeSession.services ?? [])],\n get activities(): DoomServerSessionPlugin['activities'] { return [...(scopeSession.activities ?? [])]; },\n };\n },\n});\n\nexport default facet;\n"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@agimon-ai/doompi-team",
3
- "version": "0.0.1-alpha.98",
3
+ "version": "0.0.1-alpha.99",
4
4
  "description": "Asynchronous named subagents, team runs, intercom, and model policy for Pi coding agents.",
5
5
  "keywords": [
6
6
  "agent-team",
@@ -124,24 +124,24 @@
124
124
  "registry": "https://registry.npmjs.org/"
125
125
  },
126
126
  "dependencies": {
127
- "@agimon-ai/doompi-cache": "0.0.1-alpha.64",
128
- "@agimon-ai/doompi-config": "0.0.1-alpha.97",
129
- "@agimon-ai/doompi-core": "0.0.1-alpha.98",
130
- "@agimon-ai/doompi-session": "0.0.1-alpha.22",
131
- "@agimon-ai/doompi-telemetry": "0.0.1-alpha.88",
132
- "@agimon-ai/doompi-ui": "0.0.1-alpha.98",
133
- "@agimon-ai/doompi-web-components": "0.0.1-alpha.56",
134
- "@agimon-ai/doompi-web-security": "0.0.1-alpha.51",
127
+ "@agimon-ai/doompi-cache": "0.0.1-alpha.65",
128
+ "@agimon-ai/doompi-config": "0.0.1-alpha.98",
129
+ "@agimon-ai/doompi-core": "0.0.1-alpha.99",
130
+ "@agimon-ai/doompi-session": "0.0.1-alpha.23",
131
+ "@agimon-ai/doompi-telemetry": "0.0.1-alpha.89",
132
+ "@agimon-ai/doompi-ui": "0.0.1-alpha.99",
133
+ "@agimon-ai/doompi-web-components": "0.0.1-alpha.57",
134
+ "@agimon-ai/doompi-web-security": "0.0.1-alpha.52",
135
135
  "@deepseek-ai/cordis": "4.0.2",
136
136
  "typebox": "1.3.34",
137
137
  "yaml": "2.9.1"
138
138
  },
139
139
  "devDependencies": {
140
- "@agimon-ai/doompi-build": "0.0.1-alpha.20",
141
- "@earendil-works/pi-agent-core": "0.87.1",
142
- "@earendil-works/pi-ai": "0.87.1",
143
- "@earendil-works/pi-coding-agent": "0.87.1",
144
- "@earendil-works/pi-tui": "0.87.1",
140
+ "@agimon-ai/doompi-build": "0.0.1-alpha.21",
141
+ "@earendil-works/pi-agent-core": "0.99.1",
142
+ "@earendil-works/pi-ai": "0.99.1",
143
+ "@earendil-works/pi-coding-agent": "0.99.1",
144
+ "@earendil-works/pi-tui": "0.99.1",
145
145
  "@tanstack/react-store": "0.11.1",
146
146
  "@tanstack/store": "0.11.1",
147
147
  "@types/node": "26.6.2",
@@ -153,10 +153,10 @@
153
153
  "vitest": "5.0.1"
154
154
  },
155
155
  "peerDependencies": {
156
- "@earendil-works/pi-agent-core": "0.87.1",
157
- "@earendil-works/pi-ai": "0.87.1",
158
- "@earendil-works/pi-coding-agent": "0.87.1",
159
- "@earendil-works/pi-tui": "0.87.1"
156
+ "@earendil-works/pi-agent-core": "0.99.1",
157
+ "@earendil-works/pi-ai": "0.99.1",
158
+ "@earendil-works/pi-coding-agent": "0.99.1",
159
+ "@earendil-works/pi-tui": "0.99.1"
160
160
  },
161
161
  "peerDependenciesMeta": {
162
162
  "@earendil-works/pi-agent-core": {