fix: Add 'running' field to sessions_list for accurate subagent status
sessions_list was reporting totalTokens: 0 for actively running subagent sessions because token counts are only persisted at run completion. This caused orchestration logic to incorrectly determine agent availability. Changes: - Add getRunningSubagentSessions() to subagent-registry.ts - Add isSubagentSessionRunning() helper for individual checks - Modify listSessionsFromStore() to include 'running' field - Update GatewaySessionRow and SessionListRow types The 'running' field is true when a session has an active subagent run (startedAt is set but endedAt is not). Fixes: #2129
This commit is contained in:
parent
9eafc6a9f0
commit
a35d319580
@ -369,3 +369,32 @@ export function listSubagentRunsForRequester(requesterSessionKey: string): Subag
|
|||||||
export function initSubagentRegistry() {
|
export function initSubagentRegistry() {
|
||||||
restoreSubagentRunsOnce();
|
restoreSubagentRunsOnce();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Check if a session key has an active (in-progress) subagent run.
|
||||||
|
* Returns true if a run exists with startedAt but no endedAt.
|
||||||
|
*/
|
||||||
|
export function isSubagentSessionRunning(childSessionKey: string): boolean {
|
||||||
|
const key = childSessionKey.trim();
|
||||||
|
if (!key) return false;
|
||||||
|
for (const entry of subagentRuns.values()) {
|
||||||
|
if (entry.childSessionKey === key && entry.startedAt && !entry.endedAt) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get all currently running subagent session keys.
|
||||||
|
* Returns a Set of session keys that have active runs.
|
||||||
|
*/
|
||||||
|
export function getRunningSubagentSessions(): Set<string> {
|
||||||
|
const running = new Set<string>();
|
||||||
|
for (const entry of subagentRuns.values()) {
|
||||||
|
if (entry.startedAt && !entry.endedAt) {
|
||||||
|
running.add(entry.childSessionKey);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return running;
|
||||||
|
}
|
||||||
|
|||||||
@ -28,6 +28,8 @@ export type SessionListRow = {
|
|||||||
model?: string;
|
model?: string;
|
||||||
contextTokens?: number | null;
|
contextTokens?: number | null;
|
||||||
totalTokens?: number | null;
|
totalTokens?: number | null;
|
||||||
|
/** True if this session has an active subagent run in progress */
|
||||||
|
running?: boolean;
|
||||||
thinkingLevel?: string;
|
thinkingLevel?: string;
|
||||||
verboseLevel?: string;
|
verboseLevel?: string;
|
||||||
systemSent?: boolean;
|
systemSent?: boolean;
|
||||||
|
|||||||
@ -169,6 +169,7 @@ export function createSessionsListTool(opts?: {
|
|||||||
model: typeof entry.model === "string" ? entry.model : undefined,
|
model: typeof entry.model === "string" ? entry.model : undefined,
|
||||||
contextTokens: typeof entry.contextTokens === "number" ? entry.contextTokens : undefined,
|
contextTokens: typeof entry.contextTokens === "number" ? entry.contextTokens : undefined,
|
||||||
totalTokens: typeof entry.totalTokens === "number" ? entry.totalTokens : undefined,
|
totalTokens: typeof entry.totalTokens === "number" ? entry.totalTokens : undefined,
|
||||||
|
running: typeof entry.running === "boolean" ? entry.running : undefined,
|
||||||
thinkingLevel: typeof entry.thinkingLevel === "string" ? entry.thinkingLevel : undefined,
|
thinkingLevel: typeof entry.thinkingLevel === "string" ? entry.thinkingLevel : undefined,
|
||||||
verboseLevel: typeof entry.verboseLevel === "string" ? entry.verboseLevel : undefined,
|
verboseLevel: typeof entry.verboseLevel === "string" ? entry.verboseLevel : undefined,
|
||||||
systemSent: typeof entry.systemSent === "boolean" ? entry.systemSent : undefined,
|
systemSent: typeof entry.systemSent === "boolean" ? entry.systemSent : undefined,
|
||||||
|
|||||||
@ -2,6 +2,7 @@ import fs from "node:fs";
|
|||||||
import path from "node:path";
|
import path from "node:path";
|
||||||
|
|
||||||
import { resolveAgentWorkspaceDir, resolveDefaultAgentId } from "../agents/agent-scope.js";
|
import { resolveAgentWorkspaceDir, resolveDefaultAgentId } from "../agents/agent-scope.js";
|
||||||
|
import { getRunningSubagentSessions } from "../agents/subagent-registry.js";
|
||||||
import { lookupContextTokens } from "../agents/context.js";
|
import { lookupContextTokens } from "../agents/context.js";
|
||||||
import { DEFAULT_CONTEXT_TOKENS, DEFAULT_MODEL, DEFAULT_PROVIDER } from "../agents/defaults.js";
|
import { DEFAULT_CONTEXT_TOKENS, DEFAULT_MODEL, DEFAULT_PROVIDER } from "../agents/defaults.js";
|
||||||
import { resolveConfiguredModelRef } from "../agents/model-selection.js";
|
import { resolveConfiguredModelRef } from "../agents/model-selection.js";
|
||||||
@ -468,6 +469,9 @@ export function listSessionsFromStore(params: {
|
|||||||
const { cfg, storePath, store, opts } = params;
|
const { cfg, storePath, store, opts } = params;
|
||||||
const now = Date.now();
|
const now = Date.now();
|
||||||
|
|
||||||
|
// Get set of currently running subagent sessions for accurate status reporting
|
||||||
|
const runningSubagents = getRunningSubagentSessions();
|
||||||
|
|
||||||
const includeGlobal = opts.includeGlobal === true;
|
const includeGlobal = opts.includeGlobal === true;
|
||||||
const includeUnknown = opts.includeUnknown === true;
|
const includeUnknown = opts.includeUnknown === true;
|
||||||
const includeDerivedTitles = opts.includeDerivedTitles === true;
|
const includeDerivedTitles = opts.includeDerivedTitles === true;
|
||||||
@ -554,6 +558,8 @@ export function listSessionsFromStore(params: {
|
|||||||
inputTokens: entry?.inputTokens,
|
inputTokens: entry?.inputTokens,
|
||||||
outputTokens: entry?.outputTokens,
|
outputTokens: entry?.outputTokens,
|
||||||
totalTokens: total,
|
totalTokens: total,
|
||||||
|
// Check if this is a running subagent (has active run but may not have tokens yet)
|
||||||
|
running: runningSubagents.has(key),
|
||||||
responseUsage: entry?.responseUsage,
|
responseUsage: entry?.responseUsage,
|
||||||
modelProvider: entry?.modelProvider,
|
modelProvider: entry?.modelProvider,
|
||||||
model: entry?.model,
|
model: entry?.model,
|
||||||
|
|||||||
@ -33,6 +33,8 @@ export type GatewaySessionRow = {
|
|||||||
inputTokens?: number;
|
inputTokens?: number;
|
||||||
outputTokens?: number;
|
outputTokens?: number;
|
||||||
totalTokens?: number;
|
totalTokens?: number;
|
||||||
|
/** True if this session has an active subagent run in progress */
|
||||||
|
running?: boolean;
|
||||||
responseUsage?: "on" | "off" | "tokens" | "full";
|
responseUsage?: "on" | "off" | "tokens" | "full";
|
||||||
modelProvider?: string;
|
modelProvider?: string;
|
||||||
model?: string;
|
model?: string;
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user