@caupulican/pi-adaptative 0.90.7 → 0.90.11

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 (207) hide show
  1. package/CHANGELOG.md +49 -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 +80 -196
  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/types.d.ts +2 -0
  85. package/dist/core/extensions/types.d.ts.map +1 -1
  86. package/dist/core/extensions/types.js.map +1 -1
  87. package/dist/core/foreground-terminal-handoff-controller.d.ts +9 -0
  88. package/dist/core/foreground-terminal-handoff-controller.d.ts.map +1 -1
  89. package/dist/core/foreground-terminal-handoff-controller.js +35 -9
  90. package/dist/core/foreground-terminal-handoff-controller.js.map +1 -1
  91. package/dist/core/goal-loop-controller.d.ts.map +1 -1
  92. package/dist/core/goal-loop-controller.js +10 -1
  93. package/dist/core/goal-loop-controller.js.map +1 -1
  94. package/dist/core/goals/compact-goal-context.d.ts +1 -1
  95. package/dist/core/goals/compact-goal-context.d.ts.map +1 -1
  96. package/dist/core/goals/compact-goal-context.js +2 -1
  97. package/dist/core/goals/compact-goal-context.js.map +1 -1
  98. package/dist/core/goals/goal-execution-errors.d.ts +18 -0
  99. package/dist/core/goals/goal-execution-errors.d.ts.map +1 -0
  100. package/dist/core/goals/goal-execution-errors.js +21 -0
  101. package/dist/core/goals/goal-execution-errors.js.map +1 -0
  102. package/dist/core/goals/goal-lifecycle.d.ts.map +1 -1
  103. package/dist/core/goals/goal-lifecycle.js +3 -3
  104. package/dist/core/goals/goal-lifecycle.js.map +1 -1
  105. package/dist/core/goals/goal-session-controller.d.ts +11 -0
  106. package/dist/core/goals/goal-session-controller.d.ts.map +1 -1
  107. package/dist/core/goals/goal-session-controller.js +74 -14
  108. package/dist/core/goals/goal-session-controller.js.map +1 -1
  109. package/dist/core/goals/goal-state.js +1 -1
  110. package/dist/core/goals/goal-state.js.map +1 -1
  111. package/dist/core/goals/goal-tool-core.d.ts.map +1 -1
  112. package/dist/core/goals/goal-tool-core.js +2 -2
  113. package/dist/core/goals/goal-tool-core.js.map +1 -1
  114. package/dist/core/goals/natural-language-goal.d.ts +18 -0
  115. package/dist/core/goals/natural-language-goal.d.ts.map +1 -1
  116. package/dist/core/goals/natural-language-goal.js +99 -16
  117. package/dist/core/goals/natural-language-goal.js.map +1 -1
  118. package/dist/core/model-registry.d.ts +5 -0
  119. package/dist/core/model-registry.d.ts.map +1 -1
  120. package/dist/core/model-registry.js +10 -0
  121. package/dist/core/model-registry.js.map +1 -1
  122. package/dist/core/model-resolver.d.ts.map +1 -1
  123. package/dist/core/model-resolver.js +3 -1
  124. package/dist/core/model-resolver.js.map +1 -1
  125. package/dist/core/orchestration/capability-gateway.d.ts +1 -1
  126. package/dist/core/orchestration/capability-gateway.d.ts.map +1 -1
  127. package/dist/core/orchestration/capability-gateway.js +4 -4
  128. package/dist/core/orchestration/capability-gateway.js.map +1 -1
  129. package/dist/core/orchestration/event-store.d.ts +8 -0
  130. package/dist/core/orchestration/event-store.d.ts.map +1 -1
  131. package/dist/core/orchestration/event-store.js +9 -7
  132. package/dist/core/orchestration/event-store.js.map +1 -1
  133. package/dist/core/orchestration/task-runtime-reducer.js +1 -1
  134. package/dist/core/orchestration/task-runtime-reducer.js.map +1 -1
  135. package/dist/core/orchestration/worker-model-pins.d.ts +7 -0
  136. package/dist/core/orchestration/worker-model-pins.d.ts.map +1 -1
  137. package/dist/core/orchestration/worker-model-pins.js +17 -1
  138. package/dist/core/orchestration/worker-model-pins.js.map +1 -1
  139. package/dist/core/provider-request-runtime-controller.d.ts +9 -0
  140. package/dist/core/provider-request-runtime-controller.d.ts.map +1 -1
  141. package/dist/core/provider-request-runtime-controller.js +17 -3
  142. package/dist/core/provider-request-runtime-controller.js.map +1 -1
  143. package/dist/core/provider-tool-text.d.ts +15 -1
  144. package/dist/core/provider-tool-text.d.ts.map +1 -1
  145. package/dist/core/provider-tool-text.js +42 -10
  146. package/dist/core/provider-tool-text.js.map +1 -1
  147. package/dist/core/research/research-lane-controller.d.ts +1 -1
  148. package/dist/core/research/research-lane-controller.d.ts.map +1 -1
  149. package/dist/core/research/research-lane-controller.js +2 -1
  150. package/dist/core/research/research-lane-controller.js.map +1 -1
  151. package/dist/core/resource-loader.d.ts +3 -0
  152. package/dist/core/resource-loader.d.ts.map +1 -1
  153. package/dist/core/resource-loader.js +8 -0
  154. package/dist/core/resource-loader.js.map +1 -1
  155. package/dist/core/runtime-builder.d.ts +8 -0
  156. package/dist/core/runtime-builder.d.ts.map +1 -1
  157. package/dist/core/runtime-builder.js +6 -0
  158. package/dist/core/runtime-builder.js.map +1 -1
  159. package/dist/core/session-supervision-runtime.d.ts.map +1 -1
  160. package/dist/core/session-supervision-runtime.js +2 -1
  161. package/dist/core/session-supervision-runtime.js.map +1 -1
  162. package/dist/core/settings-manager.d.ts +2 -2
  163. package/dist/core/settings-manager.d.ts.map +1 -1
  164. package/dist/core/settings-manager.js +7 -2
  165. package/dist/core/settings-manager.js.map +1 -1
  166. package/dist/core/tools/delegate.d.ts +13 -0
  167. package/dist/core/tools/delegate.d.ts.map +1 -1
  168. package/dist/core/tools/delegate.js +20 -18
  169. package/dist/core/tools/delegate.js.map +1 -1
  170. package/dist/core/util/atomic-file.d.ts +7 -0
  171. package/dist/core/util/atomic-file.d.ts.map +1 -1
  172. package/dist/core/util/atomic-file.js +8 -6
  173. package/dist/core/util/atomic-file.js.map +1 -1
  174. package/dist/core/util/faultable-fs.d.ts +30 -0
  175. package/dist/core/util/faultable-fs.d.ts.map +1 -0
  176. package/dist/core/util/faultable-fs.js +30 -0
  177. package/dist/core/util/faultable-fs.js.map +1 -0
  178. package/dist/modes/interactive/auth-dialogs-controller.d.ts.map +1 -1
  179. package/dist/modes/interactive/auth-dialogs-controller.js +1 -0
  180. package/dist/modes/interactive/auth-dialogs-controller.js.map +1 -1
  181. package/dist/modes/interactive/components/activity-lane.d.ts.map +1 -1
  182. package/dist/modes/interactive/components/activity-lane.js +4 -3
  183. package/dist/modes/interactive/components/activity-lane.js.map +1 -1
  184. package/dist/modes/interactive/components/footer.js +1 -1
  185. package/dist/modes/interactive/components/footer.js.map +1 -1
  186. package/dist/modes/interactive/components/oauth-selector.d.ts +2 -0
  187. package/dist/modes/interactive/components/oauth-selector.d.ts.map +1 -1
  188. package/dist/modes/interactive/components/oauth-selector.js +3 -2
  189. package/dist/modes/interactive/components/oauth-selector.js.map +1 -1
  190. package/dist/modes/interactive/report-commands.js +1 -1
  191. package/dist/modes/interactive/report-commands.js.map +1 -1
  192. package/dist/modes/interactive/session-flow-commands.d.ts +1 -1
  193. package/dist/modes/interactive/session-flow-commands.d.ts.map +1 -1
  194. package/dist/modes/interactive/session-flow-commands.js +3 -2
  195. package/dist/modes/interactive/session-flow-commands.js.map +1 -1
  196. package/docs/providers.md +3 -0
  197. package/docs/settings.md +4 -2
  198. package/docs/tool-repair.md +1 -0
  199. package/examples/extensions/custom-provider-anthropic/package-lock.json +2 -2
  200. package/examples/extensions/custom-provider-anthropic/package.json +1 -1
  201. package/examples/extensions/custom-provider-gitlab-duo/package.json +1 -1
  202. package/examples/extensions/sandbox/package-lock.json +2 -2
  203. package/examples/extensions/sandbox/package.json +1 -1
  204. package/examples/extensions/with-deps/package-lock.json +2 -2
  205. package/examples/extensions/with-deps/package.json +1 -1
  206. package/npm-shrinkwrap.json +12 -12
  207. package/package.json +9 -4
@@ -1,6 +1,6 @@
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";
@@ -22,8 +22,9 @@ import { CompactionSupport } from "./compaction-support.js";
22
22
  import { buildContextCompositionReport, formatContextCompositionDashboard, } from "./context/context-composition.js";
23
23
  import { ContextPipeline } from "./context-pipeline.js";
24
24
  import { downgradeReasoning, estimateTurnCostUsd, evaluateCostGuard } from "./cost-guard.js";
25
- import { appendWorkerClaimSnapshot, getWorkerClaimSnapshots } from "./delegation/session-worker-claim.js";
25
+ import { appendWorkerClaimSnapshot, getLatestWorkerClaimSnapshot, getWorkerClaimSnapshots, } from "./delegation/session-worker-claim.js";
26
26
  import { DurableCustomMessageTurnController } from "./durable-custom-message-turn-controller.js";
27
+ import { ExtensionBindingController } from "./extension-binding-controller.js";
27
28
  import { FailureCorpusRecorder } from "./failure-corpus.js";
28
29
  import { ForegroundRecoveryController } from "./foreground-recovery-controller.js";
29
30
  import { ForegroundTerminalHandoffController } from "./foreground-terminal-handoff-controller.js";
@@ -116,6 +117,8 @@ export class AgentSession {
116
117
  this._pendingNextTurnMessages = [];
117
118
  this._streamingPromptSubmissionTail = Promise.resolve();
118
119
  this._unboundToolGrantWarnings = [];
120
+ /** Delegate provider-prompt-guideline bounding diagnostics (root-session delegate tool only). */
121
+ this._delegatePromptGuidelineWarnings = [];
119
122
  this._branchSummaryAbortController = undefined;
120
123
  this._turnIndex = 0;
121
124
  /** Per-agent persistent shell session identity: stable across runtime reloads, disposed with the session. */
@@ -231,7 +234,7 @@ export class AgentSession {
231
234
  if (messagePersisted) {
232
235
  this._pipeline.observeProviderUsage(this.agent.state.messages, assistantMsg);
233
236
  }
234
- if (assistantMsg.errorMessage?.startsWith("native_tool_protocol_residue:")) {
237
+ if (assistantMsg.errorMessage?.startsWith(`${NATIVE_TOOL_PROTOCOL_RESIDUE_ERROR}:`)) {
235
238
  this._goals.markProtocolFailureBlocked(assistantMsg.errorMessage);
236
239
  }
237
240
  this._foregroundRecovery.observeAssistant(assistantMsg);
@@ -561,6 +564,7 @@ export class AgentSession {
561
564
  compaction: this._compaction,
562
565
  context: providerRequestContext,
563
566
  admitGoalRequest: () => this._goals.admitProviderRequest(),
567
+ shouldStopGoalExecutionAfterTurn: () => this._goals.hasExecutionLeaseCrossedBudgetLimit(),
564
568
  });
565
569
  this._toolRecoveryLogger = new ToolRecoveryLogger({
566
570
  enabled: toolRepairSettings.logging,
@@ -595,6 +599,7 @@ export class AgentSession {
595
599
  isDisposed: () => this._disposed,
596
600
  getGoalStateSnapshot: () => this.getGoalStateSnapshot(),
597
601
  workerInputsWillWakeParent: (workerRequestIds) => this._humanInput.workerInputsWillWakeParent(workerRequestIds),
602
+ getWorkerClaimSnapshot: (laneId) => getLatestWorkerClaimSnapshot(getActiveSessionBranchEntries(this.sessionManager), laneId),
598
603
  startCustomMessageTurn: (message, lease, goalId) => this._durableCustomMessageTurns.start(message, lease, goalId),
599
604
  sendCustomMessage: (message, options, lease) => this._sendCustomMessage(message, options, lease),
600
605
  warn: (message) => this._emit({ type: "warning", message }),
@@ -708,15 +713,18 @@ export class AgentSession {
708
713
  this._unboundToolGrantWarnings = warnings;
709
714
  },
710
715
  getUnboundToolGrantWarnings: () => this._unboundToolGrantWarnings,
716
+ setDelegatePromptGuidelineWarnings: (warnings) => {
717
+ this._delegatePromptGuidelineWarnings = warnings;
718
+ },
711
719
  createProfileFilterReloadSnapshot: () => this._profileFilter.createReloadSnapshot(),
712
720
  restoreProfileFilterReloadSnapshot: (snapshot) => this._profileFilter.restoreReloadSnapshot(snapshot),
713
721
  getActiveToolNames: () => this.getActiveToolNames(),
714
722
  setActiveToolsByName: (toolNames) => this.setActiveToolsByName(toolNames),
715
723
  normalizePromptSnippet: (text) => this._normalizePromptSnippet(text),
716
724
  normalizePromptGuidelines: (guidelines) => this._normalizePromptGuidelines(guidelines),
717
- bindExtensionCore: (runner) => this._bindExtensionCore(runner),
718
- applyExtensionBindings: (runner) => this._applyExtensionBindings(runner),
719
- extendResourcesFromExtensions: (reason) => this.extendResourcesFromExtensions(reason),
725
+ bindExtensionCore: (runner) => this._extensionBinding.bindExtensionCore(runner),
726
+ applyExtensionBindings: (runner) => this._extensionBinding.applyExtensionBindings(runner),
727
+ extendResourcesFromExtensions: (reason) => this._extensionBinding.extendResourcesFromExtensions(reason),
720
728
  reapplyActiveProfileModelSettings: () => this._profileFilter.reapplyActiveProfileModelSettings(),
721
729
  notifyExtensionsChanged: () => this._notifyExtensionsChanged(),
722
730
  getToolArtifactStore: () => this._getToolArtifactStore(),
@@ -759,6 +767,67 @@ export class AgentSession {
759
767
  this._localRuntimeController.reconcile(this._collectEligibleLocalModelsForReconcile());
760
768
  },
761
769
  });
770
+ this._extensionBinding = new ExtensionBindingController({
771
+ getAgent: () => this.agent,
772
+ getExtensionRunner: () => this._extensionRunner,
773
+ getSessionStartEvent: () => this._sessionStartEvent,
774
+ getCwd: () => this._cwd,
775
+ getResourceLoader: () => this._resourceLoader,
776
+ getSessionManager: () => this.sessionManager,
777
+ getSettingsManager: () => this.settingsManager,
778
+ getModelRegistry: () => this._modelRegistry,
779
+ getModel: () => this.model,
780
+ getActiveToolNames: () => this.getActiveToolNames(),
781
+ getAllTools: () => this.getAllTools(),
782
+ setActiveToolsByName: (toolNames) => this.setActiveToolsByName(toolNames),
783
+ refreshToolRegistry: () => this._refreshToolRegistry(),
784
+ rebuildSystemPrompt: (toolNames) => this._rebuildSystemPrompt(toolNames),
785
+ setBaseSystemPrompt: (prompt) => {
786
+ this._baseSystemPrompt = prompt;
787
+ },
788
+ getPromptTemplates: () => this.promptTemplates,
789
+ getThinkingLevel: () => this.thinkingLevel,
790
+ setThinkingLevel: (level) => this.setThinkingLevel(level),
791
+ setModel: (model) => this.setModel(model),
792
+ sendCustomMessage: (message, options) => this.sendCustomMessage(message, options),
793
+ sendUserMessage: (content, options) => this.sendUserMessage(content, options),
794
+ setSessionName: (name) => this.setSessionName(name),
795
+ registerMemoryProvider: (provider) => this.registerMemoryProvider(provider),
796
+ registerContextMemoryProvider: (provider) => this.registerContextMemoryProvider(provider),
797
+ addSpawnedUsage: (usage, opts) => this.addSpawnedUsage(usage, opts),
798
+ recordManagedLane: (event) => this._backgroundLanes.recordManagedLane(event),
799
+ isForegroundBusy: () => this._foregroundRecovery.isBusy,
800
+ getPendingMessageCount: () => this.pendingMessageCount,
801
+ isStreaming: () => this.isStreaming,
802
+ isCompacting: () => this.isCompacting,
803
+ getContextUsage: () => this.getContextUsage(),
804
+ compactForExtension: (options) => this.compactForExtension(options),
805
+ reload: () => this.reload(),
806
+ abort: () => this.abort(),
807
+ getSystemPrompt: () => this.systemPrompt,
808
+ getExtensionCommandContextActions: () => this._extensionCommandContextActions,
809
+ refreshCurrentModelFromRegistry: () => this._refreshCurrentModelFromRegistry(),
810
+ initializeMemory: () => this._memory.initialize(),
811
+ getExtensionUIContext: () => this._extensionUIContext,
812
+ setExtensionUIContext: (uiContext) => {
813
+ this._extensionUIContext = uiContext;
814
+ },
815
+ getExtensionMode: () => this._extensionMode,
816
+ setExtensionMode: (mode) => {
817
+ this._extensionMode = mode;
818
+ },
819
+ setExtensionCommandContextActions: (actions) => {
820
+ this._extensionCommandContextActions = actions;
821
+ },
822
+ getExtensionShutdownHandler: () => this._extensionShutdownHandler,
823
+ setExtensionShutdownHandler: (handler) => {
824
+ this._extensionShutdownHandler = handler;
825
+ },
826
+ getExtensionErrorListener: () => this._extensionErrorListener,
827
+ setExtensionErrorListener: (listener) => {
828
+ this._extensionErrorListener = listener;
829
+ },
830
+ });
762
831
  this._analytics = new SessionAnalytics({
763
832
  getState: () => this.state,
764
833
  getMessages: () => this.messages,
@@ -1276,6 +1345,7 @@ export class AgentSession {
1276
1345
  ...this._profileFilter.profileDeniedResourceObservations(),
1277
1346
  ...this._profileFilter.getInertExtensionWarnings(),
1278
1347
  ...this._unboundToolGrantWarnings,
1348
+ ...this._delegatePromptGuidelineWarnings,
1279
1349
  // Auto-built per-turn foreground envelope (observe-only; not enforced). Falls back to a
1280
1350
  // live preview when no turn has run yet so /context always shows the current scope.
1281
1351
  formatForegroundEnvelopeObservation(this._currentForegroundEnvelope ?? this._buildForegroundEnvelopeFromState()),
@@ -1684,6 +1754,7 @@ export class AgentSession {
1684
1754
  this.agent.subscribeToolCallHandoffRequest = undefined;
1685
1755
  });
1686
1756
  safely(() => this._extensionRunner.invalidate());
1757
+ track(() => this._resourceLoader.dispose?.() ?? Promise.resolve());
1687
1758
  safely(() => this._disconnectFromAgent());
1688
1759
  this._eventListeners = [];
1689
1760
  // Let an aborted in-flight reflection reach its terminal state, then flush session-owned write
@@ -2712,79 +2783,9 @@ export class AgentSession {
2712
2783
  get autoCompactionEnabled() {
2713
2784
  return this.settingsManager.getCompactionEnabled();
2714
2785
  }
2786
+ /** Public entry point delegating to {@link ExtensionBindingController.bindExtensions}. */
2715
2787
  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;
2788
+ return this._extensionBinding.bindExtensions(bindings);
2788
2789
  }
2789
2790
  _refreshCurrentModelFromRegistry() {
2790
2791
  const currentModel = this.model;
@@ -2797,123 +2798,6 @@ export class AgentSession {
2797
2798
  }
2798
2799
  this.agent.state.model = refreshedModel;
2799
2800
  }
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
2801
  /** Register a memory provider contributed by an extension; applied on the next memory (re)init. */
2918
2802
  registerMemoryProvider(provider) {
2919
2803
  this._memory.registerMemoryProvider(provider);