@caupulican/pi-adaptative 0.90.7 → 0.90.12

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 (224) hide show
  1. package/CHANGELOG.md +56 -0
  2. package/dist/bundled-resources/skills/tool-call-repair/SKILL.md +5 -4
  3. package/dist/bundled-resources/skills/tool-call-repair/references/failure-grammar.md +6 -3
  4. package/dist/bundled-resources/skills/tool-call-repair/references/repair-catalogue.md +1 -0
  5. package/dist/core/agent-session-contracts.d.ts +2 -0
  6. package/dist/core/agent-session-contracts.d.ts.map +1 -1
  7. package/dist/core/agent-session-contracts.js.map +1 -1
  8. package/dist/core/agent-session.d.ts +8 -7
  9. package/dist/core/agent-session.d.ts.map +1 -1
  10. package/dist/core/agent-session.js +84 -197
  11. package/dist/core/agent-session.js.map +1 -1
  12. package/dist/core/autonomy/bounded-completion.d.ts +7 -1
  13. package/dist/core/autonomy/bounded-completion.d.ts.map +1 -1
  14. package/dist/core/autonomy/bounded-completion.js +8 -2
  15. package/dist/core/autonomy/bounded-completion.js.map +1 -1
  16. package/dist/core/autonomy/contracts.d.ts +1 -1
  17. package/dist/core/autonomy/contracts.d.ts.map +1 -1
  18. package/dist/core/autonomy/contracts.js.map +1 -1
  19. package/dist/core/background-lane-controller.d.ts +14 -0
  20. package/dist/core/background-lane-controller.d.ts.map +1 -1
  21. package/dist/core/background-lane-controller.js +32 -0
  22. package/dist/core/background-lane-controller.js.map +1 -1
  23. package/dist/core/billing-failover-controller.js +1 -1
  24. package/dist/core/billing-failover-controller.js.map +1 -1
  25. package/dist/core/context/current-work-memory.d.ts +1 -1
  26. package/dist/core/context/current-work-memory.d.ts.map +1 -1
  27. package/dist/core/context/current-work-memory.js +2 -1
  28. package/dist/core/context/current-work-memory.js.map +1 -1
  29. package/dist/core/context/long-term-memory-trigger.d.ts +1 -1
  30. package/dist/core/context/long-term-memory-trigger.d.ts.map +1 -1
  31. package/dist/core/context/long-term-memory-trigger.js +2 -1
  32. package/dist/core/context/long-term-memory-trigger.js.map +1 -1
  33. package/dist/core/delegation/managed-lane-controller.js +2 -2
  34. package/dist/core/delegation/managed-lane-controller.js.map +1 -1
  35. package/dist/core/delegation/worker-agent-control-coordinator.d.ts +13 -0
  36. package/dist/core/delegation/worker-agent-control-coordinator.d.ts.map +1 -1
  37. package/dist/core/delegation/worker-agent-control-coordinator.js +71 -8
  38. package/dist/core/delegation/worker-agent-control-coordinator.js.map +1 -1
  39. package/dist/core/delegation/worker-attempt-executor.d.ts.map +1 -1
  40. package/dist/core/delegation/worker-attempt-executor.js +13 -8
  41. package/dist/core/delegation/worker-attempt-executor.js.map +1 -1
  42. package/dist/core/delegation/worker-claim.d.ts.map +1 -1
  43. package/dist/core/delegation/worker-claim.js +14 -1
  44. package/dist/core/delegation/worker-claim.js.map +1 -1
  45. package/dist/core/delegation/worker-delegation-controller.d.ts +3 -2
  46. package/dist/core/delegation/worker-delegation-controller.d.ts.map +1 -1
  47. package/dist/core/delegation/worker-delegation-controller.js +95 -42
  48. package/dist/core/delegation/worker-delegation-controller.js.map +1 -1
  49. package/dist/core/delegation/worker-fleet-limits.d.ts.map +1 -1
  50. package/dist/core/delegation/worker-fleet-limits.js +5 -1
  51. package/dist/core/delegation/worker-fleet-limits.js.map +1 -1
  52. package/dist/core/delegation/worker-lane-projection.d.ts.map +1 -1
  53. package/dist/core/delegation/worker-lane-projection.js +7 -4
  54. package/dist/core/delegation/worker-lane-projection.js.map +1 -1
  55. package/dist/core/delegation/worker-lifecycle.d.ts +8 -0
  56. package/dist/core/delegation/worker-lifecycle.d.ts.map +1 -1
  57. package/dist/core/delegation/worker-lifecycle.js.map +1 -1
  58. package/dist/core/delegation/worker-notification-coordinator.d.ts +21 -0
  59. package/dist/core/delegation/worker-notification-coordinator.d.ts.map +1 -1
  60. package/dist/core/delegation/worker-notification-coordinator.js +65 -2
  61. package/dist/core/delegation/worker-notification-coordinator.js.map +1 -1
  62. package/dist/core/delegation/worker-runner.d.ts +7 -0
  63. package/dist/core/delegation/worker-runner.d.ts.map +1 -1
  64. package/dist/core/delegation/worker-runner.js +24 -7
  65. package/dist/core/delegation/worker-runner.js.map +1 -1
  66. package/dist/core/delegation/worker-system-prompt.d.ts +54 -0
  67. package/dist/core/delegation/worker-system-prompt.d.ts.map +1 -0
  68. package/dist/core/delegation/worker-system-prompt.js +85 -0
  69. package/dist/core/delegation/worker-system-prompt.js.map +1 -0
  70. package/dist/core/delegation/worker-tree-budget-coordinator.d.ts.map +1 -1
  71. package/dist/core/delegation/worker-tree-budget-coordinator.js +4 -0
  72. package/dist/core/delegation/worker-tree-budget-coordinator.js.map +1 -1
  73. package/dist/core/delegation/worker-write-reservation-coordinator.d.ts +4 -0
  74. package/dist/core/delegation/worker-write-reservation-coordinator.d.ts.map +1 -1
  75. package/dist/core/delegation/worker-write-reservation-coordinator.js +28 -1
  76. package/dist/core/delegation/worker-write-reservation-coordinator.js.map +1 -1
  77. package/dist/core/durable-custom-message-turn-controller.d.ts.map +1 -1
  78. package/dist/core/durable-custom-message-turn-controller.js +14 -3
  79. package/dist/core/durable-custom-message-turn-controller.js.map +1 -1
  80. package/dist/core/extension-binding-controller.d.ts +107 -0
  81. package/dist/core/extension-binding-controller.d.ts.map +1 -0
  82. package/dist/core/extension-binding-controller.js +224 -0
  83. package/dist/core/extension-binding-controller.js.map +1 -0
  84. package/dist/core/extensions/extension-session-scope.d.ts +17 -0
  85. package/dist/core/extensions/extension-session-scope.d.ts.map +1 -0
  86. package/dist/core/extensions/extension-session-scope.js +135 -0
  87. package/dist/core/extensions/extension-session-scope.js.map +1 -0
  88. package/dist/core/extensions/index.d.ts +1 -0
  89. package/dist/core/extensions/index.d.ts.map +1 -1
  90. package/dist/core/extensions/index.js +1 -0
  91. package/dist/core/extensions/index.js.map +1 -1
  92. package/dist/core/extensions/types.d.ts +2 -0
  93. package/dist/core/extensions/types.d.ts.map +1 -1
  94. package/dist/core/extensions/types.js.map +1 -1
  95. package/dist/core/extensions/wrapper.d.ts +2 -1
  96. package/dist/core/extensions/wrapper.d.ts.map +1 -1
  97. package/dist/core/extensions/wrapper.js +10 -4
  98. package/dist/core/extensions/wrapper.js.map +1 -1
  99. package/dist/core/foreground-terminal-handoff-controller.d.ts +9 -0
  100. package/dist/core/foreground-terminal-handoff-controller.d.ts.map +1 -1
  101. package/dist/core/foreground-terminal-handoff-controller.js +35 -9
  102. package/dist/core/foreground-terminal-handoff-controller.js.map +1 -1
  103. package/dist/core/goal-loop-controller.d.ts.map +1 -1
  104. package/dist/core/goal-loop-controller.js +10 -1
  105. package/dist/core/goal-loop-controller.js.map +1 -1
  106. package/dist/core/goals/compact-goal-context.d.ts +1 -1
  107. package/dist/core/goals/compact-goal-context.d.ts.map +1 -1
  108. package/dist/core/goals/compact-goal-context.js +2 -1
  109. package/dist/core/goals/compact-goal-context.js.map +1 -1
  110. package/dist/core/goals/goal-execution-errors.d.ts +18 -0
  111. package/dist/core/goals/goal-execution-errors.d.ts.map +1 -0
  112. package/dist/core/goals/goal-execution-errors.js +21 -0
  113. package/dist/core/goals/goal-execution-errors.js.map +1 -0
  114. package/dist/core/goals/goal-lifecycle.d.ts.map +1 -1
  115. package/dist/core/goals/goal-lifecycle.js +3 -3
  116. package/dist/core/goals/goal-lifecycle.js.map +1 -1
  117. package/dist/core/goals/goal-session-controller.d.ts +11 -0
  118. package/dist/core/goals/goal-session-controller.d.ts.map +1 -1
  119. package/dist/core/goals/goal-session-controller.js +74 -14
  120. package/dist/core/goals/goal-session-controller.js.map +1 -1
  121. package/dist/core/goals/goal-state.js +1 -1
  122. package/dist/core/goals/goal-state.js.map +1 -1
  123. package/dist/core/goals/goal-tool-core.d.ts.map +1 -1
  124. package/dist/core/goals/goal-tool-core.js +2 -2
  125. package/dist/core/goals/goal-tool-core.js.map +1 -1
  126. package/dist/core/goals/natural-language-goal.d.ts +18 -0
  127. package/dist/core/goals/natural-language-goal.d.ts.map +1 -1
  128. package/dist/core/goals/natural-language-goal.js +99 -16
  129. package/dist/core/goals/natural-language-goal.js.map +1 -1
  130. package/dist/core/model-registry.d.ts +5 -0
  131. package/dist/core/model-registry.d.ts.map +1 -1
  132. package/dist/core/model-registry.js +10 -0
  133. package/dist/core/model-registry.js.map +1 -1
  134. package/dist/core/model-resolver.d.ts.map +1 -1
  135. package/dist/core/model-resolver.js +3 -1
  136. package/dist/core/model-resolver.js.map +1 -1
  137. package/dist/core/orchestration/capability-gateway.d.ts +1 -1
  138. package/dist/core/orchestration/capability-gateway.d.ts.map +1 -1
  139. package/dist/core/orchestration/capability-gateway.js +4 -4
  140. package/dist/core/orchestration/capability-gateway.js.map +1 -1
  141. package/dist/core/orchestration/event-store.d.ts +8 -0
  142. package/dist/core/orchestration/event-store.d.ts.map +1 -1
  143. package/dist/core/orchestration/event-store.js +9 -7
  144. package/dist/core/orchestration/event-store.js.map +1 -1
  145. package/dist/core/orchestration/task-runtime-reducer.js +1 -1
  146. package/dist/core/orchestration/task-runtime-reducer.js.map +1 -1
  147. package/dist/core/orchestration/worker-model-pins.d.ts +7 -0
  148. package/dist/core/orchestration/worker-model-pins.d.ts.map +1 -1
  149. package/dist/core/orchestration/worker-model-pins.js +17 -1
  150. package/dist/core/orchestration/worker-model-pins.js.map +1 -1
  151. package/dist/core/provider-request-runtime-controller.d.ts +9 -0
  152. package/dist/core/provider-request-runtime-controller.d.ts.map +1 -1
  153. package/dist/core/provider-request-runtime-controller.js +17 -3
  154. package/dist/core/provider-request-runtime-controller.js.map +1 -1
  155. package/dist/core/provider-tool-text.d.ts +15 -1
  156. package/dist/core/provider-tool-text.d.ts.map +1 -1
  157. package/dist/core/provider-tool-text.js +42 -10
  158. package/dist/core/provider-tool-text.js.map +1 -1
  159. package/dist/core/research/research-lane-controller.d.ts +1 -1
  160. package/dist/core/research/research-lane-controller.d.ts.map +1 -1
  161. package/dist/core/research/research-lane-controller.js +2 -1
  162. package/dist/core/research/research-lane-controller.js.map +1 -1
  163. package/dist/core/resource-loader.d.ts +3 -0
  164. package/dist/core/resource-loader.d.ts.map +1 -1
  165. package/dist/core/resource-loader.js +8 -0
  166. package/dist/core/resource-loader.js.map +1 -1
  167. package/dist/core/runtime-builder.d.ts +8 -0
  168. package/dist/core/runtime-builder.d.ts.map +1 -1
  169. package/dist/core/runtime-builder.js +6 -0
  170. package/dist/core/runtime-builder.js.map +1 -1
  171. package/dist/core/session-supervision-runtime.d.ts.map +1 -1
  172. package/dist/core/session-supervision-runtime.js +2 -1
  173. package/dist/core/session-supervision-runtime.js.map +1 -1
  174. package/dist/core/settings-manager.d.ts +2 -2
  175. package/dist/core/settings-manager.d.ts.map +1 -1
  176. package/dist/core/settings-manager.js +7 -2
  177. package/dist/core/settings-manager.js.map +1 -1
  178. package/dist/core/tasks/task-state.d.ts +1 -1
  179. package/dist/core/tasks/task-state.d.ts.map +1 -1
  180. package/dist/core/tasks/task-state.js +4 -2
  181. package/dist/core/tasks/task-state.js.map +1 -1
  182. package/dist/core/tools/delegate.d.ts +13 -0
  183. package/dist/core/tools/delegate.d.ts.map +1 -1
  184. package/dist/core/tools/delegate.js +20 -18
  185. package/dist/core/tools/delegate.js.map +1 -1
  186. package/dist/core/util/atomic-file.d.ts +7 -0
  187. package/dist/core/util/atomic-file.d.ts.map +1 -1
  188. package/dist/core/util/atomic-file.js +8 -6
  189. package/dist/core/util/atomic-file.js.map +1 -1
  190. package/dist/core/util/faultable-fs.d.ts +30 -0
  191. package/dist/core/util/faultable-fs.d.ts.map +1 -0
  192. package/dist/core/util/faultable-fs.js +30 -0
  193. package/dist/core/util/faultable-fs.js.map +1 -0
  194. package/dist/modes/interactive/auth-dialogs-controller.d.ts.map +1 -1
  195. package/dist/modes/interactive/auth-dialogs-controller.js +1 -0
  196. package/dist/modes/interactive/auth-dialogs-controller.js.map +1 -1
  197. package/dist/modes/interactive/components/activity-lane.d.ts.map +1 -1
  198. package/dist/modes/interactive/components/activity-lane.js +4 -3
  199. package/dist/modes/interactive/components/activity-lane.js.map +1 -1
  200. package/dist/modes/interactive/components/footer.js +1 -1
  201. package/dist/modes/interactive/components/footer.js.map +1 -1
  202. package/dist/modes/interactive/components/oauth-selector.d.ts +2 -0
  203. package/dist/modes/interactive/components/oauth-selector.d.ts.map +1 -1
  204. package/dist/modes/interactive/components/oauth-selector.js +3 -2
  205. package/dist/modes/interactive/components/oauth-selector.js.map +1 -1
  206. package/dist/modes/interactive/report-commands.js +1 -1
  207. package/dist/modes/interactive/report-commands.js.map +1 -1
  208. package/dist/modes/interactive/session-flow-commands.d.ts +1 -1
  209. package/dist/modes/interactive/session-flow-commands.d.ts.map +1 -1
  210. package/dist/modes/interactive/session-flow-commands.js +3 -2
  211. package/dist/modes/interactive/session-flow-commands.js.map +1 -1
  212. package/docs/extensions.md +1 -0
  213. package/docs/providers.md +3 -0
  214. package/docs/settings.md +4 -2
  215. package/docs/tool-repair.md +1 -0
  216. package/examples/extensions/custom-provider-anthropic/package-lock.json +2 -2
  217. package/examples/extensions/custom-provider-anthropic/package.json +1 -1
  218. package/examples/extensions/custom-provider-gitlab-duo/package.json +1 -1
  219. package/examples/extensions/sandbox/package-lock.json +2 -2
  220. package/examples/extensions/sandbox/package.json +1 -1
  221. package/examples/extensions/with-deps/package-lock.json +2 -2
  222. package/examples/extensions/with-deps/package.json +1 -1
  223. package/npm-shrinkwrap.json +12 -12
  224. package/package.json +9 -4
