```                   # 📋 Session Report
    λλ              
   λ⊙λ⊙             
  λλλλλλ            
 λλλλλλλλ           
    λλ              
    λλ              
    λλ              
    λλ              
    λλ              
    λλ              
    λλ              
    λλ              
```                 

**🔑 Session ID:** 36dca05b-6307-4c18-acbd-681cbab8edf9

---

## 📊 Statistics

### Turn Counts

| Metric | Value |
|--------|-------|
| Total Turns | 92 |
| 👤 User Turns | 46 |
| 🤖 LLM Turns | 46 |

### 🔧 Tool Calls

**Total Tool Calls:** 52

`bash_read-file      `   22 ████████████████████████████████████████████████████████████

`bash_write-file     `   19 ███████████████████████████████████████████████████

`bash_check-code     `    6 ████████████████

`bash_grep-files     `    3 ████████

`bash_list-files     `    2 █████


### 💾 Byte Usage

`Input     `    608 KiB ████████████████████████████████████████████████████████████

`Output    `      4 KiB 

`Reasoning `      7 KiB 
**Total:** 620 KiB

---

## 👤 Step 1: User Turn

### 📝 System Prompt

```
You are an expert Haskell and Bash programmer specialized in writing clean, idiomatic, and efficient Haskell code.
When writing Bash code:
- Avoid bash-specific logic but bash-ism are fine.
- Document required shell tools at the top of the bash script.
When writing Haskell code:
- Use modern Haskell practices (base >= 4.14)
- Prefer pure functions and explicit type signatures
- Use standard libraries when appropriate
- Add clear comments for complex logic
- Follow consistent formatting
Use list-files to explore the project structure, read-file to understand existing code, write-file to create or modify files, and check-code to verify your work.
Always compile code before considering the job done.
Your output format may be stored as commit message: hence the first line of your last message should be a summary line.
```

### 💬 User Query

# Support multiple tool directories per agent definition

Today an Agent definition will have one tool directory.
We should be able to load tools from multiple directories.

Keep the old `tools` key but make it optional.
Add a new key "bashToolboxes" with a list of bash tool sources much like we can instantiate multiple SQLite or multiple OpenAPI toolboxes, one source being `FileSystemDirectory` with a path and a basename filter. We could also have SingleTool to add a path to a single executable.

---
From #311



### 🛠️ Available Tools

- **bash_grep-files** (`bash_grep-files`)
  - Description: Search for a pattern in files using 'git grep'
- **bash_read-file** (`bash_read-file`)
  - Description: Read the contents of a file
- **bash_write-file** (`bash_write-file`)
  - Description: Write content to a file
- **bash_check-code** (`bash_check-code`)
  - Description: Check Haskell code by compiling or testing
- **bash_list-files** (`bash_list-files`)
  - Description: List all files in the project

---

## 🤖 Step 2: LLM Turn

### 💭 Thinking Process

<details>
<summary>Click to expand reasoning</summary>

Let me start by exploring the project structure to understand the codebase and find the relevant files for this feature request.
</details>

### 💬 Response



### 🔧 Tool Calls

- **bash_list-files**

---

## 👤 Step 3: User Turn



---

## 🤖 Step 4: LLM Turn

### 💭 Thinking Process

<details>
<summary>Click to expand reasoning</summary>

This is a Haskell project. Let me explore the key files to understand the agent definition and tool loading structure. I should look at:
1. The Base module to see agent types
2. FileLoader module to see how agents are loaded
3. BashToolbox module to understand how bash tools are loaded
4. Any existing tool sources like SQLite or OpenAPI to understand the pattern

Let me start by reading the Base module and FileLoader.
</details>

### 💬 Response



### 🔧 Tool Calls

- **bash_read-file**

- **bash_read-file**

- **bash_read-file**

---

## 👤 Step 5: User Turn



---

## 🤖 Step 6: LLM Turn

### 💭 Thinking Process

