@oh-my-pi/pi-coding-agent 14.9.9 → 15.0.1

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.
Files changed (230) hide show
  1. package/CHANGELOG.md +123 -0
  2. package/examples/extensions/plan-mode.ts +0 -1
  3. package/package.json +9 -9
  4. package/scripts/build-binary.ts +5 -0
  5. package/scripts/format-prompts.ts +1 -1
  6. package/src/autoresearch/helpers.ts +17 -0
  7. package/src/autoresearch/tools/log-experiment.ts +9 -17
  8. package/src/autoresearch/tools/run-experiment.ts +2 -17
  9. package/src/capability/skill.ts +7 -0
  10. package/src/cli/args.ts +2 -2
  11. package/src/cli/list-models.ts +1 -1
  12. package/src/cli/shell-cli.ts +3 -13
  13. package/src/cli/update-cli.ts +1 -1
  14. package/src/cli.ts +11 -29
  15. package/src/commands/acp.ts +24 -0
  16. package/src/commands/launch.ts +6 -4
  17. package/src/commit/agentic/prompts/system.md +1 -1
  18. package/src/commit/agentic/tools/propose-changelog.ts +8 -1
  19. package/src/commit/analysis/conventional.ts +8 -66
  20. package/src/commit/map-reduce/reduce-phase.ts +6 -65
  21. package/src/commit/pipeline.ts +2 -2
  22. package/src/commit/shared-llm.ts +89 -0
  23. package/src/config/config-file.ts +210 -0
  24. package/src/config/model-equivalence.ts +8 -11
  25. package/src/config/model-registry.ts +13 -2
  26. package/src/config/model-resolver.ts +31 -4
  27. package/src/config/settings-schema.ts +102 -1
  28. package/src/config/settings.ts +1 -1
  29. package/src/config.ts +3 -219
  30. package/src/edit/index.ts +22 -1
  31. package/src/edit/modes/patch.ts +10 -0
  32. package/src/edit/modes/replace.ts +3 -0
  33. package/src/edit/renderer.ts +17 -1
  34. package/src/eval/js/context-manager.ts +1 -1
  35. package/src/eval/js/executor.ts +3 -0
  36. package/src/eval/js/shared/rewrite-imports.ts +122 -50
  37. package/src/eval/js/shared/runtime.ts +31 -4
  38. package/src/eval/js/tool-bridge.ts +43 -21
  39. package/src/eval/py/executor.ts +5 -0
  40. package/src/exa/factory.ts +2 -2
  41. package/src/exa/mcp-client.ts +74 -1
  42. package/src/exec/bash-executor.ts +5 -1
  43. package/src/export/html/template.generated.ts +1 -1
  44. package/src/export/html/template.js +0 -11
  45. package/src/extensibility/extensions/runner.ts +55 -2
  46. package/src/extensibility/extensions/types.ts +98 -221
  47. package/src/extensibility/hooks/types.ts +89 -314
  48. package/src/extensibility/shared-events.ts +343 -0
  49. package/src/extensibility/skills.ts +42 -1
  50. package/src/goals/index.ts +3 -0
  51. package/src/goals/runtime.ts +500 -0
  52. package/src/goals/state.ts +37 -0
  53. package/src/goals/tools/goal-tool.ts +237 -0
  54. package/src/hashline/anchors.ts +2 -2
  55. package/src/hindsight/mental-models.ts +1 -1
  56. package/src/internal-urls/agent-protocol.ts +1 -20
  57. package/src/internal-urls/artifact-protocol.ts +1 -19
  58. package/src/internal-urls/docs-index.generated.ts +9 -10
  59. package/src/internal-urls/index.ts +1 -0
  60. package/src/internal-urls/issue-pr-protocol.ts +577 -0
  61. package/src/internal-urls/registry-helpers.ts +25 -0
  62. package/src/internal-urls/router.ts +6 -3
  63. package/src/internal-urls/types.ts +22 -1
  64. package/src/main.ts +24 -11
  65. package/src/mcp/oauth-flow.ts +20 -0
  66. package/src/modes/acp/acp-agent.ts +412 -71
  67. package/src/modes/acp/acp-client-bridge.ts +152 -0
  68. package/src/modes/acp/acp-event-mapper.ts +180 -15
  69. package/src/modes/acp/terminal-auth.ts +37 -0
  70. package/src/modes/components/assistant-message.ts +14 -8
  71. package/src/modes/components/bash-execution.ts +24 -63
  72. package/src/modes/components/custom-message.ts +14 -40
  73. package/src/modes/components/eval-execution.ts +27 -57
  74. package/src/modes/components/execution-shared.ts +102 -0
  75. package/src/modes/components/hook-message.ts +17 -49
  76. package/src/modes/components/mcp-add-wizard.ts +26 -5
  77. package/src/modes/components/message-frame.ts +88 -0
  78. package/src/modes/components/model-selector.ts +1 -1
  79. package/src/modes/components/read-tool-group.ts +29 -1
  80. package/src/modes/components/session-observer-overlay.ts +6 -2
  81. package/src/modes/components/session-selector.ts +1 -1
  82. package/src/modes/components/status-line/segments.ts +55 -4
  83. package/src/modes/components/status-line/types.ts +4 -0
  84. package/src/modes/components/status-line.ts +28 -10
  85. package/src/modes/components/tool-execution.ts +7 -8
  86. package/src/modes/controllers/command-controller-shared.ts +108 -0
  87. package/src/modes/controllers/command-controller.ts +27 -10
  88. package/src/modes/controllers/event-controller.ts +60 -18
  89. package/src/modes/controllers/extension-ui-controller.ts +8 -2
  90. package/src/modes/controllers/input-controller.ts +85 -39
  91. package/src/modes/controllers/mcp-command-controller.ts +56 -61
  92. package/src/modes/controllers/ssh-command-controller.ts +18 -57
  93. package/src/modes/interactive-mode.ts +675 -39
  94. package/src/modes/print-mode.ts +16 -86
  95. package/src/modes/rpc/rpc-mode.ts +30 -88
  96. package/src/modes/runtime-init.ts +115 -0
  97. package/src/modes/theme/defaults/dark-poimandres.json +2 -0
  98. package/src/modes/theme/defaults/light-poimandres.json +2 -0
  99. package/src/modes/theme/theme.ts +18 -6
  100. package/src/modes/types.ts +20 -5
  101. package/src/modes/utils/context-usage.ts +13 -13
  102. package/src/modes/utils/ui-helpers.ts +25 -6
  103. package/src/plan-mode/approved-plan.ts +35 -1
  104. package/src/prompts/agents/designer.md +5 -5
  105. package/src/prompts/agents/explore.md +7 -7
  106. package/src/prompts/agents/init.md +9 -9
  107. package/src/prompts/agents/librarian.md +14 -14
  108. package/src/prompts/agents/plan.md +4 -4
  109. package/src/prompts/agents/reviewer.md +5 -5
  110. package/src/prompts/agents/task.md +10 -10
  111. package/src/prompts/commands/orchestrate.md +2 -2
  112. package/src/prompts/compaction/branch-summary.md +3 -3
  113. package/src/prompts/compaction/compaction-short-summary.md +7 -7
  114. package/src/prompts/compaction/compaction-summary-context.md +1 -1
  115. package/src/prompts/compaction/compaction-summary.md +5 -5
  116. package/src/prompts/compaction/compaction-turn-prefix.md +3 -3
  117. package/src/prompts/compaction/compaction-update-summary.md +11 -11
  118. package/src/prompts/goals/goal-budget-limit.md +16 -0
  119. package/src/prompts/goals/goal-continuation.md +28 -0
  120. package/src/prompts/goals/goal-mode-active.md +23 -0
  121. package/src/prompts/memories/consolidation.md +2 -2
  122. package/src/prompts/memories/read-path.md +1 -1
  123. package/src/prompts/memories/stage_one_input.md +1 -1
  124. package/src/prompts/memories/stage_one_system.md +5 -5
  125. package/src/prompts/review-request.md +4 -4
  126. package/src/prompts/system/agent-creation-architect.md +17 -17
  127. package/src/prompts/system/agent-creation-user.md +2 -2
  128. package/src/prompts/system/commit-message-system.md +2 -2
  129. package/src/prompts/system/custom-system-prompt.md +2 -2
  130. package/src/prompts/system/eager-todo.md +6 -6
  131. package/src/prompts/system/handoff-document.md +1 -1
  132. package/src/prompts/system/plan-mode-active.md +25 -24
  133. package/src/prompts/system/plan-mode-approved.md +4 -4
  134. package/src/prompts/system/plan-mode-compact-instructions.md +16 -0
  135. package/src/prompts/system/plan-mode-reference.md +2 -2
  136. package/src/prompts/system/plan-mode-subagent.md +8 -8
  137. package/src/prompts/system/plan-mode-tool-decision-reminder.md +3 -3
  138. package/src/prompts/system/project-prompt.md +4 -4
  139. package/src/prompts/system/subagent-system-prompt.md +7 -7
  140. package/src/prompts/system/subagent-yield-reminder.md +4 -4
  141. package/src/prompts/system/system-prompt.md +72 -71
  142. package/src/prompts/system/ttsr-interrupt.md +1 -1
  143. package/src/prompts/tools/apply-patch.md +1 -1
  144. package/src/prompts/tools/ast-edit.md +3 -3
  145. package/src/prompts/tools/ast-grep.md +3 -3
  146. package/src/prompts/tools/bash.md +6 -0
  147. package/src/prompts/tools/browser.md +3 -3
  148. package/src/prompts/tools/checkpoint.md +3 -3
  149. package/src/prompts/tools/find.md +3 -3
  150. package/src/prompts/tools/github.md +2 -5
  151. package/src/prompts/tools/goal.md +13 -0
  152. package/src/prompts/tools/hashline.md +104 -116
  153. package/src/prompts/tools/image-gen.md +3 -3
  154. package/src/prompts/tools/irc.md +1 -1
  155. package/src/prompts/tools/lsp.md +2 -2
  156. package/src/prompts/tools/patch.md +6 -6
  157. package/src/prompts/tools/read.md +8 -7
  158. package/src/prompts/tools/replace.md +5 -5
  159. package/src/prompts/tools/resolve.md +6 -5
  160. package/src/prompts/tools/retain.md +1 -1
  161. package/src/prompts/tools/rewind.md +2 -2
  162. package/src/prompts/tools/search.md +2 -2
  163. package/src/prompts/tools/ssh.md +2 -2
  164. package/src/prompts/tools/task.md +12 -6
  165. package/src/prompts/tools/web-search.md +2 -2
  166. package/src/prompts/tools/write.md +3 -3
  167. package/src/sdk.ts +81 -17
  168. package/src/session/agent-session.ts +656 -125
  169. package/src/session/blob-store.ts +36 -3
  170. package/src/session/client-bridge.ts +81 -0
  171. package/src/session/compaction/errors.ts +31 -0
  172. package/src/session/compaction/index.ts +1 -0
  173. package/src/session/messages.ts +67 -2
  174. package/src/session/session-manager.ts +131 -12
  175. package/src/session/session-storage.ts +33 -15
  176. package/src/session/streaming-output.ts +309 -13
  177. package/src/slash-commands/acp-builtins.ts +46 -0
  178. package/src/slash-commands/builtin-registry.ts +717 -116
  179. package/src/slash-commands/helpers/context-report.ts +39 -0
  180. package/src/slash-commands/helpers/format.ts +23 -0
  181. package/src/slash-commands/helpers/marketplace-manager.ts +25 -0
  182. package/src/slash-commands/helpers/mcp.ts +532 -0
  183. package/src/slash-commands/helpers/parse.ts +85 -0
  184. package/src/slash-commands/helpers/ssh.ts +193 -0
  185. package/src/slash-commands/helpers/todo.ts +279 -0
  186. package/src/slash-commands/helpers/usage-report.ts +91 -0
  187. package/src/slash-commands/types.ts +126 -0
  188. package/src/ssh/ssh-executor.ts +5 -0
  189. package/src/system-prompt.ts +4 -2
  190. package/src/task/executor.ts +27 -10
  191. package/src/task/index.ts +20 -1
  192. package/src/task/render.ts +27 -18
  193. package/src/task/types.ts +4 -0
  194. package/src/tools/ast-edit.ts +21 -120
  195. package/src/tools/ast-grep.ts +21 -119
  196. package/src/tools/bash-interactive.ts +9 -1
  197. package/src/tools/bash.ts +203 -6
  198. package/src/tools/browser/attach.ts +3 -3
  199. package/src/tools/browser/launch.ts +81 -18
  200. package/src/tools/browser/registry.ts +1 -5
  201. package/src/tools/browser/tab-supervisor.ts +51 -14
  202. package/src/tools/conflict-detect.ts +21 -10
  203. package/src/tools/eval.ts +3 -1
  204. package/src/tools/fetch.ts +15 -4
  205. package/src/tools/find.ts +39 -39
  206. package/src/tools/gh-renderer.ts +0 -12
  207. package/src/tools/gh.ts +689 -182
  208. package/src/tools/github-cache.ts +548 -0
  209. package/src/tools/index.ts +25 -11
  210. package/src/tools/inspect-image.ts +3 -10
  211. package/src/tools/output-meta.ts +176 -37
  212. package/src/tools/path-utils.ts +125 -2
  213. package/src/tools/read.ts +605 -239
  214. package/src/tools/render-utils.ts +92 -0
  215. package/src/tools/renderers.ts +2 -0
  216. package/src/tools/resolve.ts +72 -44
  217. package/src/tools/search.ts +120 -186
  218. package/src/tools/write.ts +67 -10
  219. package/src/tui/code-cell.ts +70 -2
  220. package/src/utils/file-mentions.ts +1 -1
  221. package/src/utils/image-loading.ts +7 -3
  222. package/src/utils/image-resize.ts +32 -43
  223. package/src/vim/parser.ts +0 -17
  224. package/src/vim/render.ts +1 -1
  225. package/src/vim/types.ts +1 -1
  226. package/src/web/search/providers/gemini.ts +35 -95
  227. package/src/prompts/tools/exit-plan-mode.md +0 -6
  228. package/src/tools/exit-plan-mode.ts +0 -97
  229. package/src/utils/fuzzy.ts +0 -108
  230. package/src/utils/image-convert.ts +0 -27
package/src/sdk.ts CHANGED
@@ -6,7 +6,7 @@ import {
6
6
  INTENT_FIELD,
7
7
  type ThinkingLevel,
8
8
  } from "@oh-my-pi/pi-agent-core";
9
- import type { Message, Model, SimpleStreamOptions } from "@oh-my-pi/pi-ai";
9
+ import type { CredentialDisabledEvent, Message, Model, SimpleStreamOptions } from "@oh-my-pi/pi-ai";
10
10
  import {
11
11
  getOpenAICodexTransportDetails,
12
12
  prewarmOpenAICodexResponses,
@@ -29,7 +29,13 @@ import { createAutoresearchExtension } from "./autoresearch";
29
29
  import { loadCapability } from "./capability";
30
30
  import { type Rule, ruleCapability, setActiveRules } from "./capability/rule";
31
31
  import { ModelRegistry } from "./config/model-registry";
32
- import { formatModelString, parseModelPattern, parseModelString, resolveModelRoleValue } from "./config/model-resolver";
32
+ import {
33
+ formatModelString,
34
+ parseModelPattern,
35
+ parseModelString,
36
+ resolveAllowedModels,
37
+ resolveModelRoleValue,
38
+ } from "./config/model-resolver";
33
39
  import { loadPromptTemplates as loadPromptTemplatesInternal, type PromptTemplate } from "./config/prompt-templates";
34
40
  import { Settings, type SkillsSettings } from "./config/settings";
35
41
  import { CursorExecHandlers } from "./cursor";
@@ -670,10 +676,32 @@ export async function createAgentSession(options: CreateAgentSessionOptions = {}
670
676
  registerSshCleanup();
671
677
  registerPythonCleanup();
672
678
 
673
- // Use provided or create AuthStorage and ModelRegistry
674
- const authStorage = options.authStorage ?? (await logger.time("discoverModels", discoverAuthStorage, agentDir));
675
- const modelRegistry = options.modelRegistry ?? new ModelRegistry(authStorage);
676
-
679
+ // Pin authStorage to modelRegistry.authStorage: ModelRegistry.getApiKey() routes refresh
680
+ // failures through that instance, so any divergent storage handed to the bridge / mcpManager
681
+ // / session would silently miss credential_disabled events.
682
+ const modelRegistry =
683
+ options.modelRegistry ??
684
+ new ModelRegistry(options.authStorage ?? (await logger.time("discoverModels", discoverAuthStorage, agentDir)));
685
+ const authStorage = modelRegistry.authStorage;
686
+ if (options.authStorage && options.authStorage !== authStorage) {
687
+ throw new Error(
688
+ "options.authStorage and options.modelRegistry.authStorage must be the same instance when both are provided",
689
+ );
690
+ }
691
+ // Subscribe before any getApiKey() call so startup model probes can't fire a
692
+ // credential_disabled event past us. An embedder's constructor handler makes the
693
+ // listener set non-empty from construction, which defeats AuthStorage's no-listener
694
+ // buffer — so we can't rely on it to catch startup events for the extension runner.
695
+ const startupCredentialDisabledEvents: CredentialDisabledEvent[] = [];
696
+ let credentialDisabledTarget: ExtensionRunner | undefined;
697
+ let unsubscribeCredentialDisabled: (() => void) | undefined = authStorage.onCredentialDisabled(event => {
698
+ if (credentialDisabledTarget) {
699
+ // Discard return: any handler error is routed through runner.onError listeners.
700
+ void credentialDisabledTarget.emitCredentialDisabled(event);
701
+ } else {
702
+ startupCredentialDisabledEvents.push(event);
703
+ }
704
+ });
677
705
  const settings = options.settings ?? (await logger.time("settings", Settings.init, { cwd, agentDir }));
678
706
  logger.time("initializeWithSettings", initializeWithSettings, settings);
679
707
  if (!options.modelRegistry) {
@@ -778,8 +806,11 @@ export async function createAgentSession(options: CreateAgentSessionOptions = {}
778
806
  const modelMatchPreferences = {
779
807
  usageOrder: settings.getStorage()?.getModelUsageOrder(),
780
808
  };
809
+ const allowedModels = await logger.time("resolveAllowedModels", () =>
810
+ resolveAllowedModels(modelRegistry, settings, modelMatchPreferences),
811
+ );
781
812
  const defaultRoleSpec = logger.time("resolveDefaultModelRole", () =>
782
- resolveModelRoleValue(settings.getModelRole("default"), modelRegistry.getAvailable(), {
813
+ resolveModelRoleValue(settings.getModelRole("default"), allowedModels, {
783
814
  settings,
784
815
  matchPreferences: modelMatchPreferences,
785
816
  modelRegistry,
@@ -1013,7 +1044,10 @@ export async function createAgentSession(options: CreateAgentSessionOptions = {}
1013
1044
  getSessionSpawns: () => options.spawns ?? "*",
1014
1045
  getModelString: () => (hasExplicitModel && model ? formatModelString(model) : undefined),
1015
1046
  getActiveModelString,
1016
- getPlanModeState: () => session.getPlanModeState(),
1047
+ getPlanModeState: () => session?.getPlanModeState(),
1048
+ getGoalModeState: () => session?.getGoalModeState(),
1049
+ getGoalRuntime: () => session?.goalRuntime,
1050
+ getClientBridge: () => session?.clientBridge,
1017
1051
  getCompactContext: () => session.formatCompactContext(),
1018
1052
  getTodoPhases: () => session.getTodoPhases(),
1019
1053
  setTodoPhases: phases => session.setTodoPhases(phases),
@@ -1046,6 +1080,8 @@ export async function createAgentSession(options: CreateAgentSessionOptions = {}
1046
1080
  timestamp: Date.now(),
1047
1081
  }),
1048
1082
  peekQueueInvoker: () => session.peekQueueInvoker(),
1083
+ peekStandingResolveHandler: () => session.peekStandingResolveHandler(),
1084
+ setStandingResolveHandler: handler => session.setStandingResolveHandler(handler),
1049
1085
  allocateOutputArtifact: async toolType => {
1050
1086
  try {
1051
1087
  return await sessionManager.allocateArtifactPath(toolType);
@@ -1236,11 +1272,14 @@ export async function createAgentSession(options: CreateAgentSessionOptions = {}
1236
1272
  }
1237
1273
  }
1238
1274
 
1239
- // Fall back to first available model with a valid API key.
1240
- // Skip fallback if the user explicitly requested a model via --model that wasn't found.
1275
+ // Fall back to first available model with a valid API key, honoring the
1276
+ // path-scoped `enabledModels` allow-list when configured. Skip when the
1277
+ // user explicitly requested a model via --model that wasn't found.
1241
1278
  if (!model && !options.modelPattern) {
1242
- const allModels = modelRegistry.getAll();
1243
- for (const candidate of allModels) {
1279
+ // Re-resolve the allowed set: extension factories above may have
1280
+ // registered providers/models that weren't visible at startup.
1281
+ const fallbackCandidates = await resolveAllowedModels(modelRegistry, settings, modelMatchPreferences);
1282
+ for (const candidate of fallbackCandidates) {
1244
1283
  if (await hasModelApiKey(candidate)) {
1245
1284
  model = candidate;
1246
1285
  break;
@@ -1251,8 +1290,11 @@ export async function createAgentSession(options: CreateAgentSessionOptions = {}
1251
1290
  modelFallbackMessage += `. Using ${model.provider}/${model.id}`;
1252
1291
  }
1253
1292
  } else {
1293
+ const patterns = settings.get("enabledModels");
1254
1294
  modelFallbackMessage =
1255
- "No models available. Use /login or set an API key environment variable. Then use /model to select a model.";
1295
+ patterns && patterns.length > 0
1296
+ ? `No model available matching enabledModels (${patterns.join(", ")}) with usable credentials. Configure auth for an allowed provider or adjust enabledModels.`
1297
+ : "No models available. Use /login or set an API key environment variable. Then use /model to select a model.";
1256
1298
  }
1257
1299
  }
1258
1300
 
@@ -1277,6 +1319,20 @@ export async function createAgentSession(options: CreateAgentSessionOptions = {}
1277
1319
  );
1278
1320
  }
1279
1321
 
1322
+ if (extensionRunner) {
1323
+ credentialDisabledTarget = extensionRunner;
1324
+ for (const event of startupCredentialDisabledEvents.splice(0)) {
1325
+ // Discard return: any handler error is routed through runner.onError listeners.
1326
+ void extensionRunner.emitCredentialDisabled(event);
1327
+ }
1328
+ } else {
1329
+ // No runner to forward to; release our subscription. The embedder's own
1330
+ // onCredentialDisabled (if any) keeps firing through its own subscription.
1331
+ startupCredentialDisabledEvents.length = 0;
1332
+ unsubscribeCredentialDisabled?.();
1333
+ unsubscribeCredentialDisabled = undefined;
1334
+ }
1335
+
1280
1336
  const getSessionContext = () => ({
1281
1337
  sessionManager,
1282
1338
  modelRegistry,
@@ -1325,6 +1381,12 @@ export async function createAgentSession(options: CreateAgentSessionOptions = {}
1325
1381
  for (const tool of builtinTools) {
1326
1382
  toolRegistry.set(tool.name, tool);
1327
1383
  }
1384
+ if (!toolRegistry.has("goal") && settings.get("goal.enabled")) {
1385
+ const goalTool = await logger.time("createTools:goal:session", HIDDEN_TOOLS.goal, toolSession);
1386
+ if (goalTool) {
1387
+ toolRegistry.set(goalTool.name, wrapToolWithMetaNotice(goalTool));
1388
+ }
1389
+ }
1328
1390
  for (const tool of wrappedExtensionTools) {
1329
1391
  toolRegistry.set(tool.name, tool);
1330
1392
  }
@@ -1451,7 +1513,6 @@ export async function createAgentSession(options: CreateAgentSessionOptions = {}
1451
1513
  (options.toolNames ? [...new Set(options.toolNames.map(name => name.toLowerCase()))] : undefined) ??
1452
1514
  toolNamesFromRegistry;
1453
1515
  const normalizedRequested = requestedToolNames.filter(name => toolRegistry.has(name));
1454
- const includeExitPlanMode = requestedToolNames.includes("exit_plan_mode");
1455
1516
  // Effective discovery mode: tools.discoveryMode takes precedence; mcp.discoveryMode is back-compat alias.
1456
1517
  const toolsDiscoveryModeSetting = settings.get("tools.discoveryMode");
1457
1518
  const effectiveDiscoveryMode: "off" | "mcp-only" | "all" =
@@ -1464,9 +1525,7 @@ export async function createAgentSession(options: CreateAgentSessionOptions = {}
1464
1525
  const defaultInactiveToolNames = new Set(
1465
1526
  registeredTools.filter(tool => tool.definition.defaultInactive).map(tool => tool.definition.name),
1466
1527
  );
1467
- const requestedActiveToolNames = includeExitPlanMode
1468
- ? normalizedRequested
1469
- : normalizedRequested.filter(name => name !== "exit_plan_mode");
1528
+ const requestedActiveToolNames = normalizedRequested.filter(name => name !== "goal");
1470
1529
  const initialRequestedActiveToolNames = options.toolNames
1471
1530
  ? requestedActiveToolNames
1472
1531
  : requestedActiveToolNames.filter(name => !defaultInactiveToolNames.has(name));
@@ -1766,6 +1825,7 @@ export async function createAgentSession(options: CreateAgentSessionOptions = {}
1766
1825
  await originalDispose();
1767
1826
  } finally {
1768
1827
  agentRegistry.unregister(resolvedAgentId);
1828
+ unsubscribeCredentialDisabled?.();
1769
1829
  }
1770
1830
  };
1771
1831
  }
@@ -1901,6 +1961,10 @@ export async function createAgentSession(options: CreateAgentSessionOptions = {}
1901
1961
  eventBus,
1902
1962
  };
1903
1963
  } catch (error) {
1964
+ // Release the subscription if the throw happened after install but before the
1965
+ // dispose-wrap took ownership. Idempotent with dispose() — Set.delete is a no-op
1966
+ // for already-removed listeners.
1967
+ unsubscribeCredentialDisabled?.();
1904
1968
  try {
1905
1969
  if (hasSession) {
1906
1970
  await session.dispose();