@@ -1,10 +1,11 @@
1
1
  import { randomUUID } from "node:crypto";
2
- import { basename, dirname } from "node:path";
3
- import { projectToolsForProvider } from "@caupulican/pi-agent-core";
2
+ import { basename } from "node:path";
3
+ import { NATIVE_TOOL_PROTOCOL_RESIDUE_ERROR, projectToolsForProvider } from "@caupulican/pi-agent-core";
4
4
  import { AgentBusyError } from "@caupulican/pi-agent-core/agent";
5
5
  import { compactToolResultDetailsForRetention } from "@caupulican/pi-agent-core/message-retention";
6
6
  import { createCustomMessage } from "@caupulican/pi-agent-core/messages";
7
7
  import { DEFAULT_STREAM_IDLE, withStreamIdleWatchdog, } from "@caupulican/pi-agent-core/reliability";
8
+ import { transcriptHasClosedToolOperation } from "@caupulican/pi-agent-core/tool-failure-memory";
8
9
  import { getSupportedThinkingLevels, modelsAreEqual } from "@caupulican/pi-ai/models";
9
10
  import { cleanupSessionResources } from "@caupulican/pi-ai/session-resources";
10
11
  import { streamSimple } from "@caupulican/pi-ai/stream";
@@ -22,8 +23,9 @@ import { CompactionSupport } from "./compaction-support.js";
22
23
  import { buildContextCompositionReport, formatContextCompositionDashboard, } from "./context/context-composition.js";