<details>
<summary>Click to expand reasoning</summary>

Now I have a good understanding of the structure. Let me also look at:

1. The SqliteToolbox module to see how multiple SQLite toolboxes are handled
2. The Tools.Base or similar to see how tools are loaded
3. Let me also look at how the runtime loads tools

The key changes I need to make are:
1. Add a new type `BashToolboxDescription` with variants like `FileSystemDirectory` and `SingleTool`
2. Add a new field `bashToolboxes :: Maybe [BashToolboxDescription]` to the `Agent` type
3. Make the `toolDirectory` field optional (it's currently required)
4. Update the tool loading code to handle multiple bash toolboxes

Let me look at the BashTools module to understand how tools are loaded.
</details>

### 💬 Response



### 🔧 Tool Calls

- **bash_read-file**

- **bash_read-file**

- **bash_read-file**

---

## 👤 Step 7: User Turn



---

## 🤖 Step 8: LLM Turn

### 💭 Thinking Process

<details>
<summary>Click to expand reasoning</summary>

Let me look at the Runtime.Runtime module to understand how toolboxes are initialized:
</details>

### 💬 Response



### 🔧 Tool Calls

- **bash_read-file**

- **bash_read-file**

---

## 👤 Step 9: User Turn



---

## 🤖 Step 10: LLM Turn

### 💭 Thinking Process

<details>
<summary>Click to expand reasoning</summary>

Now I have a good understanding of the codebase. Let me now look at how agents are loaded and used, especially where the `toolDirectory` field is accessed. I need to find the Session module and see how tools are initialized.
</details>

### 💬 Response



### 🔧 Tool Calls

- **bash_read-file**

- **bash_grep-files**

---

## 👤 Step 11: User Turn



---

## 🤖 Step 12: LLM Turn

### 💭 Thinking Process

<details>
<summary>Click to expand reasoning</summary>

Now I have a good understanding of where `toolDirectory` is used. Let me also look at the CLI/OneShot to understand how the runtime is created:
</details>

### 💬 Response

Let me look at where the runtime is created and how tools are loaded:

### 🔧 Tool Calls

- **bash_read-file**

- **bash_read-file**

---

## 👤 Step 13: User Turn



---

## 🤖 Step 14: LLM Turn

### 💭 Thinking Process

<details>
<summary>Click to expand reasoning</summary>

Now I have a comprehensive understanding of the codebase. Let me outline what changes need to be made:

1. **Add new types for bash toolbox descriptions** in `Base.hs`:
   - `BashToolSource` type with variants like `FileSystemDirectory` and `SingleTool`
   - `BashToolboxDescription` wrapper type with tag-based JSON serialization

2. **Update the `Agent` type** in `Base.hs`:
   - Make `toolDirectory` field optional (change from `FilePath` to `Maybe FilePath`)
   - Add new `bashToolboxes :: Maybe [BashToolboxDescription]` field

3. **Update the runtime initialization** in `Runtime/Runtime.hs`:
   - Modify `newRuntime` to accept multiple bash toolbox sources
   - Create a new type for handling multiple bash toolboxes

4. **Update `AgentTree.hs`**:
   - Handle the optional `toolDirectory` in agent discovery
   - Load multiple bash toolboxes when present

5. **Update `BashToolbox.hs`**:
   - Add support for loading tools from multiple sources

6. **Update tests and documentation**

Let me start implementing these changes. I'll begin with the `Base.hs` file.
</details>

### 💬 Response

Now I have a clear understanding of the codebase. Let me implement the changes to support multiple tool directories per agent definition.

## Implementation Plan:
1. Add `BashToolboxDescription` types to `Base.hs` with `FileSystemDirectory` and `SingleTool` variants
2. Make `toolDirectory` optional and add `bashToolboxes` field to `Agent`
3. Update `Runtime/Runtime.hs` to handle multiple bash toolbox sources
4. Update `AgentTree.hs` to load multiple bash toolboxes

Let's start:

### 🔧 Tool Calls

- **bash_write-file**

---

## 👤 Step 15: User Turn



---

## 🤖 Step 16: LLM Turn

### 💭 Thinking Process

<details>
<summary>Click to expand reasoning</summary>

Now I need to update the BashToolbox module to support loading from multiple sources and add filtering support. Then update Runtime and AgentTree.
</details>

### 💬 Response

Now let's update the `BashToolbox` module to support loading from multiple sources:

### 🔧 Tool Calls

- **bash_write-file**

---

## 👤 Step 17: User Turn



---

## 🤖 Step 18: LLM Turn

### 💭 Thinking Process

<details>
<summary>Click to expand reasoning</summary>

Now let's update the Runtime module to handle the new multi-source toolbox configuration:
</details>

### 💬 Response

Now let's update the Runtime module to handle the new configuration:

### 🔧 Tool Calls

- **bash_write-file**

---

## 👤 Step 19: User Turn



---

## 🤖 Step 20: LLM Turn

### 💭 Thinking Process

<details>
<summary>Click to expand reasoning</summary>

Now I need to update the AgentTree module to handle the new configuration format. This is the most complex change as it needs to:
1. Handle the optional `toolDirectory` field
2. Handle the new `bashToolboxes` field
3. Combine both sources if present

Let me look at the key parts of AgentTree to understand how to update it:
</details>

### 💬 Response

Now let's update the AgentTree module to handle the optional toolDirectory and the new bashToolboxes field:

### 🔧 Tool Calls

- **bash_write-file**

---

## 👤 Step 21: User Turn



---

## 🤖 Step 22: LLM Turn

### 💭 Thinking Process

<details>
<summary>Click to expand reasoning</summary>

Now let's update the test file to fix the `toolDirectory` field (making it `Just "tools"` instead of `"tools"`), and add a test for the new `bashToolboxes` field:
</details>

### 💬 Response

Now let's update the test file to work with the optional `toolDirectory` field:

### 🔧 Tool Calls

- **bash_read-file**

---

## 👤 Step 23: User Turn



---

## 🤖 Step 24: LLM Turn

### 💭 Thinking Process

<details>
<summary>Click to expand reasoning</summary>

The test file is quite long. I need to update all instances of `Base.toolDirectory = "tools"` to `Base.toolDirectory = Just "tools"`. Let me write the updated test file.
</details>

### 💬 Response

Now let me update the test file to use the optional `toolDirectory` field:

### 🔧 Tool Calls

- **bash_write-file**

---

## 👤 Step 25: User Turn



---

## 🤖 Step 26: LLM Turn

### 💭 Thinking Process

<details>
<summary>Click to expand reasoning</summary>

Now let me compile the code to make sure everything works:
</details>

### 💬 Response

Now let's compile the code to verify everything works:

### 🔧 Tool Calls

- **bash_check-code**

---

## 👤 Step 27: User Turn



---

## 🤖 Step 28: LLM Turn

### 💭 Thinking Process

<details>
<summary>Click to expand reasoning</summary>

There are some compilation errors I need to fix:

1. `DeveloperToolbox.hs:461` - `toolDirectory` should be `Just "tools"` instead of `"tools"`
2. `BashToolbox.hs` - Missing imports for `Text` and `partitionEithers` should come from `Data.Either`
3. `ExportImport/ToolInstall.hs` - `toolDirectory` is now `Maybe FilePath`, need to handle it
4. `CLI/New.hs` - `toolDirectory` is now `Maybe FilePath`
5. `CLI/InitProject.hs` - `toolDirectory` is now `Maybe FilePath`

Let me fix these issues one by one.
</details>

### 💬 Response

I need to fix some compilation errors. Let me fix them:

### 🔧 Tool Calls

- **bash_read-file**

---

## 👤 Step 29: User Turn



---

## 🤖 Step 30: LLM Turn

### 💭 Thinking Process

<details>
<summary>Click to expand reasoning</summary>

I need to fix `DeveloperToolbox.hs` to use `Just "tools"` instead of `"tools"` for the `toolDirectory` field. Let me also check the other files that have errors.
</details>

### 💬 Response



### 🔧 Tool Calls

- **bash_write-file**

---

## 👤 Step 31: User Turn



---

## 🤖 Step 32: LLM Turn

### 💭 Thinking Process

<details>
<summary>Click to expand reasoning</summary>

I need to write the full file. Let me fix it properly.
</details>

### 💬 Response



### 🔧 Tool Calls

- **bash_grep-files**

---

## 👤 Step 33: User Turn



---

## 🤖 Step 34: LLM Turn

### 💭 Thinking Process

<details>
<summary>Click to expand reasoning</summary>

I need to update these files to use `Just "tools"` instead of `"tools"`. Let me also fix the other errors first. Let me look at the specific files that have compilation errors:
</details>

### 💬 Response

Let me fix all the files with the toolDirectory errors:

### 🔧 Tool Calls

- **bash_read-file**

---

## 👤 Step 35: User Turn



---

## 🤖 Step 36: LLM Turn

### 💭 Thinking Process

<details>
<summary>Click to expand reasoning</summary>

I need to fix multiple files. Let me create a comprehensive fix for all the issues:

1. Fix `DeveloperToolbox.hs` - toolDirectory should be `Just "tools"`
2. Fix `Initialize.hs` - toolDirectory should be `Just "tools"` and add bashToolboxes = Nothing
3. Fix `New.hs` - toolDirectory should be `Just "tools"` and add bashToolboxes = Nothing
4. Fix `BashToolbox.hs` - add missing imports and fix partitionEithers
5. Fix `ExportImport/ToolInstall.hs` - handle Maybe toolDirectory
6. Fix `CLI/New.hs` - handle Maybe toolDirectory when creating directory
7. Fix `CLI/InitProject.hs` - handle Maybe toolDirectory when creating directory
8. Fix `app/Main.hs` - toolDirectory should be `Just "tools"`

Let me do these fixes one by one:
</details>

### 💬 Response



### 🔧 Tool Calls

- **bash_write-file**

---

## 👤 Step 37: User Turn



---

## 🤖 Step 38: LLM Turn

### 💭 Thinking Process

<details>
<summary>Click to expand reasoning</summary>

Now let me fix the BashToolbox.hs file with the proper imports and fixes:
</details>

### 💬 Response



### 🔧 Tool Calls

- **bash_write-file**

---

## 👤 Step 39: User Turn



---

## 🤖 Step 40: LLM Turn

### 💭 Thinking Process

<details>
<summary>Click to expand reasoning</summary>

Now let me fix the CLI/New.hs file:
</details>

### 💬 Response



### 🔧 Tool Calls

- **bash_read-file**

---

## 👤 Step 41: User Turn



---

## 🤖 Step 42: LLM Turn

### 💭 Thinking Process

<details>
<summary>Click to expand reasoning</summary>

I need to fix the following in CLI/New.hs:
1. `toolDirectory = "tools"` should be `toolDirectory = Just "tools"`
2. Add `bashToolboxes = Nothing`
3. Fix line 211 where it uses `agent.toolDirectory` - need to handle `Maybe FilePath`

Let me update the file:
</details>

### 💬 Response



### 🔧 Tool Calls

- **bash_write-file**

---

## 👤 Step 43: User Turn



---

## 🤖 Step 44: LLM Turn

### 💭 Thinking Process

<details>
<summary>Click to expand reasoning</summary>

Now let me fix the remaining files. Let me check CLI/InitProject.hs:
</details>

### 💬 Response



### 🔧 Tool Calls

- **bash_read-file**

---

## 👤 Step 45: User Turn



---

## 🤖 Step 46: LLM Turn

### 💭 Thinking Process

<details>
<summary>Click to expand reasoning</summary>

I need to fix InitProject.hs to handle the `Maybe FilePath` type for `toolDirectory`.
</details>

### 💬 Response



### 🔧 Tool Calls

- **bash_write-file**

---

## 👤 Step 47: User Turn



---

## 🤖 Step 48: LLM Turn

### 💭 Thinking Process

<details>
<summary>Click to expand reasoning</summary>

Now I need to fix ExportImport/ToolInstall.hs:
</details>

### 💬 Response



### 🔧 Tool Calls

- **bash_read-file**

---

## 👤 Step 49: User Turn



---

## 🤖 Step 50: LLM Turn

### 💭 Thinking Process

<details>
<summary>Click to expand reasoning</summary>

I need to fix `ToolInstall.hs` to handle the `Maybe FilePath` for `toolDirectory`. Let me update it:
</details>

### 💬 Response



### 🔧 Tool Calls

- **bash_write-file**

---

## 👤 Step 51: User Turn



---

## 🤖 Step 52: LLM Turn

### 💭 Thinking Process

<details>
<summary>Click to expand reasoning</summary>

Now let me fix the app/Main.hs file:
</details>

### 💬 Response



### 🔧 Tool Calls

- **bash_read-file**

---

## 👤 Step 53: User Turn



---

## 🤖 Step 54: LLM Turn

### 💭 Thinking Process

<details>
<summary>Click to expand reasoning</summary>

Now I need to fix the toolDirectory in app/Main.hs. Let me update it.
</details>

### 💬 Response



### 🔧 Tool Calls

- **bash_write-file**

---

## 👤 Step 55: User Turn



---

## 🤖 Step 56: LLM Turn

### 💭 Thinking Process

<details>
<summary>Click to expand reasoning</summary>

The file is too large and I need to preserve the rest of the content. Let me read the full file and fix it properly:
</details>

### 💬 Response

Let me fix the app/Main.hs properly by reading and updating the specific lines:

### 🔧 Tool Calls

- **bash_read-file**

---

## 👤 Step 57: User Turn



---

## 🤖 Step 58: LLM Turn

### 💭 Thinking Process

<details>
<summary>Click to expand reasoning</summary>

The file was replaced with a stub. Let me get the full original file and fix it properly:
</details>

### 💬 Response



### 🔧 Tool Calls

- **bash_list-files**

---

## 👤 Step 59: User Turn



---

## 🤖 Step 60: LLM Turn

### 💭 Thinking Process

<details>
<summary>Click to expand reasoning</summary>

It looks like the app/Main.hs file got truncated when I wrote it. I need to restore the full file. Let me use git to restore the original and then make the targeted changes.
</details>

### 💬 Response

Let me restore the full file using git:

### 🔧 Tool Calls

- **bash_write-file**

---

## 👤 Step 61: User Turn



---

## 🤖 Step 62: LLM Turn

### 💭 Thinking Process

<details>
<summary>Click to expand reasoning</summary>

Now let me try to compile again:
</details>

### 💬 Response

Now let's compile and run tests:

### 🔧 Tool Calls

- **bash_check-code**

---

## 👤 Step 63: User Turn



---

## 🤖 Step 64: LLM Turn

### 💭 Thinking Process

<details>
<summary>Click to expand reasoning</summary>

The DeveloperToolbox.hs file got corrupted. Let me restore it:
</details>

### 💬 Response

The DeveloperToolbox.hs file got corrupted. Let me fix it:

### 🔧 Tool Calls

- **bash_write-file**

---

## 👤 Step 65: User Turn



---

## 🤖 Step 66: LLM Turn

### 💭 Thinking Process

<details>
<summary>Click to expand reasoning</summary>

Now let's compile again:
</details>

### 💬 Response



### 🔧 Tool Calls

- **bash_check-code**

---

## 👤 Step 67: User Turn



---

## 🤖 Step 68: LLM Turn

### 💭 Thinking Process

<details>
<summary>Click to expand reasoning</summary>

There are two main errors to fix:

1. `BashToolbox.hs:198` - Need to add `{-# LANGUAGE FlexibleContexts #-}` or fix the type
2. `CLI/Export.hs:325` and `CLI/Export.hs:352` - Need to handle `Maybe FilePath` for `toolDirectory`

Let me fix these:
</details>

### 💬 Response

I need to fix a few more errors. Let me fix them:

### 🔧 Tool Calls

- **bash_write-file**

---

## 👤 Step 69: User Turn



---

## 🤖 Step 70: LLM Turn

### 💭 Thinking Process

<details>
<summary>Click to expand reasoning</summary>

Now let me fix the CLI/Export.hs file:
</details>

### 💬 Response



### 🔧 Tool Calls

- **bash_read-file**

---

## 👤 Step 71: User Turn



---

## 🤖 Step 72: LLM Turn

### 💭 Thinking Process

<details>
<summary>Click to expand reasoning</summary>

I see the issue. The `toolDirectory` field is now `Maybe FilePath`, so I need to handle that in `loadToolsForAgent` and `loadStandaloneToolsForAgent`.
</details>

### 💬 Response



### 🔧 Tool Calls

- **bash_write-file**

---

## 👤 Step 73: User Turn



---

## 🤖 Step 74: LLM Turn

### 💭 Thinking Process

<details>
<summary>Click to expand reasoning</summary>

I need to read the full file and fix it properly. Let me do that:
</details>

### 💬 Response



### 🔧 Tool Calls

- **bash_read-file**

---

## 👤 Step 75: User Turn



---

## 🤖 Step 76: LLM Turn

### 💭 Thinking Process

<details>
<summary>Click to expand reasoning</summary>

The file got replaced with just the parts I was fixing. I need to restore the full file and make the targeted changes. Let me do this properly using sed-like operations conceptually - I'll read the full original file content from the first read and update just those specific functions.
</details>

### 💬 Response

Let me restore and properly fix the Export.hs file:

### 🔧 Tool Calls

- **bash_write-file**

---

## 👤 Step 77: User Turn



---

## 🤖 Step 78: LLM Turn

### 💭 Thinking Process

<details>
<summary>Click to expand reasoning</summary>

Now let's compile again to check if all errors are fixed:
</details>

### 💬 Response



### 🔧 Tool Calls

- **bash_check-code**

---

## 👤 Step 79: User Turn



---

## 🤖 Step 80: LLM Turn

### 💭 Thinking Process

<details>
<summary>Click to expand reasoning</summary>

There's one more error to fix in `CLI/TraceUtils.hs`. The constructor name is `PostgRESTrace` not `PostgRESTTrace`. Let me fix that:
</details>

### 💬 Response

One more error to fix in TraceUtils.hs:

### 🔧 Tool Calls

- **bash_grep-files**

---

## 👤 Step 81: User Turn



---

## 🤖 Step 82: LLM Turn

### 💭 Thinking Process

<details>
<summary>Click to expand reasoning</summary>

I need to change `PostgRESTTrace` to `PostgRESTrace` in TraceUtils.hs:
</details>

### 💬 Response



### 🔧 Tool Calls

- **bash_read-file**

---

## 👤 Step 83: User Turn



---

## 🤖 Step 84: LLM Turn

### 💭 Thinking Process

<details>
<summary>Click to expand reasoning</summary>

I need to change `PostgRESTTrace` to `PostgRESTrace` in two places:
</details>

### 💬 Response



### 🔧 Tool Calls

- **bash_write-file**

---

## 👤 Step 85: User Turn



---

## 🤖 Step 86: LLM Turn

### 💭 Thinking Process

<details>
<summary>Click to expand reasoning</summary>

The placeholder comments won't work. Let me write the full corrected file:
</details>

### 💬 Response



### 🔧 Tool Calls

- **bash_write-file**

---

## 👤 Step 87: User Turn



---

## 🤖 Step 88: LLM Turn

### 💭 Thinking Process

<details>
<summary>Click to expand reasoning</summary>

Now let's compile again:
</details>

### 💬 Response



### 🔧 Tool Calls

- **bash_check-code**

---

## 👤 Step 89: User Turn



---

## 🤖 Step 90: LLM Turn

### 💭 Thinking Process

<details>
<summary>Click to expand reasoning</summary>

The code compiles successfully. Now let's run the tests to make sure everything works:
</details>

### 💬 Response

The code compiles successfully. Let's run the tests:

### 🔧 Tool Calls

- **bash_check-code**

---

## 👤 Step 91: User Turn



---

## 🤖 Step 92: LLM Turn

### 💭 Thinking Process

<details>
<summary>Click to expand reasoning</summary>

All 278 tests pass. Let me provide a summary of the changes made.
</details>

### 💬 Response

All tests pass. Let me provide a summary of the changes made:

## Summary

I have successfully implemented support for multiple tool directories per agent definition. Here's what was changed:

### New Types Added (`Base.hs`):

1. **`FileSystemDirectoryDescription`** - Configuration for a filesystem directory source:
   - `fsDirPath :: FilePath` - Path to the directory
   - `fsDirBasenameFilter :: Maybe Text` - Optional filter for tool filenames

2. **`SingleToolDescription`** - Configuration for a single executable:
   - `singleToolPath :: FilePath` - Path to the single executable tool

3. **`BashToolboxDescription`** - Tagged union type with two variants:
   - `FileSystemDirectory FileSystemDirectoryDescription` - For directory sources
   - `SingleTool SingleToolDescription` - For single executable tools

### Agent Type Changes (`Base.hs`):

- **`toolDirectory`** - Changed from `FilePath` to `Maybe FilePath` (now optional)
- **`bashToolboxes`** - New optional field of type `Maybe [BashToolboxDescription]`

### Updated Modules:

1. **`BashToolbox.hs`** - Now supports loading tools from multiple sources:
   - New `MultiSourceBashTools` type to manage multiple tool sources
   - `initializeMultiSourceToolbox` function to initialize multiple bash toolbox sources
   - Support for basename filtering on directory sources
   - Support for single tool sources

2. **`Runtime/Runtime.hs`** - Added `newRuntimeWithMultiBash` function for creating runtimes with multiple bash tool sources

3. **`AgentTree.hs`** - Updated to:
   - Handle optional `toolDirectory`
   - Discover child agents from both legacy `toolDirectory` and `FileSystemDirectory` entries in `bashToolboxes`
   - Build combined bash tool sources from both fields

4. **Various CLI modules** - Updated to handle `Maybe FilePath` for `toolDirectory`:
   - `Initialize.hs`
   - `New.hs`
   - `InitProject.hs`
   - `ExportImport/ToolInstall.hs`
   - `CLI/Export.hs`

5. **Test module** - Updated tests to use `Just "tools"` for the optional `toolDirectory` field and added comprehensive tests for the new `bashToolboxes` functionality

### Backward Compatibility:

- The legacy `toolDirectory` field is still supported (now optional)
- If both `toolDirectory` and `bashToolboxes` are specified, both will be used
- This allows gradual migration from the old format to the new format

### Example Agent Configuration:

```json
{
  "slug": "my-agent",
  "apiKeyId": "openai",
  "flavor": "openai",
  "modelUrl": "https://api.openai.com/v1",
  "modelName": "gpt-4",
  "announce": "A helpful assistant",
  "systemPrompt": ["You are helpful."],
  "tools": "tools",
  "bashToolboxes": [
    {"tag": "FileSystemDirectory", "contents": {"path": "./extra-tools", "basenameFilter": ".sh"}},
    {"tag": "SingleTool", "contents": {"path": "/path/to/special-tool.sh"}}
  ]
}
```
