@ordewell/core 0.10.3 → 0.10.4

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.
@@ -1,4 +1,4 @@
1
- import { I as IApproval } from './IRunner-QBdYcatb.js';
1
+ import { I as IApproval } from './IRunner-D_UkkMbJ.js';
2
2
 
3
3
  interface ToolOutcome {
4
4
  success: boolean;
@@ -1,4 +1,4 @@
1
- import { I as IApproval } from './IRunner-CXdYyIZo.mjs';
1
+ import { I as IApproval } from './IRunner-NtTHQgLR.mjs';
2
2
 
3
3
  interface ToolOutcome {
4
4
  success: boolean;
@@ -1,5 +1,5 @@
1
1
  import { ChildProcess } from 'child_process';
2
- import { a2 as RunnerId, ar as UsageRecord, ad as SubagentOutcome, d as DiscoveredModel, am as TaskSkillSnapshot } from './Task-CRVIqSfy.mjs';
2
+ import { a2 as RunnerId, ar as UsageRecord, ad as SubagentOutcome, d as DiscoveredModel, am as TaskSkillSnapshot } from './Task-DZs9eKgg.js';
3
3
  import { z } from 'zod/v4';
4
4
 
5
5
  /**
@@ -1,5 +1,5 @@
1
1
  import { ChildProcess } from 'child_process';
2
- import { a2 as RunnerId, ar as UsageRecord, ad as SubagentOutcome, d as DiscoveredModel, am as TaskSkillSnapshot } from './Task-CRVIqSfy.js';
2
+ import { a2 as RunnerId, ar as UsageRecord, ad as SubagentOutcome, d as DiscoveredModel, am as TaskSkillSnapshot } from './Task-DZs9eKgg.mjs';
3
3
  import { z } from 'zod/v4';
4
4
 
5
5
  /**
@@ -1,4 +1,4 @@
1
- import { a2 as RunnerId } from './Task-CRVIqSfy.js';
1
+ import { a2 as RunnerId } from './Task-DZs9eKgg.js';
2
2
 
3
3
  interface RunnerModeInfo {
4
4
  id: string;
@@ -1,4 +1,4 @@
1
- import { a2 as RunnerId } from './Task-CRVIqSfy.mjs';
1
+ import { a2 as RunnerId } from './Task-DZs9eKgg.mjs';
2
2
 
3
3
  interface RunnerModeInfo {
4
4
  id: string;
@@ -463,7 +463,7 @@ interface IWorktreeIsolation {
463
463
  * so a crash-recovery prune does not sweep it away; a repair it ends leaves
464
464
  * the task `conflict`, as it was before the repair. Takes the run rather than
465
465
  * a bare task id: ids are only unique within one plan, and one daemon serves
466
- * many (ADR-0007).
466
+ * many (ADR-0025 D2).
467
467
  */
468
468
  release(run: IsolationRun, taskId: string, opts: {
469
469
  keep: boolean;
@@ -463,7 +463,7 @@ interface IWorktreeIsolation {
463
463
  * so a crash-recovery prune does not sweep it away; a repair it ends leaves
464
464
  * the task `conflict`, as it was before the repair. Takes the run rather than
465
465
  * a bare task id: ids are only unique within one plan, and one daemon serves
466
- * many (ADR-0007).
466
+ * many (ADR-0025 D2).
467
467
  */
468
468
  release(run: IsolationRun, taskId: string, opts: {
469
469
  keep: boolean;
package/dist/index.d.mts CHANGED
@@ -1,13 +1,13 @@
1
- import { af as Task, E as ExecutionActor, r as IsolationMergeResult, f as ExecutionRecord, g as GuardTrip, ae as SupervisorLevel, e as ExecutionCommandName, G as GuardTarget, a2 as RunnerId, d as DiscoveredModel, Z as ResearchProgress, Y as ResearchLogEntry, C as ConversationMessage, a7 as SkillInfo, a8 as SkillLoad, ac as SkillsService, L as LegacyPlanState, N as PlanStatus, n as IsolationLandedTask, I as IWorktreeIsolation, F as IsolationTaskStatus, J as PlanIsolation, ar as UsageRecord, a0 as ResearchToolType, Q as PlannerUsage, an as TaskSnapshot, K as PlanState, H as IsolationView, at as Verdict, am as TaskSkillSnapshot } from './Task-CRVIqSfy.mjs';
2
- export { A as ApprovalRecord, a as AttemptUsage, b as AwaitingReason, B as BUILTIN_SKILL_NAMES, D as DEFAULT_RUNNERS, c as DEFAULT_SUPERVISOR_RETRY_LIMIT, h as IntegrationDisposal, i as InvalidSkill, j as IsolationAvailability, k as IsolationHandoff, l as IsolationHandoffRepo, m as IsolationInactiveReason, o as IsolationLanding, p as IsolationMergeBlock, q as IsolationMergeBlockReason, s as IsolationOutcome, t as IsolationPruneResult, u as IsolationRemoval, v as IsolationRepo, w as IsolationRun, x as IsolationTaskRecord, y as IsolationTaskRef, z as IsolationTaskRepo, M as ModelUsage, O as PlanUsage, R as PrepareIntent, S as PreparedTask, T as PreservedWork, U as PreviousWork, V as RefusedRemoval, W as RepairEvidence, X as RepoGroupLayout, _ as ResearchStep, $ as ResearchStepOutcome, a1 as RunSettings, a3 as SetupFailure, a4 as ShadowedSkill, a5 as SkillAppliesTo, a6 as SkillCatalog, a9 as SkillLoadNotice, aa as SkillMetadata, ab as SkillSource, ai as TaskIsolation, aj as TaskIsolationState, ak as TaskModelAssignment, ao as TaskStatus, ap as TreeSnapshot, aq as UsageLine, as as UsageTotals, au as VerificationCheck, av as addAttemptUsage, aw as addModelUsage, ax as addPlannerUsage, ay as addUsage, az as addUsageTotals, aA as createEmptyPlan, aB as createSkillsService, aC as createTask, aD as endAttemptUsage, aE as flattenTasks, aF as flattenTasksWithParents, aG as isAwaitingReason, aH as isMeasured, aI as isSupervisorLevel, aJ as isUserMessage, aK as migratePlanState, aL as partedPromptUsage, aM as pausedOnLimit, aN as planUsage, aO as plannerContextFill, aP as rejoinPlanTree, aQ as startAttemptUsage, aR as usageLine, aS as waitsForApproval } from './Task-CRVIqSfy.mjs';
3
- import { ah as StartAdmission, w as LiveTailOptions, L as LiveTail, U as PlannerModes, at as TaskOp, u as IsolatedExecution, aa as SessionBroadcaster, b as ApplyTaskOpsResult, af as SkillLookup, ac as SessionNotice, q as EditCatalog, ab as SessionMessage, T as PlanStore, au as TaskOrchestrator, v as IsolationRunController, O as OrchestratorObserver, ar as TaskLogEvent, I as INotification, s as GlobalRunSettings, a1 as RunView, Z as RunMergeView, ax as TaskOutputSource, aO as UserSettings, al as SurfacePlan, am as SurfacePlanState } from './plan-utils-KU1Rse82.mjs';
4
- export { A as ACT_RISK, a as AUTORUN_RISK, c as ApprovalBlock, d as ApprovalStatus, e as AutoMergeTrigger, B as BlockingSubject, C as CHECKPOINT_TRUNCATE_LENGTH, f as CommandBlock, g as CommandStatus, h as CompactionBlock, i as ConversationInput, j as ConversationView, D as DiffRow, k as DiffRowKind, l as DiffStat, m as DisplayBlock, E as EMPTY_CONVERSATION, n as EMPTY_HOLD, o as EMPTY_RUN, p as EMPTY_TASK_LOG, r as ExecutionSummary, G as GatedConversation, H as HeldEdit, t as HeldEditMark, x as LocalEntry, M as MarkdownToken, y as MessageBlock, z as MessageRole, N as NOT_STARTED, F as NO_TURN, J as NewTaskFields, K as NotificationAction, P as OutputPreview, Q as PlanBlock, R as PlanMarkerStatus, S as PlanSnapshot, V as PromptHold, W as RUN_SETTINGS_DEFAULTS, Y as RunInput, _ as RunSettingsError, $ as RunTask, a0 as RunTaskStatus, a2 as RunnerLoadedBlock, a3 as STOPPED_BEFORE_START, a4 as SUPERVISOR_LEVEL_LABEL, a5 as SerializedConversationMessage, a6 as SerializedPendingTurn, a7 as SerializedPlan, a8 as SerializedTask, a9 as SerializedTaskStatus, ad as SettingsService, ae as SkillLoadBlock, ag as SkillToken, ai as SubagentBlock, aj as SubagentChild, ak as SubagentStatus, an as SurfaceTask, ao as TakenPrompt, ap as TaskAttemptSnapshot, aq as TaskControlError, as as TaskLogView, av as TaskOrchestratorDeps, aw as TaskOrchestratorOptions, ay as TaskRef, az as TaskRowAction, aA as TaskRowContext, aB as TaskRowIsolation, aC as TaskRowKind, aD as TaskRowPlacement, aE as TaskRowSubject, aF as TaskRowUsage, aG as TaskRowView, aH as TaskStatusKind, aI as ThinkingDisplayBlock, aJ as ToolBlock, aK as ToolHeadline, aL as ToolStatus, aM as TurnGate, aN as UsageBlock, aP as WAITS_FOR_APPROVAL_LABEL, aQ as aheadOfDraft, aR as applyTaskOps, aS as approvalLabel, aT as automergeSummary, aU as autorunSummary, aV as awaitingLabel, aW as blockedByLabel, aX as blockingFailures, aY as canMergeTasks, aZ as canSetDependencies, a_ as canSplitTask, a$ as capConflictFiles, b0 as classifyOutcome, b1 as coalesceTaskLog, b2 as dependencyCandidates, b3 as dependentsNotice, b4 as dependentsOf, b5 as diffRows, b6 as diffStat, b7 as diffSummary, b8 as digestTaskLog, b9 as drainNext, ba as executionSummary, bb as followTurn, bc as fromTranscript, bd as getSettingsPath, be as hasHiddenDetail, bf as holdPrompt, bg as isTaskRunning, bh as loadedSkillTokens, bi as markAction, bj as markRequestFor, bk as markdownHtml, bl as markdownTokens, bm as namedRepos, bn as newTaskFields, bo as opsEditable, bp as outputLines, bq as outputPreview, br as parseCount, bs as parseSwitch, bt as parseTaskOpsJson, bu as pastGateConfirmation, bv as reconcileApprovals, bw as reduceConversation, bx as reduceRun, by as reduceTaskLog, bz as replayTaskLog, bA as resolveTaskRef, bB as resumeLabel, bC as resumeTime, bD as runSettingsOf, bE as runnerToolSubject, bF as serializePlan, bG as serializeTask, bH as serializeTaskStatus, bI as skillTokens, bJ as skippedLabel, bK as stopTurn, bL as summarizeToolCall, bM as supervisorSummary, bN as surfacePlan, bO as surfacePlanState, bP as takeAt, bQ as taskLogForSurface, bR as taskOrderLabel, bS as taskRef, bT as taskRefOf, bU as taskRowActions, bV as taskRowView, bW as taskStartedNotice, bX as taskStatusKind, bY as textHasTaskOps, bZ as titledRefs, b_ as titledTaskRef, b$ as titledTaskRefOf, c0 as toTaskLogEvent, c1 as toolHeadline, c2 as trimToolOutput, c3 as truncateCheckpointSummary, c4 as unsendAll, c5 as unsendLatest } from './plan-utils-KU1Rse82.mjs';
5
- import { I as IApproval, y as IConfig, d as AgentProcessDeps, a as AgentAdapter, _ as OrdewellMcpServer, a6 as PlannerToolHandler, ad as ResearchShell, p as ApprovalRequest, j as ApprovalDecision, i as ApprovalAnswer, z as IRunner, a3 as PlannerBackendId, a9 as ProviderModelLists, f as AiProvider, m as ApprovalModeSetting, aq as RunnerRegistry, Z as OrchestratorOption, aD as TaskModeAgentAdapter, e as AgentStartOptions, c as AgentEvent, ai as RunnerCommand, a7 as ProjectMcpServer, n as ApprovalPolicy, B as IRunnerSession, aA as TaskCompleteArgs, r as CheckpointAnswer, av as StructuredTurnEnd, au as StructuredEvent, aC as TaskMessageFrom, ab as QueuedTaskMessage, aI as TaskStartOptions, aJ as TaskTokenScope, am as RunnerManifest, aH as TaskRunnerFlags } from './IRunner-CXdYyIZo.mjs';
6
- export { A as AUTO_COMMANDS, b as AgentAdapterFactory, g as AllProviderModels, h as AnswerApprovalArgs, k as ApprovalKind, l as ApprovalMode, o as ApprovalPolicyOptions, q as ApprovalSource, C as CatalogModel, s as CheckpointArgs, t as CommandClassification, u as CommandTier, v as CommandWords, D as DEFAULT_PLANNER_ALLOWLIST, w as DENY_ALL, x as DiscoveryCommand, E as EditPlanArgs, F as FetchAllProviderModelsOptions, G as GIT_READONLY_SUBCOMMANDS, H as InvokedCommand, L as LineBuffer, J as ListModelsArgs, K as ListRunnersArgs, M as LoadSkillArgs, N as McpClientConfig, O as McpCredential, P as McpTool, Q as McpToolContext, R as McpToolReply, S as MessageTaskArgs, T as ModelCatalog, U as ModelShortcut, V as ORCHESTRATOR_SHORTCUTS, W as ORDEWELL_MCP_PATH, X as ORDEWELL_MCP_SERVER_NAME, Y as OneTaskArgs, $ as OwnerOnlyFile, a0 as PLANNER_EXECUTION_TOOLS, a1 as PLANNER_TOOLS, a2 as PlannerAllowlist, a4 as PlannerStartOptions, a5 as PlannerTokenScope, a8 as ProviderCredentialSource, aa as ProviderModelsResult, ac as REFUSED_COMMANDS, ae as ResearchShellDeps, af as RetryTaskArgs, ag as RunCommandArgs, ah as RunPlanArgs, aj as RunnerCommandKind, ak as RunnerEntry, al as RunnerFeatures, an as RunnerMcpServer, ao as RunnerMode, ap as RunnerModelDiscovery, ar as ShellDialect, as as SpawnFn, at as StandingDecision, aw as SubmitPlanArgs, ax as TASK_COMPLETE_TOOL, ay as TASK_COMPLETION_CONTRACT, az as TASK_TOOLS, aB as TaskDiffArgs, aE as TaskModeUnsupportedError, aF as TaskOutputArgs, aG as TaskQueryArgs, aK as TaskToolHandler, aL as approvalScopes, aM as classifyCommand, aN as clearResearchShellCache, aO as collectProviderCredentials, aP as commandAllowedBy, aQ as effectiveApprovalMode, aR as enabledRunners, aS as fetchAllProviderModels, aT as findRunnerCommand, aU as isGranted, aV as isRunnerApproval, aW as knownModelId, aX as mcpClientConfig, aY as ownerOnlyConfigFile, aZ as parseAllowlist, a_ as parseApprovalModeSetting, a$ as researchShellWarning, b0 as researchToolsPath, b1 as resolveModelShortcut, b2 as resolveProvider, b3 as resolveResearchShell, b4 as scopeAllowed, b5 as sharedMcpServer, b6 as toApprovalDecision, b7 as toOrchestratorOptions, b8 as toolAllowed } from './IRunner-CXdYyIZo.mjs';
7
- import { T as ToolOutcome, I as IFileSystem, R as ReadFileOpts, b as GrepOptions, a as GlobOptions, F as FindSymbolOptions } from './IFileSystem-B8Nkgg4e.mjs';
8
- export { G as GREP_DEFAULT_HEAD_LIMIT, c as GrepOutputMode, S as SEARCH_EXCLUSIONS } from './IFileSystem-B8Nkgg4e.mjs';
9
- import { R as RunnerModeInfo } from './ModeResolver-geqjKkLY.mjs';
10
- export { a as autonomyLevelLabel, p as parseAutonomyLevel, r as runnerModesFrom } from './ModeResolver-geqjKkLY.mjs';
1
+ import { af as Task, E as ExecutionActor, r as IsolationMergeResult, f as ExecutionRecord, g as GuardTrip, ae as SupervisorLevel, e as ExecutionCommandName, G as GuardTarget, a2 as RunnerId, d as DiscoveredModel, Z as ResearchProgress, Y as ResearchLogEntry, C as ConversationMessage, a7 as SkillInfo, a8 as SkillLoad, ac as SkillsService, L as LegacyPlanState, N as PlanStatus, n as IsolationLandedTask, I as IWorktreeIsolation, F as IsolationTaskStatus, J as PlanIsolation, ar as UsageRecord, a0 as ResearchToolType, Q as PlannerUsage, an as TaskSnapshot, K as PlanState, H as IsolationView, at as Verdict, am as TaskSkillSnapshot } from './Task-DZs9eKgg.mjs';
2
+ export { A as ApprovalRecord, a as AttemptUsage, b as AwaitingReason, B as BUILTIN_SKILL_NAMES, D as DEFAULT_RUNNERS, c as DEFAULT_SUPERVISOR_RETRY_LIMIT, h as IntegrationDisposal, i as InvalidSkill, j as IsolationAvailability, k as IsolationHandoff, l as IsolationHandoffRepo, m as IsolationInactiveReason, o as IsolationLanding, p as IsolationMergeBlock, q as IsolationMergeBlockReason, s as IsolationOutcome, t as IsolationPruneResult, u as IsolationRemoval, v as IsolationRepo, w as IsolationRun, x as IsolationTaskRecord, y as IsolationTaskRef, z as IsolationTaskRepo, M as ModelUsage, O as PlanUsage, R as PrepareIntent, S as PreparedTask, T as PreservedWork, U as PreviousWork, V as RefusedRemoval, W as RepairEvidence, X as RepoGroupLayout, _ as ResearchStep, $ as ResearchStepOutcome, a1 as RunSettings, a3 as SetupFailure, a4 as ShadowedSkill, a5 as SkillAppliesTo, a6 as SkillCatalog, a9 as SkillLoadNotice, aa as SkillMetadata, ab as SkillSource, ai as TaskIsolation, aj as TaskIsolationState, ak as TaskModelAssignment, ao as TaskStatus, ap as TreeSnapshot, aq as UsageLine, as as UsageTotals, au as VerificationCheck, av as addAttemptUsage, aw as addModelUsage, ax as addPlannerUsage, ay as addUsage, az as addUsageTotals, aA as createEmptyPlan, aB as createSkillsService, aC as createTask, aD as endAttemptUsage, aE as flattenTasks, aF as flattenTasksWithParents, aG as isAwaitingReason, aH as isMeasured, aI as isSupervisorLevel, aJ as isUserMessage, aK as migratePlanState, aL as partedPromptUsage, aM as pausedOnLimit, aN as planUsage, aO as plannerContextFill, aP as rejoinPlanTree, aQ as startAttemptUsage, aR as usageLine, aS as waitsForApproval } from './Task-DZs9eKgg.mjs';
3
+ import { ah as StartAdmission, w as LiveTailOptions, L as LiveTail, U as PlannerModes, at as TaskOp, u as IsolatedExecution, aa as SessionBroadcaster, b as ApplyTaskOpsResult, af as SkillLookup, ac as SessionNotice, q as EditCatalog, ab as SessionMessage, T as PlanStore, au as TaskOrchestrator, v as IsolationRunController, O as OrchestratorObserver, ar as TaskLogEvent, I as INotification, s as GlobalRunSettings, a1 as RunView, Z as RunMergeView, ax as TaskOutputSource, aO as UserSettings, al as SurfacePlan, am as SurfacePlanState } from './plan-utils-CtKceSsQ.mjs';
4
+ export { A as ACT_RISK, a as AUTORUN_RISK, c as ApprovalBlock, d as ApprovalStatus, e as AutoMergeTrigger, B as BlockingSubject, C as CHECKPOINT_TRUNCATE_LENGTH, f as CommandBlock, g as CommandStatus, h as CompactionBlock, i as ConversationInput, j as ConversationView, D as DiffRow, k as DiffRowKind, l as DiffStat, m as DisplayBlock, E as EMPTY_CONVERSATION, n as EMPTY_HOLD, o as EMPTY_RUN, p as EMPTY_TASK_LOG, r as ExecutionSummary, G as GatedConversation, H as HeldEdit, t as HeldEditMark, x as LocalEntry, M as MarkdownToken, y as MessageBlock, z as MessageRole, N as NOT_STARTED, F as NO_TURN, J as NewTaskFields, K as NotificationAction, P as OutputPreview, Q as PlanBlock, R as PlanMarkerStatus, S as PlanSnapshot, V as PromptHold, W as RUN_SETTINGS_DEFAULTS, Y as RunInput, _ as RunSettingsError, $ as RunTask, a0 as RunTaskStatus, a2 as RunnerLoadedBlock, a3 as STOPPED_BEFORE_START, a4 as SUPERVISOR_LEVEL_LABEL, a5 as SerializedConversationMessage, a6 as SerializedPendingTurn, a7 as SerializedPlan, a8 as SerializedTask, a9 as SerializedTaskStatus, ad as SettingsService, ae as SkillLoadBlock, ag as SkillToken, ai as SubagentBlock, aj as SubagentChild, ak as SubagentStatus, an as SurfaceTask, ao as TakenPrompt, ap as TaskAttemptSnapshot, aq as TaskControlError, as as TaskLogView, av as TaskOrchestratorDeps, aw as TaskOrchestratorOptions, ay as TaskRef, az as TaskRowAction, aA as TaskRowContext, aB as TaskRowIsolation, aC as TaskRowKind, aD as TaskRowPlacement, aE as TaskRowSubject, aF as TaskRowUsage, aG as TaskRowView, aH as TaskStatusKind, aI as ThinkingDisplayBlock, aJ as ToolBlock, aK as ToolHeadline, aL as ToolStatus, aM as TurnGate, aN as UsageBlock, aP as WAITS_FOR_APPROVAL_LABEL, aQ as aheadOfDraft, aR as applyTaskOps, aS as approvalLabel, aT as automergeSummary, aU as autorunSummary, aV as awaitingLabel, aW as blockedByLabel, aX as blockingFailures, aY as canMergeTasks, aZ as canSetDependencies, a_ as canSplitTask, a$ as capConflictFiles, b0 as classifyOutcome, b1 as coalesceTaskLog, b2 as dependencyCandidates, b3 as dependentsNotice, b4 as dependentsOf, b5 as diffRows, b6 as diffStat, b7 as diffSummary, b8 as digestTaskLog, b9 as drainNext, ba as executionSummary, bb as followTurn, bc as fromTranscript, bd as getSettingsPath, be as hasHiddenDetail, bf as holdPrompt, bg as isTaskRunning, bh as loadedSkillTokens, bi as markAction, bj as markRequestFor, bk as markdownHtml, bl as markdownTokens, bm as namedRepos, bn as newTaskFields, bo as opsEditable, bp as outputLines, bq as outputPreview, br as parseCount, bs as parseSwitch, bt as parseTaskOpsJson, bu as pastGateConfirmation, bv as reconcileApprovals, bw as reduceConversation, bx as reduceRun, by as reduceTaskLog, bz as replayTaskLog, bA as resolveTaskRef, bB as resumeLabel, bC as resumeTime, bD as runSettingsOf, bE as runnerToolSubject, bF as serializePlan, bG as serializeTask, bH as serializeTaskStatus, bI as skillTokens, bJ as skippedLabel, bK as stopTurn, bL as summarizeToolCall, bM as supervisorSummary, bN as surfacePlan, bO as surfacePlanState, bP as takeAt, bQ as taskLogForSurface, bR as taskOrderLabel, bS as taskRef, bT as taskRefOf, bU as taskRowActions, bV as taskRowView, bW as taskStartedNotice, bX as taskStatusKind, bY as textHasTaskOps, bZ as titledRefs, b_ as titledTaskRef, b$ as titledTaskRefOf, c0 as toTaskLogEvent, c1 as toolHeadline, c2 as trimToolOutput, c3 as truncateCheckpointSummary, c4 as unsendAll, c5 as unsendLatest } from './plan-utils-CtKceSsQ.mjs';
5
+ import { I as IApproval, y as IConfig, d as AgentProcessDeps, a as AgentAdapter, _ as OrdewellMcpServer, a6 as PlannerToolHandler, ad as ResearchShell, p as ApprovalRequest, j as ApprovalDecision, i as ApprovalAnswer, z as IRunner, a3 as PlannerBackendId, a9 as ProviderModelLists, f as AiProvider, m as ApprovalModeSetting, aq as RunnerRegistry, Z as OrchestratorOption, aD as TaskModeAgentAdapter, e as AgentStartOptions, c as AgentEvent, ai as RunnerCommand, a7 as ProjectMcpServer, n as ApprovalPolicy, B as IRunnerSession, aA as TaskCompleteArgs, r as CheckpointAnswer, av as StructuredTurnEnd, au as StructuredEvent, aC as TaskMessageFrom, ab as QueuedTaskMessage, aI as TaskStartOptions, aJ as TaskTokenScope, am as RunnerManifest, aH as TaskRunnerFlags } from './IRunner-NtTHQgLR.mjs';
6
+ export { A as AUTO_COMMANDS, b as AgentAdapterFactory, g as AllProviderModels, h as AnswerApprovalArgs, k as ApprovalKind, l as ApprovalMode, o as ApprovalPolicyOptions, q as ApprovalSource, C as CatalogModel, s as CheckpointArgs, t as CommandClassification, u as CommandTier, v as CommandWords, D as DEFAULT_PLANNER_ALLOWLIST, w as DENY_ALL, x as DiscoveryCommand, E as EditPlanArgs, F as FetchAllProviderModelsOptions, G as GIT_READONLY_SUBCOMMANDS, H as InvokedCommand, L as LineBuffer, J as ListModelsArgs, K as ListRunnersArgs, M as LoadSkillArgs, N as McpClientConfig, O as McpCredential, P as McpTool, Q as McpToolContext, R as McpToolReply, S as MessageTaskArgs, T as ModelCatalog, U as ModelShortcut, V as ORCHESTRATOR_SHORTCUTS, W as ORDEWELL_MCP_PATH, X as ORDEWELL_MCP_SERVER_NAME, Y as OneTaskArgs, $ as OwnerOnlyFile, a0 as PLANNER_EXECUTION_TOOLS, a1 as PLANNER_TOOLS, a2 as PlannerAllowlist, a4 as PlannerStartOptions, a5 as PlannerTokenScope, a8 as ProviderCredentialSource, aa as ProviderModelsResult, ac as REFUSED_COMMANDS, ae as ResearchShellDeps, af as RetryTaskArgs, ag as RunCommandArgs, ah as RunPlanArgs, aj as RunnerCommandKind, ak as RunnerEntry, al as RunnerFeatures, an as RunnerMcpServer, ao as RunnerMode, ap as RunnerModelDiscovery, ar as ShellDialect, as as SpawnFn, at as StandingDecision, aw as SubmitPlanArgs, ax as TASK_COMPLETE_TOOL, ay as TASK_COMPLETION_CONTRACT, az as TASK_TOOLS, aB as TaskDiffArgs, aE as TaskModeUnsupportedError, aF as TaskOutputArgs, aG as TaskQueryArgs, aK as TaskToolHandler, aL as approvalScopes, aM as classifyCommand, aN as clearResearchShellCache, aO as collectProviderCredentials, aP as commandAllowedBy, aQ as effectiveApprovalMode, aR as enabledRunners, aS as fetchAllProviderModels, aT as findRunnerCommand, aU as isGranted, aV as isRunnerApproval, aW as knownModelId, aX as mcpClientConfig, aY as ownerOnlyConfigFile, aZ as parseAllowlist, a_ as parseApprovalModeSetting, a$ as researchShellWarning, b0 as researchToolsPath, b1 as resolveModelShortcut, b2 as resolveProvider, b3 as resolveResearchShell, b4 as scopeAllowed, b5 as sharedMcpServer, b6 as toApprovalDecision, b7 as toOrchestratorOptions, b8 as toolAllowed } from './IRunner-NtTHQgLR.mjs';
7
+ import { T as ToolOutcome, I as IFileSystem, R as ReadFileOpts, b as GrepOptions, a as GlobOptions, F as FindSymbolOptions } from './IFileSystem-vyqMdL-x.mjs';
8
+ export { G as GREP_DEFAULT_HEAD_LIMIT, c as GrepOutputMode, S as SEARCH_EXCLUSIONS } from './IFileSystem-vyqMdL-x.mjs';
9
+ import { R as RunnerModeInfo } from './ModeResolver-wnTFsDnF.mjs';
10
+ export { a as autonomyLevelLabel, p as parseAutonomyLevel, r as runnerModesFrom } from './ModeResolver-wnTFsDnF.mjs';
11
11
  import { ChildProcess } from 'child_process';
12
12
  import { EventEmitter } from 'events';
13
13
  import 'zod/v4';
@@ -2462,9 +2462,17 @@ declare class RunnerInstallation {
2462
2462
  private inflight;
2463
2463
  private registry;
2464
2464
  private execImpl;
2465
- constructor(registry: RunnerRegistry, execImpl?: ExecImpl);
2465
+ private now;
2466
+ constructor(registry: RunnerRegistry, execImpl?: ExecImpl, now?: () => number);
2466
2467
  /** True if the runner's CLI responds to `--version`. Cached per process. */
2467
2468
  isInstalled(runner: string): Promise<boolean>;
2469
+ /**
2470
+ * Forget cached "not installed" verdicts so the next probe re-runs them. A
2471
+ * runner-list refresh calls this, so a CLI installed while the host runs is
2472
+ * offered without a restart. An installed verdict stays: it cannot have
2473
+ * changed without the binary going away, and re-probing one costs a spawn.
2474
+ */
2475
+ refresh(): void;
2468
2476
  /**
2469
2477
  * Whether this runner can serve as a harness planner (ADR-0009, T9), and why
2470
2478
  * not when it cannot. Surfaces call this to grey out an unusable agent in the
@@ -2522,7 +2530,8 @@ declare function recordedInstalledPlanner(): PlannerBackendId | null;
2522
2530
  * latest probe found installed, so a Codex-only or OpenCode-only host can plan
2523
2531
  * and run on its first start; DEFAULT_RUNNERS while none was found or no probe
2524
2532
  * has answered. Read on each call and never saved, so an agent installed later
2525
- * joins on the next probe and a saved choice — even an empty one — still wins.
2533
+ * joins on the next probe — a runner-list refresh asks again — and a saved
2534
+ * choice, even an empty one, still wins.
2526
2535
  * Every host's config reads it here, so the daemon, CLI, TUI and VS Code agree.
2527
2536
  */
2528
2537
  declare function defaultEnabledRunners(): RunnerId[];
package/dist/index.d.ts CHANGED
@@ -1,13 +1,13 @@
1
- import { af as Task, E as ExecutionActor, r as IsolationMergeResult, f as ExecutionRecord, g as GuardTrip, ae as SupervisorLevel, e as ExecutionCommandName, G as GuardTarget, a2 as RunnerId, d as DiscoveredModel, Z as ResearchProgress, Y as ResearchLogEntry, C as ConversationMessage, a7 as SkillInfo, a8 as SkillLoad, ac as SkillsService, L as LegacyPlanState, N as PlanStatus, n as IsolationLandedTask, I as IWorktreeIsolation, F as IsolationTaskStatus, J as PlanIsolation, ar as UsageRecord, a0 as ResearchToolType, Q as PlannerUsage, an as TaskSnapshot, K as PlanState, H as IsolationView, at as Verdict, am as TaskSkillSnapshot } from './Task-CRVIqSfy.js';
2
- export { A as ApprovalRecord, a as AttemptUsage, b as AwaitingReason, B as BUILTIN_SKILL_NAMES, D as DEFAULT_RUNNERS, c as DEFAULT_SUPERVISOR_RETRY_LIMIT, h as IntegrationDisposal, i as InvalidSkill, j as IsolationAvailability, k as IsolationHandoff, l as IsolationHandoffRepo, m as IsolationInactiveReason, o as IsolationLanding, p as IsolationMergeBlock, q as IsolationMergeBlockReason, s as IsolationOutcome, t as IsolationPruneResult, u as IsolationRemoval, v as IsolationRepo, w as IsolationRun, x as IsolationTaskRecord, y as IsolationTaskRef, z as IsolationTaskRepo, M as ModelUsage, O as PlanUsage, R as PrepareIntent, S as PreparedTask, T as PreservedWork, U as PreviousWork, V as RefusedRemoval, W as RepairEvidence, X as RepoGroupLayout, _ as ResearchStep, $ as ResearchStepOutcome, a1 as RunSettings, a3 as SetupFailure, a4 as ShadowedSkill, a5 as SkillAppliesTo, a6 as SkillCatalog, a9 as SkillLoadNotice, aa as SkillMetadata, ab as SkillSource, ai as TaskIsolation, aj as TaskIsolationState, ak as TaskModelAssignment, ao as TaskStatus, ap as TreeSnapshot, aq as UsageLine, as as UsageTotals, au as VerificationCheck, av as addAttemptUsage, aw as addModelUsage, ax as addPlannerUsage, ay as addUsage, az as addUsageTotals, aA as createEmptyPlan, aB as createSkillsService, aC as createTask, aD as endAttemptUsage, aE as flattenTasks, aF as flattenTasksWithParents, aG as isAwaitingReason, aH as isMeasured, aI as isSupervisorLevel, aJ as isUserMessage, aK as migratePlanState, aL as partedPromptUsage, aM as pausedOnLimit, aN as planUsage, aO as plannerContextFill, aP as rejoinPlanTree, aQ as startAttemptUsage, aR as usageLine, aS as waitsForApproval } from './Task-CRVIqSfy.js';
3
- import { ah as StartAdmission, w as LiveTailOptions, L as LiveTail, U as PlannerModes, at as TaskOp, u as IsolatedExecution, aa as SessionBroadcaster, b as ApplyTaskOpsResult, af as SkillLookup, ac as SessionNotice, q as EditCatalog, ab as SessionMessage, T as PlanStore, au as TaskOrchestrator, v as IsolationRunController, O as OrchestratorObserver, ar as TaskLogEvent, I as INotification, s as GlobalRunSettings, a1 as RunView, Z as RunMergeView, ax as TaskOutputSource, aO as UserSettings, al as SurfacePlan, am as SurfacePlanState } from './plan-utils-oC8bO4pN.js';
4
- export { A as ACT_RISK, a as AUTORUN_RISK, c as ApprovalBlock, d as ApprovalStatus, e as AutoMergeTrigger, B as BlockingSubject, C as CHECKPOINT_TRUNCATE_LENGTH, f as CommandBlock, g as CommandStatus, h as CompactionBlock, i as ConversationInput, j as ConversationView, D as DiffRow, k as DiffRowKind, l as DiffStat, m as DisplayBlock, E as EMPTY_CONVERSATION, n as EMPTY_HOLD, o as EMPTY_RUN, p as EMPTY_TASK_LOG, r as ExecutionSummary, G as GatedConversation, H as HeldEdit, t as HeldEditMark, x as LocalEntry, M as MarkdownToken, y as MessageBlock, z as MessageRole, N as NOT_STARTED, F as NO_TURN, J as NewTaskFields, K as NotificationAction, P as OutputPreview, Q as PlanBlock, R as PlanMarkerStatus, S as PlanSnapshot, V as PromptHold, W as RUN_SETTINGS_DEFAULTS, Y as RunInput, _ as RunSettingsError, $ as RunTask, a0 as RunTaskStatus, a2 as RunnerLoadedBlock, a3 as STOPPED_BEFORE_START, a4 as SUPERVISOR_LEVEL_LABEL, a5 as SerializedConversationMessage, a6 as SerializedPendingTurn, a7 as SerializedPlan, a8 as SerializedTask, a9 as SerializedTaskStatus, ad as SettingsService, ae as SkillLoadBlock, ag as SkillToken, ai as SubagentBlock, aj as SubagentChild, ak as SubagentStatus, an as SurfaceTask, ao as TakenPrompt, ap as TaskAttemptSnapshot, aq as TaskControlError, as as TaskLogView, av as TaskOrchestratorDeps, aw as TaskOrchestratorOptions, ay as TaskRef, az as TaskRowAction, aA as TaskRowContext, aB as TaskRowIsolation, aC as TaskRowKind, aD as TaskRowPlacement, aE as TaskRowSubject, aF as TaskRowUsage, aG as TaskRowView, aH as TaskStatusKind, aI as ThinkingDisplayBlock, aJ as ToolBlock, aK as ToolHeadline, aL as ToolStatus, aM as TurnGate, aN as UsageBlock, aP as WAITS_FOR_APPROVAL_LABEL, aQ as aheadOfDraft, aR as applyTaskOps, aS as approvalLabel, aT as automergeSummary, aU as autorunSummary, aV as awaitingLabel, aW as blockedByLabel, aX as blockingFailures, aY as canMergeTasks, aZ as canSetDependencies, a_ as canSplitTask, a$ as capConflictFiles, b0 as classifyOutcome, b1 as coalesceTaskLog, b2 as dependencyCandidates, b3 as dependentsNotice, b4 as dependentsOf, b5 as diffRows, b6 as diffStat, b7 as diffSummary, b8 as digestTaskLog, b9 as drainNext, ba as executionSummary, bb as followTurn, bc as fromTranscript, bd as getSettingsPath, be as hasHiddenDetail, bf as holdPrompt, bg as isTaskRunning, bh as loadedSkillTokens, bi as markAction, bj as markRequestFor, bk as markdownHtml, bl as markdownTokens, bm as namedRepos, bn as newTaskFields, bo as opsEditable, bp as outputLines, bq as outputPreview, br as parseCount, bs as parseSwitch, bt as parseTaskOpsJson, bu as pastGateConfirmation, bv as reconcileApprovals, bw as reduceConversation, bx as reduceRun, by as reduceTaskLog, bz as replayTaskLog, bA as resolveTaskRef, bB as resumeLabel, bC as resumeTime, bD as runSettingsOf, bE as runnerToolSubject, bF as serializePlan, bG as serializeTask, bH as serializeTaskStatus, bI as skillTokens, bJ as skippedLabel, bK as stopTurn, bL as summarizeToolCall, bM as supervisorSummary, bN as surfacePlan, bO as surfacePlanState, bP as takeAt, bQ as taskLogForSurface, bR as taskOrderLabel, bS as taskRef, bT as taskRefOf, bU as taskRowActions, bV as taskRowView, bW as taskStartedNotice, bX as taskStatusKind, bY as textHasTaskOps, bZ as titledRefs, b_ as titledTaskRef, b$ as titledTaskRefOf, c0 as toTaskLogEvent, c1 as toolHeadline, c2 as trimToolOutput, c3 as truncateCheckpointSummary, c4 as unsendAll, c5 as unsendLatest } from './plan-utils-oC8bO4pN.js';
5
- import { I as IApproval, y as IConfig, d as AgentProcessDeps, a as AgentAdapter, _ as OrdewellMcpServer, a6 as PlannerToolHandler, ad as ResearchShell, p as ApprovalRequest, j as ApprovalDecision, i as ApprovalAnswer, z as IRunner, a3 as PlannerBackendId, a9 as ProviderModelLists, f as AiProvider, m as ApprovalModeSetting, aq as RunnerRegistry, Z as OrchestratorOption, aD as TaskModeAgentAdapter, e as AgentStartOptions, c as AgentEvent, ai as RunnerCommand, a7 as ProjectMcpServer, n as ApprovalPolicy, B as IRunnerSession, aA as TaskCompleteArgs, r as CheckpointAnswer, av as StructuredTurnEnd, au as StructuredEvent, aC as TaskMessageFrom, ab as QueuedTaskMessage, aI as TaskStartOptions, aJ as TaskTokenScope, am as RunnerManifest, aH as TaskRunnerFlags } from './IRunner-QBdYcatb.js';
6
- export { A as AUTO_COMMANDS, b as AgentAdapterFactory, g as AllProviderModels, h as AnswerApprovalArgs, k as ApprovalKind, l as ApprovalMode, o as ApprovalPolicyOptions, q as ApprovalSource, C as CatalogModel, s as CheckpointArgs, t as CommandClassification, u as CommandTier, v as CommandWords, D as DEFAULT_PLANNER_ALLOWLIST, w as DENY_ALL, x as DiscoveryCommand, E as EditPlanArgs, F as FetchAllProviderModelsOptions, G as GIT_READONLY_SUBCOMMANDS, H as InvokedCommand, L as LineBuffer, J as ListModelsArgs, K as ListRunnersArgs, M as LoadSkillArgs, N as McpClientConfig, O as McpCredential, P as McpTool, Q as McpToolContext, R as McpToolReply, S as MessageTaskArgs, T as ModelCatalog, U as ModelShortcut, V as ORCHESTRATOR_SHORTCUTS, W as ORDEWELL_MCP_PATH, X as ORDEWELL_MCP_SERVER_NAME, Y as OneTaskArgs, $ as OwnerOnlyFile, a0 as PLANNER_EXECUTION_TOOLS, a1 as PLANNER_TOOLS, a2 as PlannerAllowlist, a4 as PlannerStartOptions, a5 as PlannerTokenScope, a8 as ProviderCredentialSource, aa as ProviderModelsResult, ac as REFUSED_COMMANDS, ae as ResearchShellDeps, af as RetryTaskArgs, ag as RunCommandArgs, ah as RunPlanArgs, aj as RunnerCommandKind, ak as RunnerEntry, al as RunnerFeatures, an as RunnerMcpServer, ao as RunnerMode, ap as RunnerModelDiscovery, ar as ShellDialect, as as SpawnFn, at as StandingDecision, aw as SubmitPlanArgs, ax as TASK_COMPLETE_TOOL, ay as TASK_COMPLETION_CONTRACT, az as TASK_TOOLS, aB as TaskDiffArgs, aE as TaskModeUnsupportedError, aF as TaskOutputArgs, aG as TaskQueryArgs, aK as TaskToolHandler, aL as approvalScopes, aM as classifyCommand, aN as clearResearchShellCache, aO as collectProviderCredentials, aP as commandAllowedBy, aQ as effectiveApprovalMode, aR as enabledRunners, aS as fetchAllProviderModels, aT as findRunnerCommand, aU as isGranted, aV as isRunnerApproval, aW as knownModelId, aX as mcpClientConfig, aY as ownerOnlyConfigFile, aZ as parseAllowlist, a_ as parseApprovalModeSetting, a$ as researchShellWarning, b0 as researchToolsPath, b1 as resolveModelShortcut, b2 as resolveProvider, b3 as resolveResearchShell, b4 as scopeAllowed, b5 as sharedMcpServer, b6 as toApprovalDecision, b7 as toOrchestratorOptions, b8 as toolAllowed } from './IRunner-QBdYcatb.js';
7
- import { T as ToolOutcome, I as IFileSystem, R as ReadFileOpts, b as GrepOptions, a as GlobOptions, F as FindSymbolOptions } from './IFileSystem-DCd-rkeH.js';
8
- export { G as GREP_DEFAULT_HEAD_LIMIT, c as GrepOutputMode, S as SEARCH_EXCLUSIONS } from './IFileSystem-DCd-rkeH.js';
9
- import { R as RunnerModeInfo } from './ModeResolver-BOU90Nn-.js';
10
- export { a as autonomyLevelLabel, p as parseAutonomyLevel, r as runnerModesFrom } from './ModeResolver-BOU90Nn-.js';
1
+ import { af as Task, E as ExecutionActor, r as IsolationMergeResult, f as ExecutionRecord, g as GuardTrip, ae as SupervisorLevel, e as ExecutionCommandName, G as GuardTarget, a2 as RunnerId, d as DiscoveredModel, Z as ResearchProgress, Y as ResearchLogEntry, C as ConversationMessage, a7 as SkillInfo, a8 as SkillLoad, ac as SkillsService, L as LegacyPlanState, N as PlanStatus, n as IsolationLandedTask, I as IWorktreeIsolation, F as IsolationTaskStatus, J as PlanIsolation, ar as UsageRecord, a0 as ResearchToolType, Q as PlannerUsage, an as TaskSnapshot, K as PlanState, H as IsolationView, at as Verdict, am as TaskSkillSnapshot } from './Task-DZs9eKgg.js';
2
+ export { A as ApprovalRecord, a as AttemptUsage, b as AwaitingReason, B as BUILTIN_SKILL_NAMES, D as DEFAULT_RUNNERS, c as DEFAULT_SUPERVISOR_RETRY_LIMIT, h as IntegrationDisposal, i as InvalidSkill, j as IsolationAvailability, k as IsolationHandoff, l as IsolationHandoffRepo, m as IsolationInactiveReason, o as IsolationLanding, p as IsolationMergeBlock, q as IsolationMergeBlockReason, s as IsolationOutcome, t as IsolationPruneResult, u as IsolationRemoval, v as IsolationRepo, w as IsolationRun, x as IsolationTaskRecord, y as IsolationTaskRef, z as IsolationTaskRepo, M as ModelUsage, O as PlanUsage, R as PrepareIntent, S as PreparedTask, T as PreservedWork, U as PreviousWork, V as RefusedRemoval, W as RepairEvidence, X as RepoGroupLayout, _ as ResearchStep, $ as ResearchStepOutcome, a1 as RunSettings, a3 as SetupFailure, a4 as ShadowedSkill, a5 as SkillAppliesTo, a6 as SkillCatalog, a9 as SkillLoadNotice, aa as SkillMetadata, ab as SkillSource, ai as TaskIsolation, aj as TaskIsolationState, ak as TaskModelAssignment, ao as TaskStatus, ap as TreeSnapshot, aq as UsageLine, as as UsageTotals, au as VerificationCheck, av as addAttemptUsage, aw as addModelUsage, ax as addPlannerUsage, ay as addUsage, az as addUsageTotals, aA as createEmptyPlan, aB as createSkillsService, aC as createTask, aD as endAttemptUsage, aE as flattenTasks, aF as flattenTasksWithParents, aG as isAwaitingReason, aH as isMeasured, aI as isSupervisorLevel, aJ as isUserMessage, aK as migratePlanState, aL as partedPromptUsage, aM as pausedOnLimit, aN as planUsage, aO as plannerContextFill, aP as rejoinPlanTree, aQ as startAttemptUsage, aR as usageLine, aS as waitsForApproval } from './Task-DZs9eKgg.js';
3
+ import { ah as StartAdmission, w as LiveTailOptions, L as LiveTail, U as PlannerModes, at as TaskOp, u as IsolatedExecution, aa as SessionBroadcaster, b as ApplyTaskOpsResult, af as SkillLookup, ac as SessionNotice, q as EditCatalog, ab as SessionMessage, T as PlanStore, au as TaskOrchestrator, v as IsolationRunController, O as OrchestratorObserver, ar as TaskLogEvent, I as INotification, s as GlobalRunSettings, a1 as RunView, Z as RunMergeView, ax as TaskOutputSource, aO as UserSettings, al as SurfacePlan, am as SurfacePlanState } from './plan-utils-POIz5d8z.js';
4
+ export { A as ACT_RISK, a as AUTORUN_RISK, c as ApprovalBlock, d as ApprovalStatus, e as AutoMergeTrigger, B as BlockingSubject, C as CHECKPOINT_TRUNCATE_LENGTH, f as CommandBlock, g as CommandStatus, h as CompactionBlock, i as ConversationInput, j as ConversationView, D as DiffRow, k as DiffRowKind, l as DiffStat, m as DisplayBlock, E as EMPTY_CONVERSATION, n as EMPTY_HOLD, o as EMPTY_RUN, p as EMPTY_TASK_LOG, r as ExecutionSummary, G as GatedConversation, H as HeldEdit, t as HeldEditMark, x as LocalEntry, M as MarkdownToken, y as MessageBlock, z as MessageRole, N as NOT_STARTED, F as NO_TURN, J as NewTaskFields, K as NotificationAction, P as OutputPreview, Q as PlanBlock, R as PlanMarkerStatus, S as PlanSnapshot, V as PromptHold, W as RUN_SETTINGS_DEFAULTS, Y as RunInput, _ as RunSettingsError, $ as RunTask, a0 as RunTaskStatus, a2 as RunnerLoadedBlock, a3 as STOPPED_BEFORE_START, a4 as SUPERVISOR_LEVEL_LABEL, a5 as SerializedConversationMessage, a6 as SerializedPendingTurn, a7 as SerializedPlan, a8 as SerializedTask, a9 as SerializedTaskStatus, ad as SettingsService, ae as SkillLoadBlock, ag as SkillToken, ai as SubagentBlock, aj as SubagentChild, ak as SubagentStatus, an as SurfaceTask, ao as TakenPrompt, ap as TaskAttemptSnapshot, aq as TaskControlError, as as TaskLogView, av as TaskOrchestratorDeps, aw as TaskOrchestratorOptions, ay as TaskRef, az as TaskRowAction, aA as TaskRowContext, aB as TaskRowIsolation, aC as TaskRowKind, aD as TaskRowPlacement, aE as TaskRowSubject, aF as TaskRowUsage, aG as TaskRowView, aH as TaskStatusKind, aI as ThinkingDisplayBlock, aJ as ToolBlock, aK as ToolHeadline, aL as ToolStatus, aM as TurnGate, aN as UsageBlock, aP as WAITS_FOR_APPROVAL_LABEL, aQ as aheadOfDraft, aR as applyTaskOps, aS as approvalLabel, aT as automergeSummary, aU as autorunSummary, aV as awaitingLabel, aW as blockedByLabel, aX as blockingFailures, aY as canMergeTasks, aZ as canSetDependencies, a_ as canSplitTask, a$ as capConflictFiles, b0 as classifyOutcome, b1 as coalesceTaskLog, b2 as dependencyCandidates, b3 as dependentsNotice, b4 as dependentsOf, b5 as diffRows, b6 as diffStat, b7 as diffSummary, b8 as digestTaskLog, b9 as drainNext, ba as executionSummary, bb as followTurn, bc as fromTranscript, bd as getSettingsPath, be as hasHiddenDetail, bf as holdPrompt, bg as isTaskRunning, bh as loadedSkillTokens, bi as markAction, bj as markRequestFor, bk as markdownHtml, bl as markdownTokens, bm as namedRepos, bn as newTaskFields, bo as opsEditable, bp as outputLines, bq as outputPreview, br as parseCount, bs as parseSwitch, bt as parseTaskOpsJson, bu as pastGateConfirmation, bv as reconcileApprovals, bw as reduceConversation, bx as reduceRun, by as reduceTaskLog, bz as replayTaskLog, bA as resolveTaskRef, bB as resumeLabel, bC as resumeTime, bD as runSettingsOf, bE as runnerToolSubject, bF as serializePlan, bG as serializeTask, bH as serializeTaskStatus, bI as skillTokens, bJ as skippedLabel, bK as stopTurn, bL as summarizeToolCall, bM as supervisorSummary, bN as surfacePlan, bO as surfacePlanState, bP as takeAt, bQ as taskLogForSurface, bR as taskOrderLabel, bS as taskRef, bT as taskRefOf, bU as taskRowActions, bV as taskRowView, bW as taskStartedNotice, bX as taskStatusKind, bY as textHasTaskOps, bZ as titledRefs, b_ as titledTaskRef, b$ as titledTaskRefOf, c0 as toTaskLogEvent, c1 as toolHeadline, c2 as trimToolOutput, c3 as truncateCheckpointSummary, c4 as unsendAll, c5 as unsendLatest } from './plan-utils-POIz5d8z.js';
5
+ import { I as IApproval, y as IConfig, d as AgentProcessDeps, a as AgentAdapter, _ as OrdewellMcpServer, a6 as PlannerToolHandler, ad as ResearchShell, p as ApprovalRequest, j as ApprovalDecision, i as ApprovalAnswer, z as IRunner, a3 as PlannerBackendId, a9 as ProviderModelLists, f as AiProvider, m as ApprovalModeSetting, aq as RunnerRegistry, Z as OrchestratorOption, aD as TaskModeAgentAdapter, e as AgentStartOptions, c as AgentEvent, ai as RunnerCommand, a7 as ProjectMcpServer, n as ApprovalPolicy, B as IRunnerSession, aA as TaskCompleteArgs, r as CheckpointAnswer, av as StructuredTurnEnd, au as StructuredEvent, aC as TaskMessageFrom, ab as QueuedTaskMessage, aI as TaskStartOptions, aJ as TaskTokenScope, am as RunnerManifest, aH as TaskRunnerFlags } from './IRunner-D_UkkMbJ.js';
6
+ export { A as AUTO_COMMANDS, b as AgentAdapterFactory, g as AllProviderModels, h as AnswerApprovalArgs, k as ApprovalKind, l as ApprovalMode, o as ApprovalPolicyOptions, q as ApprovalSource, C as CatalogModel, s as CheckpointArgs, t as CommandClassification, u as CommandTier, v as CommandWords, D as DEFAULT_PLANNER_ALLOWLIST, w as DENY_ALL, x as DiscoveryCommand, E as EditPlanArgs, F as FetchAllProviderModelsOptions, G as GIT_READONLY_SUBCOMMANDS, H as InvokedCommand, L as LineBuffer, J as ListModelsArgs, K as ListRunnersArgs, M as LoadSkillArgs, N as McpClientConfig, O as McpCredential, P as McpTool, Q as McpToolContext, R as McpToolReply, S as MessageTaskArgs, T as ModelCatalog, U as ModelShortcut, V as ORCHESTRATOR_SHORTCUTS, W as ORDEWELL_MCP_PATH, X as ORDEWELL_MCP_SERVER_NAME, Y as OneTaskArgs, $ as OwnerOnlyFile, a0 as PLANNER_EXECUTION_TOOLS, a1 as PLANNER_TOOLS, a2 as PlannerAllowlist, a4 as PlannerStartOptions, a5 as PlannerTokenScope, a8 as ProviderCredentialSource, aa as ProviderModelsResult, ac as REFUSED_COMMANDS, ae as ResearchShellDeps, af as RetryTaskArgs, ag as RunCommandArgs, ah as RunPlanArgs, aj as RunnerCommandKind, ak as RunnerEntry, al as RunnerFeatures, an as RunnerMcpServer, ao as RunnerMode, ap as RunnerModelDiscovery, ar as ShellDialect, as as SpawnFn, at as StandingDecision, aw as SubmitPlanArgs, ax as TASK_COMPLETE_TOOL, ay as TASK_COMPLETION_CONTRACT, az as TASK_TOOLS, aB as TaskDiffArgs, aE as TaskModeUnsupportedError, aF as TaskOutputArgs, aG as TaskQueryArgs, aK as TaskToolHandler, aL as approvalScopes, aM as classifyCommand, aN as clearResearchShellCache, aO as collectProviderCredentials, aP as commandAllowedBy, aQ as effectiveApprovalMode, aR as enabledRunners, aS as fetchAllProviderModels, aT as findRunnerCommand, aU as isGranted, aV as isRunnerApproval, aW as knownModelId, aX as mcpClientConfig, aY as ownerOnlyConfigFile, aZ as parseAllowlist, a_ as parseApprovalModeSetting, a$ as researchShellWarning, b0 as researchToolsPath, b1 as resolveModelShortcut, b2 as resolveProvider, b3 as resolveResearchShell, b4 as scopeAllowed, b5 as sharedMcpServer, b6 as toApprovalDecision, b7 as toOrchestratorOptions, b8 as toolAllowed } from './IRunner-D_UkkMbJ.js';
7
+ import { T as ToolOutcome, I as IFileSystem, R as ReadFileOpts, b as GrepOptions, a as GlobOptions, F as FindSymbolOptions } from './IFileSystem-_effm8-b.js';
8
+ export { G as GREP_DEFAULT_HEAD_LIMIT, c as GrepOutputMode, S as SEARCH_EXCLUSIONS } from './IFileSystem-_effm8-b.js';
9
+ import { R as RunnerModeInfo } from './ModeResolver-Dy3Ef6p-.js';
10
+ export { a as autonomyLevelLabel, p as parseAutonomyLevel, r as runnerModesFrom } from './ModeResolver-Dy3Ef6p-.js';
11
11
  import { ChildProcess } from 'child_process';
12
12
  import { EventEmitter } from 'events';
13
13
  import 'zod/v4';
@@ -2462,9 +2462,17 @@ declare class RunnerInstallation {
2462
2462
  private inflight;
2463
2463
  private registry;
2464
2464
  private execImpl;
2465
- constructor(registry: RunnerRegistry, execImpl?: ExecImpl);
2465
+ private now;
2466
+ constructor(registry: RunnerRegistry, execImpl?: ExecImpl, now?: () => number);
2466
2467
  /** True if the runner's CLI responds to `--version`. Cached per process. */
2467
2468
  isInstalled(runner: string): Promise<boolean>;
2469
+ /**
2470
+ * Forget cached "not installed" verdicts so the next probe re-runs them. A
2471
+ * runner-list refresh calls this, so a CLI installed while the host runs is
2472
+ * offered without a restart. An installed verdict stays: it cannot have
2473
+ * changed without the binary going away, and re-probing one costs a spawn.
2474
+ */
2475
+ refresh(): void;
2468
2476
  /**
2469
2477
  * Whether this runner can serve as a harness planner (ADR-0009, T9), and why
2470
2478
  * not when it cannot. Surfaces call this to grey out an unusable agent in the
@@ -2522,7 +2530,8 @@ declare function recordedInstalledPlanner(): PlannerBackendId | null;
2522
2530
  * latest probe found installed, so a Codex-only or OpenCode-only host can plan
2523
2531
  * and run on its first start; DEFAULT_RUNNERS while none was found or no probe
2524
2532
  * has answered. Read on each call and never saved, so an agent installed later
2525
- * joins on the next probe and a saved choice — even an empty one — still wins.
2533
+ * joins on the next probe — a runner-list refresh asks again — and a saved
2534
+ * choice, even an empty one, still wins.
2526
2535
  * Every host's config reads it here, so the daemon, CLI, TUI and VS Code agree.
2527
2536
  */
2528
2537
  declare function defaultEnabledRunners(): RunnerId[];
package/dist/index.js CHANGED
@@ -7780,7 +7780,7 @@ var CODEX_MANIFEST = {
7780
7780
  }
7781
7781
  },
7782
7782
  modelDiscovery: {
7783
- // Codex has no `codex models` subcommand (see docs/adr/0004). Discovery
7783
+ // Codex has no `codex models` subcommand (see ADR-0004). Discovery
7784
7784
  // tries three sources in order, each falling through to the next:
7785
7785
  //
7786
7786
  // 1. `codex app-server` stdio JSON-RPC (`initialize` → `model/list`) —
@@ -7882,9 +7882,11 @@ function parseOpenCodeModelsVerbose(stdout, manifest) {
7882
7882
  variants: variantIds.map((id) => ({ id, label: id.charAt(0).toUpperCase() + id.slice(1) }))
7883
7883
  });
7884
7884
  }
7885
- if (models.length === 0) return [];
7886
- const prefOrder = preferred?.map((p) => p.id) ?? [];
7887
- models.sort((a, b) => {
7885
+ return preferredFirst(models, manifest);
7886
+ }
7887
+ function preferredFirst(models, manifest) {
7888
+ const prefOrder = manifest.modelDiscovery.preferredPatterns?.map((p) => p.id) ?? [];
7889
+ return [...models].sort((a, b) => {
7888
7890
  const ai = prefOrder.indexOf(a.modelId);
7889
7891
  const bi = prefOrder.indexOf(b.modelId);
7890
7892
  if (ai >= 0 && bi >= 0) return ai - bi;
@@ -7892,7 +7894,36 @@ function parseOpenCodeModelsVerbose(stdout, manifest) {
7892
7894
  if (bi >= 0) return 1;
7893
7895
  return a.modelId.localeCompare(b.modelId);
7894
7896
  });
7895
- return models;
7897
+ }
7898
+ function parseOpenCodeModelsApi(stdout, manifest) {
7899
+ let data;
7900
+ try {
7901
+ data = JSON.parse(stdout)?.data;
7902
+ } catch {
7903
+ return [];
7904
+ }
7905
+ if (!Array.isArray(data)) return [];
7906
+ const prefLabels = new Map((manifest.modelDiscovery.preferredPatterns ?? []).map((p) => [p.id, p.label]));
7907
+ const seen = /* @__PURE__ */ new Set();
7908
+ const models = [];
7909
+ for (const entry of data) {
7910
+ if (!entry || typeof entry.providerID !== "string" || typeof entry.modelID !== "string") continue;
7911
+ if (entry.enabled === false) continue;
7912
+ const fullId = `${entry.providerID}/${entry.modelID}`;
7913
+ if (seen.has(fullId)) continue;
7914
+ seen.add(fullId);
7915
+ const variantIds = Array.isArray(entry.variants) ? entry.variants.flatMap((v) => {
7916
+ const id = v?.id;
7917
+ return typeof id === "string" && id ? [id] : [];
7918
+ }) : [];
7919
+ models.push({
7920
+ modelId: fullId,
7921
+ modelLabel: prefLabels.get(fullId) || typeof entry.name === "string" && entry.name || entry.modelID,
7922
+ runnerProvider: entry.providerID,
7923
+ variants: variantIds.map((id) => ({ id, label: id.charAt(0).toUpperCase() + id.slice(1) }))
7924
+ });
7925
+ }
7926
+ return preferredFirst(models, manifest);
7896
7927
  }
7897
7928
 
7898
7929
  // src/plugins/builtin/opencode.manifest.ts
@@ -7908,13 +7939,17 @@ var OPENCODE_MANIFEST = {
7908
7939
  modelDiscovery: {
7909
7940
  method: "command",
7910
7941
  discoveryCommands: [
7942
+ // v1 prints per-model variants under --verbose; v2 rejects the flag (a
7943
+ // fast non-zero exit) and serves the same catalog, variants included, over
7944
+ // `api model.list`. v1 is asked first so it never reaches the `api` form.
7911
7945
  { command: "opencode", args: ["models", "--verbose"], parser: parseOpenCodeModelsVerbose },
7946
+ { command: "opencode", args: ["api", "model.list"], parser: parseOpenCodeModelsApi },
7912
7947
  { command: "opencode", args: ["models"], parser: parseOpenCodeModels }
7913
7948
  ],
7914
7949
  // No fallbackModels: the list must always reflect what `opencode models`
7915
7950
  // actually reports for THIS user (their configured providers only). A
7916
7951
  // hardcoded fallback previously leaked models the user didn't have.
7917
- // No static variants — per-model variants are fetched from opencode models --verbose
7952
+ // No static variants — per-model variants come from the first two commands above
7918
7953
  providerQualifiedIds: true
7919
7954
  },
7920
7955
  contextFile: "AGENTS.md",
@@ -15677,6 +15712,7 @@ function parseCodexModelsCache(content) {
15677
15712
  }
15678
15713
  }
15679
15714
  var GEMINI_MODELS_CACHE_TTL_MS = 24 * 60 * 60 * 1e3;
15715
+ var NEGATIVE_TTL_MS = 6e4;
15680
15716
  function geminiDiscoveryCacheKey(apiKey) {
15681
15717
  const dir = globalDataDir();
15682
15718
  const hash = apiKey.slice(-8);
@@ -15806,26 +15842,33 @@ async function discoverFromApi(manifest, config, fetchImpl) {
15806
15842
  return null;
15807
15843
  }
15808
15844
  }
15845
+ function wasKilled(err) {
15846
+ return !!err && typeof err === "object" && err.killed === true;
15847
+ }
15809
15848
  async function discoverFromCommand(manifest, execImpl) {
15810
15849
  const discovery = manifest.modelDiscovery;
15811
15850
  const commands = discovery.discoveryCommands ?? [
15812
15851
  { command: discovery.command, args: discovery.args || [], parser: discovery.parser }
15813
15852
  ];
15814
15853
  const runCommands = async () => {
15854
+ let timedOut2 = false;
15815
15855
  for (const cmd of commands) {
15816
15856
  try {
15817
15857
  const { stdout } = await execImpl(`${cmd.command} ${cmd.args.join(" ")}`, { timeout: 45e3 });
15818
15858
  const models = parseModelOutput(stdout, cmd.parser, manifest);
15819
- if (models.length > 0) return applyVariants(mergeCanonicalAliases(models, manifest), manifest);
15820
- } catch {
15859
+ if (models.length > 0) return { models: applyVariants(mergeCanonicalAliases(models, manifest), manifest), timedOut: timedOut2 };
15860
+ } catch (err) {
15861
+ if (wasKilled(err)) timedOut2 = true;
15821
15862
  }
15822
15863
  }
15823
- return null;
15864
+ return { models: null, timedOut: timedOut2 };
15824
15865
  };
15825
15866
  const first = await runCommands();
15826
- if (first) return { models: first, fromFallback: false };
15827
- const second = await runCommands();
15828
- if (second) return { models: second, fromFallback: false };
15867
+ if (first.models) return { models: first.models, fromFallback: false };
15868
+ if (first.timedOut) {
15869
+ const second = await runCommands();
15870
+ if (second.models) return { models: second.models, fromFallback: false };
15871
+ }
15829
15872
  return { models: applyVariants(buildFallbackModels(manifest), manifest), fromFallback: true };
15830
15873
  }
15831
15874
  function mergeCanonicalAliases(discovered, manifest) {
@@ -15862,16 +15905,33 @@ function parseLineByLine(stdout) {
15862
15905
  }
15863
15906
  var ModelDiscovery = class {
15864
15907
  cache = /* @__PURE__ */ new Map();
15908
+ /**
15909
+ * Degraded results (a fallback list, or empty) remembered for
15910
+ * {@link NEGATIVE_TTL_MS}. They are deliberately not cached — a transient
15911
+ * failure must heal — but re-running a failing CLI on every lookup is the
15912
+ * other extreme.
15913
+ */
15914
+ misses = /* @__PURE__ */ new Map();
15915
+ /**
15916
+ * Discoveries still running, so a second lookup of the same runner joins the
15917
+ * first instead of spawning the CLI again. A slow CLI is the case this
15918
+ * exists for: a planner switch and a runner-list refresh land inside one
15919
+ * another's wait, and two `opencode models` calls race each other for the
15920
+ * same background service.
15921
+ */
15922
+ inflight = /* @__PURE__ */ new Map();
15865
15923
  registry;
15866
15924
  execImpl;
15867
15925
  fetchImpl;
15868
15926
  appServerClient;
15869
15927
  readFileImpl;
15870
- constructor(registry, execImpl = defaultExec2, fetchImpl, appServerClient = defaultAppServerClient, readFileImpl) {
15928
+ now;
15929
+ constructor(registry, execImpl = defaultExec2, fetchImpl, appServerClient = defaultAppServerClient, readFileImpl, now = Date.now) {
15871
15930
  this.registry = registry;
15872
15931
  this.execImpl = execImpl;
15873
15932
  this.fetchImpl = fetchImpl;
15874
15933
  this.appServerClient = appServerClient;
15934
+ this.now = now;
15875
15935
  this.readFileImpl = readFileImpl ?? ((filePath) => {
15876
15936
  try {
15877
15937
  return fsSync3.readFileSync(filePath.replace(/^~/, osMod.homedir()), "utf8");
@@ -15915,10 +15975,20 @@ var ModelDiscovery = class {
15915
15975
  const runnerLabel = manifest.displayName || runner;
15916
15976
  return models.map((m) => ({ ...m, runnerId: runner, runnerLabel }));
15917
15977
  }
15918
- async discoverRaw(runner) {
15919
- if (this.cache.has(runner)) {
15920
- return this.cache.get(runner);
15921
- }
15978
+ discoverRaw(runner) {
15979
+ const cached2 = this.cache.get(runner);
15980
+ if (cached2) return Promise.resolve(cached2);
15981
+ const remembered = this.misses.get(runner);
15982
+ if (remembered && this.now() - remembered.at < NEGATIVE_TTL_MS) return Promise.resolve(remembered.models);
15983
+ const running2 = this.inflight.get(runner);
15984
+ if (running2) return running2;
15985
+ const started = this.discoverUncached(runner).finally(() => {
15986
+ if (this.inflight.get(runner) === started) this.inflight.delete(runner);
15987
+ });
15988
+ this.inflight.set(runner, started);
15989
+ return started;
15990
+ }
15991
+ async discoverUncached(runner) {
15922
15992
  const manifest = this.registry.getManifest(runner);
15923
15993
  if (!manifest) {
15924
15994
  return [];
@@ -15950,10 +16020,13 @@ var ModelDiscovery = class {
15950
16020
  models = buildFallbackModels(manifest);
15951
16021
  }
15952
16022
  if (cacheable && models.length > 0) this.cache.set(runner, models);
16023
+ else this.misses.set(runner, { models, at: this.now() });
15953
16024
  return models;
15954
16025
  }
15955
16026
  clear() {
15956
16027
  this.cache.clear();
16028
+ this.misses.clear();
16029
+ this.inflight.clear();
15957
16030
  }
15958
16031
  /** Whatever `discover()` has already cached for `runner` — never triggers discovery. */
15959
16032
  getCached(runner) {
@@ -28098,15 +28171,15 @@ var ModelResolver = class {
28098
28171
  return toOrchestratorOptions({}, ORCHESTRATOR_SHORTCUTS);
28099
28172
  }
28100
28173
  async modelsForRunners(runners) {
28101
- const out = {};
28102
- for (const runner of runners) {
28174
+ const unique = [...new Set(runners)];
28175
+ const discovered = await Promise.all(unique.map(async (runner) => {
28103
28176
  try {
28104
- out[runner] = await this.discovery.discover(runner);
28177
+ return [runner, await this.discovery.discover(runner)];
28105
28178
  } catch {
28106
- out[runner] = [];
28179
+ return [runner, []];
28107
28180
  }
28108
- }
28109
- return out;
28181
+ }));
28182
+ return Object.fromEntries(discovered);
28110
28183
  }
28111
28184
  async pickerOptions() {
28112
28185
  if (this.cachedPickerOptions) return this.cachedPickerOptions;
@@ -28193,24 +28266,28 @@ var defaultExec3 = async (command, options) => {
28193
28266
  return { stdout: String(stdout) };
28194
28267
  };
28195
28268
  var CHECK_TIMEOUT_MS = 8e3;
28269
+ var NEGATIVE_TTL_MS2 = 6e4;
28196
28270
  var RunnerInstallation = class {
28197
28271
  cache = /* @__PURE__ */ new Map();
28198
28272
  inflight = /* @__PURE__ */ new Map();
28199
28273
  registry;
28200
28274
  execImpl;
28201
- constructor(registry, execImpl = defaultExec3) {
28275
+ now;
28276
+ constructor(registry, execImpl = defaultExec3, now = Date.now) {
28202
28277
  this.registry = registry;
28203
28278
  this.execImpl = execImpl;
28279
+ this.now = now;
28204
28280
  }
28205
28281
  /** True if the runner's CLI responds to `--version`. Cached per process. */
28206
28282
  async isInstalled(runner) {
28207
- if (this.cache.has(runner)) return this.cache.get(runner);
28283
+ const cached2 = this.cache.get(runner);
28284
+ if (cached2 && (cached2.installed || this.now() - cached2.at < NEGATIVE_TTL_MS2)) return cached2.installed;
28208
28285
  const existing = this.inflight.get(runner);
28209
28286
  if (existing) return existing;
28210
28287
  const manifest = this.registry.getManifest(runner);
28211
28288
  const command = manifest?.runner.command;
28212
28289
  if (!command) {
28213
- this.cache.set(runner, false);
28290
+ this.cache.set(runner, { installed: false, at: this.now() });
28214
28291
  return false;
28215
28292
  }
28216
28293
  const probe = (async () => {
@@ -28221,13 +28298,22 @@ var RunnerInstallation = class {
28221
28298
  return false;
28222
28299
  }
28223
28300
  })().then((installed) => {
28224
- this.cache.set(runner, installed);
28301
+ this.cache.set(runner, { installed, at: this.now() });
28225
28302
  this.inflight.delete(runner);
28226
28303
  return installed;
28227
28304
  });
28228
28305
  this.inflight.set(runner, probe);
28229
28306
  return probe;
28230
28307
  }
28308
+ /**
28309
+ * Forget cached "not installed" verdicts so the next probe re-runs them. A
28310
+ * runner-list refresh calls this, so a CLI installed while the host runs is
28311
+ * offered without a restart. An installed verdict stays: it cannot have
28312
+ * changed without the binary going away, and re-probing one costs a spawn.
28313
+ */
28314
+ refresh() {
28315
+ for (const [runner, probe] of this.cache) if (!probe.installed) this.cache.delete(runner);
28316
+ }
28231
28317
  /**
28232
28318
  * Whether this runner can serve as a harness planner (ADR-0009, T9), and why
28233
28319
  * not when it cannot. Surfaces call this to grey out an unusable agent in the