fix(task): forward parent-discovered rules, extensions, and custom tools to subagents

Each `runSubprocess` call re-ran `loadCapability<Rule>()`,
`loadSessionExtensions()`, and `discoverAndLoadCustomTools()` because
`ExecutorOptions` and the `createAgentSession()` call inside the executor
omitted three pass-through fields the parent had already paid for. The
already-correct paths (skills, context files, workspace tree, MCP manager)
showed the intended pattern.

- Cache `rules`, `extensionsResult`, and `loadedCustomTools` on the
  parent's `ToolSession`.
- Add `rules` / `preloadedExtensions` / `preloadedCustomTools` to
  `ExecutorOptions`; forward them from both `runSubprocess` call sites
  in `task/index.ts` and into the executor's `createAgentSession()`.
- Add `preloadedCustomTools` to `CreateAgentSessionOptions` and skip
  `discoverAndLoadCustomTools()` when it is supplied.
- Shallow-clone `extensionsResult.extensions` when reusing
  `preloadedExtensions`, so the per-session autoresearch + custom-tools
  inline wrappers never leak back into the caller's array.

Fixes #2190
This commit is contained in:
roboomp
2026-06-09 13:58:21 +00:00
parent 4b5200a163
commit e7645cec49
7 changed files with 315 additions and 38 deletions
+12 -1
View File
@@ -8,14 +8,16 @@ import path from "node:path";
import type { AgentEvent, AgentIdentity, AgentTelemetryConfig, ThinkingLevel } from "@oh-my-pi/pi-agent-core";
import { recordHandoff, resolveTelemetry } from "@oh-my-pi/pi-agent-core";
import { logger, prompt, untilAborted } from "@oh-my-pi/pi-utils";
import type { Rule } from "../capability/rule";
import { ModelRegistry } from "../config/model-registry";
import { resolveModelOverrideWithAuthFallback } from "../config/model-resolver";
import type { PromptTemplate } from "../config/prompt-templates";
import { Settings } from "../config/settings";
import { SETTINGS_SCHEMA, type SettingPath } from "../config/settings-schema";
import type { CustomTool } from "../extensibility/custom-tools/types";
import type { CustomTool, LoadedCustomTool } from "../extensibility/custom-tools/types";
import { runExtensionCompact, runExtensionSetModel } from "../extensibility/extensions/compact-handler";
import { getSessionSlashCommands } from "../extensibility/extensions/get-commands-handler";
import type { LoadExtensionsResult } from "../extensibility/extensions/types";
import { buildSkillPromptMessage, type Skill } from "../extensibility/skills";
import type { HindsightSessionState } from "../hindsight/state";
import type { LocalProtocolOptions } from "../internal-urls";
@@ -190,6 +192,12 @@ export interface ExecutorOptions {
skills?: Skill[];
promptTemplates?: PromptTemplate[];
workspaceTree?: WorkspaceTree;
/** Parent-discovered rules, forwarded to skip rule discovery in the subagent. */
rules?: Rule[];
/** Parent-loaded extensions, forwarded via `preloadedExtensions` to skip discovery. */
preloadedExtensions?: LoadExtensionsResult;
/** Parent-discovered custom tools, forwarded to skip the `.omp/tools/` scan. */
preloadedCustomTools?: LoadedCustomTool[];
mcpManager?: MCPManager;
authStorage?: AuthStorage;
modelRegistry?: ModelRegistry;
@@ -1284,6 +1292,9 @@ export async function runSubprocess(options: ExecutorOptions): Promise<SingleRes
skills: options.skills,
promptTemplates: options.promptTemplates,
workspaceTree: options.workspaceTree,
rules: options.rules,
preloadedExtensions: options.preloadedExtensions,
preloadedCustomTools: options.preloadedCustomTools,
systemPrompt: defaultPrompt => {
const subagentPrompt = prompt.render(subagentSystemPromptTemplate, {
agent: agent.systemPrompt,
+6
View File
@@ -990,6 +990,9 @@ export class TaskTool implements AgentTool<TaskToolSchemaInstance, TaskToolDetai
autoloadSkills: resolvedAutoloadSkills,
workspaceTree: this.session.workspaceTree,
promptTemplates,
rules: this.session.rules,
preloadedExtensions: this.session.extensionsResult,
preloadedCustomTools: this.session.loadedCustomTools,
localProtocolOptions,
parentArtifactManager,
parentHindsightSessionState: this.session.getHindsightSessionState?.(),
@@ -1048,6 +1051,9 @@ export class TaskTool implements AgentTool<TaskToolSchemaInstance, TaskToolDetai
autoloadSkills: resolvedAutoloadSkills,
workspaceTree: this.session.workspaceTree,
promptTemplates,
rules: this.session.rules,
preloadedExtensions: this.session.extensionsResult,
preloadedCustomTools: this.session.loadedCustomTools,
localProtocolOptions,
parentArtifactManager,
parentHindsightSessionState: this.session.getHindsightSessionState?.(),