@openeryc/pi-coding-agent 0.75.29 → 0.75.30

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 (48) hide show
  1. package/CHANGELOG.md +11 -0
  2. package/dist/core/agent-session.d.ts +1 -0
  3. package/dist/core/agent-session.d.ts.map +1 -1
  4. package/dist/core/agent-session.js +22 -2
  5. package/dist/core/agent-session.js.map +1 -1
  6. package/dist/core/hook-runner.d.ts +23 -0
  7. package/dist/core/hook-runner.d.ts.map +1 -0
  8. package/dist/core/hook-runner.js +116 -0
  9. package/dist/core/hook-runner.js.map +1 -0
  10. package/dist/core/mcp/client.d.ts +22 -12
  11. package/dist/core/mcp/client.d.ts.map +1 -1
  12. package/dist/core/mcp/client.js +206 -108
  13. package/dist/core/mcp/client.js.map +1 -1
  14. package/dist/core/mcp/index.d.ts +2 -3
  15. package/dist/core/mcp/index.d.ts.map +1 -1
  16. package/dist/core/mcp/index.js.map +1 -1
  17. package/dist/core/mcp/manager.d.ts +6 -9
  18. package/dist/core/mcp/manager.d.ts.map +1 -1
  19. package/dist/core/mcp/manager.js +95 -103
  20. package/dist/core/mcp/manager.js.map +1 -1
  21. package/dist/core/mcp/types.d.ts +30 -67
  22. package/dist/core/mcp/types.d.ts.map +1 -1
  23. package/dist/core/mcp/types.js +0 -6
  24. package/dist/core/mcp/types.js.map +1 -1
  25. package/dist/core/settings-manager.d.ts +8 -2
  26. package/dist/core/settings-manager.d.ts.map +1 -1
  27. package/dist/core/settings-manager.js.map +1 -1
  28. package/dist/core/tools/ask-user-question.d.ts +21 -0
  29. package/dist/core/tools/ask-user-question.d.ts.map +1 -0
  30. package/dist/core/tools/ask-user-question.js +75 -0
  31. package/dist/core/tools/ask-user-question.js.map +1 -0
  32. package/dist/core/tools/index.d.ts +2 -1
  33. package/dist/core/tools/index.d.ts.map +1 -1
  34. package/dist/core/tools/index.js +9 -0
  35. package/dist/core/tools/index.js.map +1 -1
  36. package/examples/extensions/custom-provider-anthropic/package-lock.json +2 -2
  37. package/examples/extensions/custom-provider-anthropic/package.json +1 -1
  38. package/examples/extensions/custom-provider-gitlab-duo/package.json +1 -1
  39. package/examples/extensions/sandbox/package-lock.json +2 -2
  40. package/examples/extensions/sandbox/package.json +1 -1
  41. package/examples/extensions/with-deps/package-lock.json +2 -2
  42. package/examples/extensions/with-deps/package.json +1 -1
  43. package/npm-shrinkwrap.json +12 -12
  44. package/package.json +4 -4
  45. package/dist/core/index.d.ts +0 -12
  46. package/dist/core/index.d.ts.map +0 -1
  47. package/dist/core/index.js +0 -12
  48. package/dist/core/index.js.map +0 -1
@@ -26,6 +26,7 @@ import { exportSessionToHtml } from "./export-html/index.js";
26
26
  import { createToolHtmlRenderer } from "./export-html/tool-renderer.js";
27
27
  import { ExtensionRunner, wrapRegisteredTools, } from "./extensions/index.js";
28
28
  import { emitSessionShutdownEvent } from "./extensions/runner.js";
29
+ import { HookRunner } from "./hook-runner.js";
29
30
  import { MCPManager } from "./mcp/index.js";
30
31
  import { expandPromptTemplate } from "./prompt-templates.js";
31
32
  import { CURRENT_SESSION_VERSION, getLatestCompactionEntry, SessionManager as SessionManagerCtor, } from "./session-manager.js";
@@ -103,6 +104,8 @@ export class AgentSession {
103
104
  _extensionErrorUnsubscriber;
104
105
  // MCP client management
105
106
  _mcpManager = null;
107
+ // Hooks system
108
+ _hookRunner = null;
106
109
  // Model registry for API key resolution
107
110
  _modelRegistry;
108
111
  // Tool registry for extension getTools/setTools
@@ -130,6 +133,7 @@ export class AgentSession {
130
133
  // Always subscribe to agent events for internal handling
131
134
  // (session persistence, extensions, auto-compaction, retry logic)
132
135
  this._unsubscribeAgent = this.agent.subscribe(this._handleAgentEvent);
136
+ this._hookRunner = new HookRunner(this.settingsManager);
133
137
  this._installAgentToolHooks();
134
138
  this._buildRuntime({
135
139
  activeToolNames: this._initialActiveToolNames,
@@ -175,7 +179,14 @@ export class AgentSession {
175
179
  * happens here instead of in wrappers.
176
180
  */
177
181
  _installAgentToolHooks() {
182
+ const hookRunner = this._hookRunner;
178
183
  this.agent.beforeToolCall = async ({ toolCall, args }) => {
184
+ if (hookRunner) {
185
+ const hookResult = await hookRunner.runPreToolHooks(toolCall.name, args);
186
+ if (hookResult?.behavior === "deny") {
187
+ throw new Error(hookResult.message ?? `Blocked by hook: ${toolCall.name}`);
188
+ }
189
+ }
179
190
  const runner = this._extensionRunner;
180
191
  if (!runner.hasHandlers("tool_call")) {
181
192
  return undefined;
@@ -196,6 +207,15 @@ export class AgentSession {
196
207
  }
197
208
  };
198
209
  this.agent.afterToolCall = async ({ toolCall, args, result, isError }) => {
210
+ if (this._hookRunner) {
211
+ const postHookResult = await this._hookRunner.runPostToolHooks(toolCall.name, result.content.map((c) => c.text ?? "").join("\n"));
212
+ if (postHookResult?.additionalContext) {
213
+ result = {
214
+ ...result,
215
+ content: [...result.content, { type: "text", text: postHookResult.additionalContext }],
216
+ };
217
+ }
218
+ }
199
219
  const runner = this._extensionRunner;
200
220
  if (!runner.hasHandlers("tool_result")) {
201
221
  return undefined;
@@ -1651,8 +1671,8 @@ export class AgentSession {
1651
1671
  await this._mcpManager.stop();
1652
1672
  this._mcpManager = null;
1653
1673
  }
1654
- this._mcpManager = new MCPManager(mcpServers);
1655
- await this._mcpManager.start();
1674
+ this._mcpManager = new MCPManager();
1675
+ await this._mcpManager.start(mcpServers);
1656
1676
  const mcpTools = this._mcpManager.getToolDefinitions();
1657
1677
  if (mcpTools.length > 0) {
1658
1678
  this._customTools.push(...mcpTools);