mirror of
https://github.com/getcompanion-ai/co-mono.git
synced 2026-04-17 08:00:59 +00:00
WP8: Add AgentSession bash execution
This commit is contained in:
parent
8d6d2dd72b
commit
94ff0b0962
3 changed files with 75 additions and 3 deletions
|
|
@ -888,8 +888,8 @@ get isBashRunning(): boolean {
|
||||||
**Verification:**
|
**Verification:**
|
||||||
1. `npm run check` passes
|
1. `npm run check` passes
|
||||||
|
|
||||||
- [ ] Add bash execution methods using bash-executor module
|
- [x] Add bash execution methods using bash-executor module
|
||||||
- [ ] Verify with `npm run check`
|
- [x] Verify with `npm run check`
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -17,10 +17,12 @@ import type { Agent, AgentEvent, AgentState, AppMessage, Attachment, ThinkingLev
|
||||||
import type { AssistantMessage, Model } from "@mariozechner/pi-ai";
|
import type { AssistantMessage, Model } from "@mariozechner/pi-ai";
|
||||||
import { calculateContextTokens, compact, shouldCompact } from "../compaction.js";
|
import { calculateContextTokens, compact, shouldCompact } from "../compaction.js";
|
||||||
import { getModelsPath } from "../config.js";
|
import { getModelsPath } from "../config.js";
|
||||||
|
import type { BashExecutionMessage } from "../messages.js";
|
||||||
import { getApiKeyForModel, getAvailableModels } from "../model-config.js";
|
import { getApiKeyForModel, getAvailableModels } from "../model-config.js";
|
||||||
import { loadSessionFromEntries, type SessionManager } from "../session-manager.js";
|
import { loadSessionFromEntries, type SessionManager } from "../session-manager.js";
|
||||||
import type { SettingsManager } from "../settings-manager.js";
|
import type { SettingsManager } from "../settings-manager.js";
|
||||||
import { expandSlashCommand, type FileSlashCommand } from "../slash-commands.js";
|
import { expandSlashCommand, type FileSlashCommand } from "../slash-commands.js";
|
||||||
|
import { type BashResult, executeBash as executeBashCommand } from "./bash-executor.js";
|
||||||
|
|
||||||
/** Listener function for agent events */
|
/** Listener function for agent events */
|
||||||
export type AgentEventListener = (event: AgentEvent) => void;
|
export type AgentEventListener = (event: AgentEvent) => void;
|
||||||
|
|
@ -83,6 +85,9 @@ export class AgentSession {
|
||||||
// Compaction state
|
// Compaction state
|
||||||
private _compactionAbortController: AbortController | null = null;
|
private _compactionAbortController: AbortController | null = null;
|
||||||
|
|
||||||
|
// Bash execution state
|
||||||
|
private _bashAbortController: AbortController | null = null;
|
||||||
|
|
||||||
constructor(config: AgentSessionConfig) {
|
constructor(config: AgentSessionConfig) {
|
||||||
this.agent = config.agent;
|
this.agent = config.agent;
|
||||||
this.sessionManager = config.sessionManager;
|
this.sessionManager = config.sessionManager;
|
||||||
|
|
@ -616,4 +621,64 @@ export class AgentSession {
|
||||||
get autoCompactionEnabled(): boolean {
|
get autoCompactionEnabled(): boolean {
|
||||||
return this.settingsManager.getCompactionEnabled();
|
return this.settingsManager.getCompactionEnabled();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// =========================================================================
|
||||||
|
// Bash Execution
|
||||||
|
// =========================================================================
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Execute a bash command.
|
||||||
|
* Adds result to agent context and session.
|
||||||
|
* @param command The bash command to execute
|
||||||
|
* @param onChunk Optional streaming callback for output
|
||||||
|
*/
|
||||||
|
async executeBash(command: string, onChunk?: (chunk: string) => void): Promise<BashResult> {
|
||||||
|
this._bashAbortController = new AbortController();
|
||||||
|
|
||||||
|
try {
|
||||||
|
const result = await executeBashCommand(command, {
|
||||||
|
onChunk,
|
||||||
|
signal: this._bashAbortController.signal,
|
||||||
|
});
|
||||||
|
|
||||||
|
// Create and save message
|
||||||
|
const bashMessage: BashExecutionMessage = {
|
||||||
|
role: "bashExecution",
|
||||||
|
command,
|
||||||
|
output: result.output,
|
||||||
|
exitCode: result.exitCode,
|
||||||
|
cancelled: result.cancelled,
|
||||||
|
truncated: result.truncated,
|
||||||
|
fullOutputPath: result.fullOutputPath,
|
||||||
|
timestamp: Date.now(),
|
||||||
|
};
|
||||||
|
|
||||||
|
// Add to agent state
|
||||||
|
this.agent.appendMessage(bashMessage);
|
||||||
|
|
||||||
|
// Save to session
|
||||||
|
this.sessionManager.saveMessage(bashMessage);
|
||||||
|
|
||||||
|
// Initialize session if needed
|
||||||
|
if (this.sessionManager.shouldInitializeSession(this.agent.state.messages)) {
|
||||||
|
this.sessionManager.startSession(this.agent.state);
|
||||||
|
}
|
||||||
|
|
||||||
|
return result;
|
||||||
|
} finally {
|
||||||
|
this._bashAbortController = null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Cancel running bash command.
|
||||||
|
*/
|
||||||
|
abortBash(): void {
|
||||||
|
this._bashAbortController?.abort();
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Whether a bash command is currently running */
|
||||||
|
get isBashRunning(): boolean {
|
||||||
|
return this._bashAbortController !== null;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -2,5 +2,12 @@
|
||||||
* Core modules shared between all run modes.
|
* Core modules shared between all run modes.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
export { AgentSession, type AgentSessionConfig } from "./agent-session.js";
|
export {
|
||||||
|
type AgentEventListener,
|
||||||
|
AgentSession,
|
||||||
|
type AgentSessionConfig,
|
||||||
|
type CompactionResult,
|
||||||
|
type ModelCycleResult,
|
||||||
|
type PromptOptions,
|
||||||
|
} from "./agent-session.js";
|
||||||
export { type BashExecutorOptions, type BashResult, executeBash } from "./bash-executor.js";
|
export { type BashExecutorOptions, type BashResult, executeBash } from "./bash-executor.js";
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue