From 1d853f425079ad1fce6b04de5e1747e9bf79255e Mon Sep 17 00:00:00 2001 From: ismeth Date: Fri, 20 Feb 2026 21:10:54 +0100 Subject: [PATCH] fix: abort signal in polling loops, remove legacy k2p5, pass ctx.directory to skill tool - Check context.abort in background-wait and background-output polling loops - Remove legacy kimi-for-coding/k2p5 from athena fallback chain - Pass ctx.directory from tool-registry to createSkillTool instead of process.cwd() --- src/plugin/tool-registry.ts | 1 + src/shared/model-requirements.ts | 1 - src/tools/background-task/create-background-output.ts | 5 +++++ src/tools/background-task/create-background-wait.ts | 8 +++++++- src/tools/skill/tools.ts | 2 +- src/tools/skill/types.ts | 2 +- 6 files changed, 15 insertions(+), 4 deletions(-) diff --git a/src/plugin/tool-registry.ts b/src/plugin/tool-registry.ts index 041d3ef62..10e05b904 100644 --- a/src/plugin/tool-registry.ts +++ b/src/plugin/tool-registry.ts @@ -102,6 +102,7 @@ export function createToolRegistry(args: { mcpManager: managers.skillMcpManager, getSessionID: getSessionIDForMcp, gitMasterConfig: pluginConfig.git_master, + directory: ctx.directory, }) const taskSystemEnabled = pluginConfig.experimental?.task_system ?? false diff --git a/src/shared/model-requirements.ts b/src/shared/model-requirements.ts index 40d4daff5..2927b48cb 100644 --- a/src/shared/model-requirements.ts +++ b/src/shared/model-requirements.ts @@ -92,7 +92,6 @@ export const AGENT_MODEL_REQUIREMENTS: Record = { athena: { fallbackChain: [ { providers: ["anthropic", "github-copilot", "opencode"], model: "claude-opus-4-6", variant: "max" }, - { providers: ["kimi-for-coding"], model: "k2p5" }, { providers: ["opencode"], model: "kimi-k2.5-free" }, { providers: ["zai-coding-plan"], model: "glm-4.7" }, { providers: ["opencode"], model: "glm-4.7-free" }, diff --git a/src/tools/background-task/create-background-output.ts b/src/tools/background-task/create-background-output.ts index 82ecb23ed..9bad38507 100644 --- a/src/tools/background-task/create-background-output.ts +++ b/src/tools/background-task/create-background-output.ts @@ -119,8 +119,13 @@ export function createBackgroundOutput(manager: BackgroundOutputManager, client: } if (shouldBlock) { + const abort = (toolContext as { abort?: AbortSignal } | undefined)?.abort const startTime = Date.now() while (Date.now() - startTime < timeoutMs) { + if (abort?.aborted) { + return formatTaskStatus(task) + } + await delay(1000) const currentTask = manager.getTask(args.task_id) diff --git a/src/tools/background-task/create-background-wait.ts b/src/tools/background-task/create-background-wait.ts index 20dc792e0..de49f5723 100644 --- a/src/tools/background-task/create-background-wait.ts +++ b/src/tools/background-task/create-background-wait.ts @@ -21,7 +21,9 @@ export function createBackgroundWait(manager: BackgroundOutputManager, client: B task_ids: tool.schema.array(tool.schema.string()).describe("Task IDs to monitor — returns when ANY one reaches a terminal state"), timeout: tool.schema.number().optional().describe("Max wait in ms. Default: 120000 (2 min). The tool returns immediately when any task finishes, so large values are fine."), }, - async execute(args: { task_ids: string[]; timeout?: number }) { + async execute(args: { task_ids: string[]; timeout?: number }, toolContext?: unknown) { + const abort = (toolContext as { abort?: AbortSignal } | undefined)?.abort + const taskIds = args.task_ids if (!taskIds || taskIds.length === 0) { return "Error: task_ids array is required and must not be empty." @@ -36,6 +38,10 @@ export function createBackgroundWait(manager: BackgroundOutputManager, client: B const startTime = Date.now() while (Date.now() - startTime < timeoutMs) { + if (abort?.aborted) { + return buildProgressSummary(manager, taskIds, true) + } + await delay(1000) const found = findFirstTerminal(manager, taskIds) diff --git a/src/tools/skill/tools.ts b/src/tools/skill/tools.ts index 60f6ad512..f9e084815 100644 --- a/src/tools/skill/tools.ts +++ b/src/tools/skill/tools.ts @@ -250,7 +250,7 @@ export function createSkillTool(options: SkillLoadOptions = {}): ToolDefinition body = injectGitMasterConfig(body, options.gitMasterConfig) } - const dir = matchedSkill.path ? dirname(matchedSkill.path) : matchedSkill.resolvedPath || process.cwd() + const dir = matchedSkill.path ? dirname(matchedSkill.path) : matchedSkill.resolvedPath || options.directory || process.cwd() const output = [ `## Skill: ${matchedSkill.name}`, diff --git a/src/tools/skill/types.ts b/src/tools/skill/types.ts index b914957db..5fe6b087b 100644 --- a/src/tools/skill/types.ts +++ b/src/tools/skill/types.ts @@ -33,6 +33,6 @@ export interface SkillLoadOptions { /** Git master configuration for watermark/co-author settings */ gitMasterConfig?: GitMasterConfig disabledSkills?: Set - /** Project directory for skill discovery. Falls back to process.cwd() if not provided. */ + /** Project directory for skill discovery and base directory resolution. Should be ctx.directory from PluginContext. */ directory?: string }