23
24
  import { ContextPipeline } from "./context-pipeline.js";
24
25
  import { downgradeReasoning, estimateTurnCostUsd, evaluateCostGuard } from "./cost-guard.js";
25
- import { appendWorkerClaimSnapshot, getWorkerClaimSnapshots } from "./delegation/session-worker-claim.js";
26
+ import { appendWorkerClaimSnapshot, getLatestWorkerClaimSnapshot, getWorkerClaimSnapshots, } from "./delegation/session-worker-claim.js";
26
27
  import { DurableCustomMessageTurnController } from "./durable-custom-message-turn-controller.js";
28
+ import { ExtensionBindingController } from "./extension-binding-controller.js";
27
29
  import { FailureCorpusRecorder } from "./failure-corpus.js";
28
30
  import { ForegroundRecoveryController } from "./foreground-recovery-controller.js";
29
31
  import { ForegroundTerminalHandoffController } from "./foreground-terminal-handoff-controller.js";
@@ -116,6 +118,8 @@ export class AgentSession {
116
118
  this._pendingNextTurnMessages = [];
117
119
  this._streamingPromptSubmissionTail = Promise.resolve();
118
120
  this._unboundToolGrantWarnings = [];
121
+ /** Delegate provider-prompt-guideline bounding diagnostics (root-session delegate tool only). */
122
+ this._delegatePromptGuidelineWarnings = [];
119
123
  this._branchSummaryAbortController = undefined;
120
124
  this._turnIndex = 0;
121
125
  /** Per-agent persistent shell session identity: stable across runtime reloads, disposed with the session. */
@@ -231,7 +235,7 @@ export class AgentSession {
231
235
  if (messagePersisted) {
232
236
  this._pipeline.observeProviderUsage(this.agent.state.messages, assistantMsg);
233
237
  }
234
- if (assistantMsg.errorMessage?.startsWith("native_tool_protocol_residue:")) {
238
+ if (assistantMsg.errorMessage?.startsWith(`${NATIVE_TOOL_PROTOCOL_RESIDUE_ERROR}:`)) {
235
239
  this._goals.markProtocolFailureBlocked(assistantMsg.errorMessage);
236
240
  }
237
241
  this._foregroundRecovery.observeAssistant(assistantMsg);
@@ -561,6 +565,7 @@ export class AgentSession {
561
565
  compaction: this._compaction,
562
566
  context: providerRequestContext,
563
567
  admitGoalRequest: () => this._goals.admitProviderRequest(),
568
+ shouldStopGoalExecutionAfterTurn: () => this._goals.hasExecutionLeaseCrossedBudgetLimit(),
564
569
  });
565
570
  this._toolRecoveryLogger = new ToolRecoveryLogger({
566
571
  enabled: toolRepairSettings.logging,
@@ -595,6 +600,7 @@ export class AgentSession {
595
600
  isDisposed: () => this._disposed,
596
601
  getGoalStateSnapshot: () => this.getGoalStateSnapshot(),
597
602
  workerInputsWillWakeParent: (workerRequestIds) => this._humanInput.workerInputsWillWakeParent(workerRequestIds),
603
+ getWorkerClaimSnapshot: (laneId) => getLatestWorkerClaimSnapshot(getActiveSessionBranchEntries(this.sessionManager), laneId),
598
604
  startCustomMessageTurn: (message, lease, goalId) => this._durableCustomMessageTurns.start(message, lease, goalId),
599
605
  sendCustomMessage: (message, options, lease) => this._sendCustomMessage(message, options, lease),
600
606
  warn: (message) => this._emit({ type: "warning", message }),
@@ -708,15 +714,18 @@ export class AgentSession {
708
714
  this._unboundToolGrantWarnings = warnings;
709
715
  },
710
716
  getUnboundToolGrantWarnings: () => this._unboundToolGrantWarnings,
717
+ setDelegatePromptGuidelineWarnings: (warnings) => {
718
+ this._delegatePromptGuidelineWarnings = warnings;
719
+ },
711
720
  createProfileFilterReloadSnapshot: () => this._profileFilter.createReloadSnapshot(),
712
721
  restoreProfileFilterReloadSnapshot: (snapshot) => this._profileFilter.restoreReloadSnapshot(snapshot),
713
722
  getActiveToolNames: () => this.getActiveToolNames(),
714
723
  setActiveToolsByName: (toolNames) => this.setActiveToolsByName(toolNames),
715
724
  normalizePromptSnippet: (text) => this._normalizePromptSnippet(text),
716
725
  normalizePromptGuidelines: (guidelines) => this._normalizePromptGuidelines(guidelines),
717
- bindExtensionCore: (runner) => this._bindExtensionCore(runner),
718
- applyExtensionBindings: (runner) => this._applyExtensionBindings(runner),
719
- extendResourcesFromExtensions: (reason) => this.extendResourcesFromExtensions(reason),
726
+ bindExtensionCore: (runner) => this._extensionBinding.bindExtensionCore(runner),
727
+ applyExtensionBindings: (runner) => this._extensionBinding.applyExtensionBindings(runner),
728
+ extendResourcesFromExtensions: (reason) => this._extensionBinding.extendResourcesFromExtensions(reason),
720
729
  reapplyActiveProfileModelSettings: () => this._profileFilter.reapplyActiveProfileModelSettings(),
721
730
  notifyExtensionsChanged: () => this._notifyExtensionsChanged(),
722
731
  getToolArtifactStore: () => this._getToolArtifactStore(),
@@ -759,6 +768,67 @@ export class AgentSession {
759
768
  this._localRuntimeController.reconcile(this._collectEligibleLocalModelsForReconcile());
760
769
  },
761
770
  });
771
+ this._extensionBinding = new ExtensionBindingController({
772
+ getAgent: () => this.agent,
773
+ getExtensionRunner: () => this._extensionRunner,
774
+ getSessionStartEvent: () => this._sessionStartEvent,
775
+ getCwd: () => this._cwd,
776
+ getResourceLoader: () => this._resourceLoader,
777
+ getSessionManager: () => this.sessionManager,
778
+ getSettingsManager: () => this.settingsManager,
779
+ getModelRegistry: () => this._modelRegistry,
780
+ getModel: () => this.model,
781
+ getActiveToolNames: () => this.getActiveToolNames(),
782
+ getAllTools: () => this.getAllTools(),
783
+ setActiveToolsByName: (toolNames) => this.setActiveToolsByName(toolNames),
784
+ refreshToolRegistry: () => this._refreshToolRegistry(),
785
+ rebuildSystemPrompt: (toolNames) => this._rebuildSystemPrompt(toolNames),
786
+ setBaseSystemPrompt: (prompt) => {
787
+ this._baseSystemPrompt = prompt;
788
+ },
789
+ getPromptTemplates: () => this.promptTemplates,
790
+ getThinkingLevel: () => this.thinkingLevel,
791
+ setThinkingLevel: (level) => this.setThinkingLevel(level),
792
+ setModel: (model) => this.setModel(model),
793
+ sendCustomMessage: (message, options) => this.sendCustomMessage(message, options),
794
+ sendUserMessage: (content, options) => this.sendUserMessage(content, options),
795
+ setSessionName: (name) => this.setSessionName(name),
796
+ registerMemoryProvider: (provider) => this.registerMemoryProvider(provider),
797
+ registerContextMemoryProvider: (provider) => this.registerContextMemoryProvider(provider),
798
+ addSpawnedUsage: (usage, opts) => this.addSpawnedUsage(usage, opts),
799
+ recordManagedLane: (event) => this._backgroundLanes.recordManagedLane(event),
800
+ isForegroundBusy: () => this._foregroundRecovery.isBusy,
801
+ getPendingMessageCount: () => this.pendingMessageCount,
802
+ isStreaming: () => this.isStreaming,
803
+ isCompacting: () => this.isCompacting,
804
+ getContextUsage: () => this.getContextUsage(),
805
+ compactForExtension: (options) => this.compactForExtension(options),
806
+ reload: () => this.reload(),
807
+ abort: () => this.abort(),
808
+ getSystemPrompt: () => this.systemPrompt,
809
+ getExtensionCommandContextActions: () => this._extensionCommandContextActions,
810
+ refreshCurrentModelFromRegistry: () => this._refreshCurrentModelFromRegistry(),
811
+ initializeMemory: () => this._memory.initialize(),
812
+ getExtensionUIContext: () => this._extensionUIContext,
813
+ setExtensionUIContext: (uiContext) => {
814
+ this._extensionUIContext = uiContext;
815
+ },
816
+ getExtensionMode: () => this._extensionMode,
817
+ setExtensionMode: (mode) => {
818
+ this._extensionMode = mode;
819
+ },
820
+ setExtensionCommandContextActions: (actions) => {
821
+ this._extensionCommandContextActions = actions;
822
+ },
823
+ getExtensionShutdownHandler: () => this._extensionShutdownHandler,
824
+ setExtensionShutdownHandler: (handler) => {
825
+ this._extensionShutdownHandler = handler;
826
+ },
827
+ getExtensionErrorListener: () => this._extensionErrorListener,
828
+ setExtensionErrorListener: (listener) => {
829
+ this._extensionErrorListener = listener;
830
+ },
831
+ });
762
832
  this._analytics = new SessionAnalytics({
763
833
  getState: () => this.state,
764
834
  getMessages: () => this.messages,
@@ -1276,6 +1346,7 @@ export class AgentSession {
1276
1346
  ...this._profileFilter.profileDeniedResourceObservations(),
1277
1347
  ...this._profileFilter.getInertExtensionWarnings(),
1278
1348
  ...this._unboundToolGrantWarnings,
1349
+ ...this._delegatePromptGuidelineWarnings,
1279
1350
  // Auto-built per-turn foreground envelope (observe-only; not enforced). Falls back to a
1280
1351
  // live preview when no turn has run yet so /context always shows the current scope.
1281
1352
  formatForegroundEnvelopeObservation(this._currentForegroundEnvelope ?? this._buildForegroundEnvelopeFromState()),
@@ -1684,6 +1755,7 @@ export class AgentSession {
1684
1755
  this.agent.subscribeToolCallHandoffRequest = undefined;
1685
1756
  });
1686
1757
  safely(() => this._extensionRunner.invalidate());
1758
+ track(() => this._resourceLoader.dispose?.() ?? Promise.resolve());
1687
1759
  safely(() => this._disconnectFromAgent());
1688
1760
  this._eventListeners = [];
1689
1761
  // Let an aborted in-flight reflection reach its terminal state, then flush session-owned write
@@ -2207,7 +2279,9 @@ export class AgentSession {
2207
2279
  messages.push(msg);
2208
2280
  }
2209
2281
  const taskStepsState = options?.internalContextType ? undefined : this.getTaskStepsStateSnapshot();
2210
- const taskStepsContext = taskStepsState ? formatTaskStepsContext(taskStepsState) : undefined;
2282
+ const taskStepsContext = taskStepsState
2283
+ ? formatTaskStepsContext(taskStepsState, 12, transcriptHasClosedToolOperation(this.agent.state.messages))
2284
+ : undefined;
2211
2285
  if (taskStepsState && taskStepsContext) {
2212
2286
  messages.push(createCustomMessage("task_steps_context", taskStepsContext, false, { revision: taskStepsState.revision }, new Date().toISOString()));
2213
2287
  }
@@ -2712,79 +2786,9 @@ export class AgentSession {
2712
2786
  get autoCompactionEnabled() {
2713
2787
  return this.settingsManager.getCompactionEnabled();
2714
2788
  }
2789
+ /** Public entry point delegating to {@link ExtensionBindingController.bindExtensions}. */
2715
2790
  async bindExtensions(bindings) {
2716
- if (bindings.uiContext !== undefined) {
2717
- this._extensionUIContext = bindings.uiContext;
2718
- }
2719
- if (bindings.mode !== undefined) {
2720
- this._extensionMode = bindings.mode;
2721
- }
2722
- if (bindings.commandContextActions !== undefined) {
2723
- this._extensionCommandContextActions = bindings.commandContextActions;
2724
- }
2725
- if (bindings.abortHandler !== undefined) {
2726
- this._extensionAbortHandler = bindings.abortHandler;
2727
- }
2728
- if (bindings.shutdownHandler !== undefined) {
2729
- this._extensionShutdownHandler = bindings.shutdownHandler;
2730
- }
2731
- if (bindings.onError !== undefined) {
2732
- this._extensionErrorListener = bindings.onError;
2733
- }
2734
- this._applyExtensionBindings(this._extensionRunner);
2735
- await this._extensionRunner.emit(this._sessionStartEvent);
2736
- await this.extendResourcesFromExtensions(this._sessionStartEvent.reason === "reload" ? "reload" : "startup");
2737
- // Initialize the memory subsystem after extensions have had a chance to register providers.
2738
- await this._memory.initialize();
2739
- }
2740
- async extendResourcesFromExtensions(reason) {
2741
- if (!this._extensionRunner.hasHandlers("resources_discover")) {
2742
- return;
2743
- }
2744
- const { skillPaths, promptPaths, themePaths } = await this._extensionRunner.emitResourcesDiscover(this._cwd, reason);
2745
- if (skillPaths.length === 0 && promptPaths.length === 0 && themePaths.length === 0) {
2746
- return;
2747
- }
2748
- const extensionPaths = {
2749
- skillPaths: this.buildExtensionResourcePaths(skillPaths),
2750
- promptPaths: this.buildExtensionResourcePaths(promptPaths),
2751
- themePaths: this.buildExtensionResourcePaths(themePaths),
2752
- };
2753
- this._resourceLoader.extendResources(extensionPaths);
2754
- this._baseSystemPrompt = this._rebuildSystemPrompt(this.getActiveToolNames());
2755
- this.agent.state.systemPrompt = this._baseSystemPrompt;
2756
- }
2757
- buildExtensionResourcePaths(entries) {
2758
- return entries.map((entry) => {
2759
- const source = this.getExtensionSourceLabel(entry.extensionPath);
2760
- const baseDir = entry.extensionPath.startsWith("<") ? undefined : dirname(entry.extensionPath);
2761
- return {
2762
- path: entry.path,
2763
- metadata: {
2764
- source,
2765
- scope: "temporary",
2766
- origin: "top-level",
2767
- baseDir,
2768
- },
2769
- };
2770
- });
2771
- }
2772
- getExtensionSourceLabel(extensionPath) {
2773
- if (extensionPath.startsWith("<")) {
2774
- return `extension:${extensionPath.replace(/[<>]/g, "")}`;
2775
- }
2776
- const base = basename(extensionPath);
2777
- const name = base.replace(/\.(ts|js)$/, "");
2778
- return `extension:${name}`;
2779
- }
2780
- _applyExtensionBindings(runner) {
2781
- runner.setUIContext(this._extensionUIContext);
2782
- runner.setMode(this._extensionMode);
2783
- runner.bindCommandContext(this._extensionCommandContextActions);
2784
- this._extensionErrorUnsubscriber?.();
2785
- this._extensionErrorUnsubscriber = this._extensionErrorListener
2786
- ? runner.onError(this._extensionErrorListener)
2787
- : undefined;
2791
+ return this._extensionBinding.bindExtensions(bindings);
2788
2792
  }
2789
2793
  _refreshCurrentModelFromRegistry() {
2790
2794
  const currentModel = this.model;
@@ -2797,123 +2801,6 @@ export class AgentSession {
2797
2801
  }
2798
2802
  this.agent.state.model = refreshedModel;
2799
2803
  }
2800
- _bindExtensionCore(runner) {
2801
- const getCommands = () => {
2802
- const extensionCommands = runner.getRegisteredCommands().map((command) => ({
2803
- name: command.invocationName,
2804
- description: command.description,
2805
- source: "extension",
2806
- sourceInfo: command.sourceInfo,
2807
- }));
2808
- const templates = this.promptTemplates.map((template) => ({
2809
- name: template.name,
2810
- description: template.description,
2811
- source: "prompt",
2812
- sourceInfo: template.sourceInfo,
2813
- }));
2814
- const skills = this._resourceLoader.getActiveSkills().map((skill) => ({
2815
- name: `skill:${skill.name}`,
2816
- description: skill.description,
2817
- source: "skill",
2818
- sourceInfo: skill.sourceInfo,
2819
- }));
2820
- return [...extensionCommands, ...templates, ...skills];
2821
- };
2822
- runner.bindCore({
2823
- sendMessage: (message, options) => {
2824
- this.sendCustomMessage(message, options).catch((err) => {
2825
- runner.emitError({
2826
- extensionPath: "<runtime>",
2827
- event: "send_message",
2828
- error: err instanceof Error ? err.message : String(err),
2829
- });
2830
- });
2831
- },
2832
- sendUserMessage: (content, options) => {
2833
- this.sendUserMessage(content, options).catch((err) => {
2834
- runner.emitError({
2835
- extensionPath: "<runtime>",
2836
- event: "send_user_message",
2837
- error: err instanceof Error ? err.message : String(err),
2838
- });
2839
- });
2840
- },
2841
- appendEntry: (customType, data) => {
2842
- this.sessionManager.appendCustomEntry(customType, data);
2843
- },
2844
- setSessionName: (name) => {
2845
- this.setSessionName(name);
2846
- },
2847
- getSessionName: () => {
2848
- return this.sessionManager.getSessionName();
2849
- },
2850
- setLabel: (entryId, label) => {
2851
- this.sessionManager.appendLabelChange(entryId, label);
2852
- },
2853
- getActiveTools: () => this.getActiveToolNames(),
2854
- getAllTools: () => this.getAllTools(),
2855
- setActiveTools: (toolNames) => this.setActiveToolsByName(toolNames),
2856
- refreshTools: () => this._refreshToolRegistry(),
2857
- getCommands,
2858
- setModel: async (model) => {
2859
- if (!this.modelRegistry.hasConfiguredAuth(model))
2860
- return false;
2861
- await this.setModel(model);
2862
- return true;
2863
- },
2864
- getThinkingLevel: () => this.thinkingLevel,
2865
- setThinkingLevel: (level) => this.setThinkingLevel(level),
2866
- getExternalResourceRoots: () => this.settingsManager.getEffectiveExternalResourceRoots(),
2867
- registerMemoryProvider: (provider) => this.registerMemoryProvider(provider),
2868
- registerContextMemoryProvider: (provider) => this.registerContextMemoryProvider(provider),
2869
- reportSpawnedUsage: (usage, opts) => {
2870
- this.addSpawnedUsage(usage, opts);
2871
- },
2872
- reportManagedLane: (event) => {
2873
- this._backgroundLanes.recordManagedLane(event);
2874
- },
2875
- }, {
2876
- getModel: () => this.model,
2877
- isIdle: () => !this._foregroundRecovery.isBusy,
2878
- getSignal: () => this.agent.signal,
2879
- abort: () => {
2880
- if (this._extensionAbortHandler) {
2881
- this._extensionAbortHandler();
2882
- return;
2883
- }
2884
- void this.abort();
2885
- },
2886
- hasPendingMessages: () => this.pendingMessageCount > 0,
2887
- shutdown: () => {
2888
- this._extensionShutdownHandler?.();
2889
- },
2890
- getContextUsage: () => this.getContextUsage(),
2891
- compact: (options) => this.compactForExtension(options),
2892
- reload: () => {
2893
- if (this.isStreaming) {
2894
- return Promise.reject(new Error("ctx.reload() cannot run while the agent is streaming or a tool call is active. Wait for ctx.isIdle(), queue a follow-up /reload, or use an idle command/event handler so hot reload cannot destabilize the UI."));
2895
- }
2896
- if (this.isCompacting) {
2897
- return Promise.reject(new Error("ctx.reload() cannot run during context compaction or branch summarization. Let compaction finish before reloading so the session tree and UI remain stable."));
2898
- }
2899
- const actions = this._extensionCommandContextActions;
2900
- if (!actions) {
2901
- return this.reload();
2902
- }
2903
- return actions.reload();
2904
- },
2905
- getSystemPrompt: () => this.systemPrompt,
2906
- }, {
2907
- registerProvider: (name, config) => {
2908
- this._modelRegistry.registerProvider(name, config);
2909
- this._refreshCurrentModelFromRegistry();
2910
- },
2911
- unregisterProvider: (name) => {
2912
- this._modelRegistry.unregisterProvider(name);
2913
- this._refreshCurrentModelFromRegistry();
2914
- },
2915
- });
2916
- }
2917
2804
  /** Register a memory provider contributed by an extension; applied on the next memory (re)init. */
2918
2805
  registerMemoryProvider(provider) {
2919
2806
  this._memory.registerMemoryProvider(provider);