@appoly/multiagent-chat 1.0.0
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.
- package/README.md +76 -0
- package/bin/multiagent-chat.js +14 -0
- package/config.yaml +158 -0
- package/index.html +211 -0
- package/main.js +1149 -0
- package/package.json +52 -0
- package/preload.js +71 -0
- package/renderer.js +1626 -0
- package/robot.png +0 -0
- package/styles.css +1626 -0
package/README.md
ADDED
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
# Multi-Agent Chat
|
|
2
|
+
|
|
3
|
+
An Electron app that enables multiple AI agents (Claude, Codex, etc.) to collaborate on challenges through a shared chat interface.
|
|
4
|
+
|
|
5
|
+
Uses your local installations of AI agents via command line. Bring your own API keys and configurations.
|
|
6
|
+
|
|
7
|
+
## Installation
|
|
8
|
+
|
|
9
|
+
### Global Install (Recommended)
|
|
10
|
+
|
|
11
|
+
```bash
|
|
12
|
+
npm i -g multiagent-chat
|
|
13
|
+
```
|
|
14
|
+
|
|
15
|
+
### From Source
|
|
16
|
+
|
|
17
|
+
```bash
|
|
18
|
+
git clone <repo>
|
|
19
|
+
cd multiagent-chat
|
|
20
|
+
npm install
|
|
21
|
+
npm start
|
|
22
|
+
```
|
|
23
|
+
|
|
24
|
+
## Usage
|
|
25
|
+
|
|
26
|
+
```bash
|
|
27
|
+
# Run in current directory (uses cwd as workspace)
|
|
28
|
+
multiagent-chat
|
|
29
|
+
|
|
30
|
+
# Specify workspace explicitly
|
|
31
|
+
multiagent-chat /path/to/project
|
|
32
|
+
multiagent-chat --workspace /path/to/project
|
|
33
|
+
|
|
34
|
+
# With custom config file
|
|
35
|
+
multiagent-chat --config /path/to/config.yaml
|
|
36
|
+
|
|
37
|
+
# Environment variables also work
|
|
38
|
+
WORKSPACE=/path/to/project multiagent-chat
|
|
39
|
+
```
|
|
40
|
+
|
|
41
|
+
## Configuration
|
|
42
|
+
|
|
43
|
+
On first run, a default config is created at `~/.multiagent-chat/config.yaml`.
|
|
44
|
+
|
|
45
|
+
```yaml
|
|
46
|
+
agents:
|
|
47
|
+
- name: "Claude"
|
|
48
|
+
command: "claude"
|
|
49
|
+
args: ['--dangerously-skip-permissions']
|
|
50
|
+
use_pty: true
|
|
51
|
+
|
|
52
|
+
- name: "Codex"
|
|
53
|
+
command: "codex"
|
|
54
|
+
args: []
|
|
55
|
+
use_pty: true
|
|
56
|
+
```
|
|
57
|
+
|
|
58
|
+
You can override with a project-local config using `--config /path/to/config.yaml`.
|
|
59
|
+
|
|
60
|
+
### Config Location
|
|
61
|
+
|
|
62
|
+
- **Global config**: `~/.multiagent-chat/config.yaml`
|
|
63
|
+
- **Recent workspaces**: `~/.multiagent-chat/recent-workspaces.json`
|
|
64
|
+
|
|
65
|
+
## How It Works
|
|
66
|
+
|
|
67
|
+
1. Select a workspace (project directory) or use current directory
|
|
68
|
+
2. Enter a challenge/topic for agents to discuss
|
|
69
|
+
3. Agents communicate via outbox files (messages delivered to their PTY)
|
|
70
|
+
4. Watch live collaboration in the chat panel
|
|
71
|
+
5. Final agreed plan written to `PLAN_FINAL.md` in the workspace
|
|
72
|
+
6. Optionally execute the plan -- other agents will review the implementation
|
|
73
|
+
|
|
74
|
+
## License
|
|
75
|
+
|
|
76
|
+
MIT
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
const path = require('path');
|
|
3
|
+
const { spawn } = require('child_process');
|
|
4
|
+
|
|
5
|
+
// Get the electron executable path from the installed dependency
|
|
6
|
+
const electron = require('electron');
|
|
7
|
+
|
|
8
|
+
// Launch electron with our main.js, passing through all CLI args
|
|
9
|
+
const child = spawn(electron, [path.join(__dirname, '..'), ...process.argv.slice(2)], {
|
|
10
|
+
stdio: 'inherit',
|
|
11
|
+
windowsHide: false
|
|
12
|
+
});
|
|
13
|
+
|
|
14
|
+
child.on('close', (code) => process.exit(code));
|
package/config.yaml
ADDED
|
@@ -0,0 +1,158 @@
|
|
|
1
|
+
# Default configuration - copied to ~/.multiagent-chat/config.yaml on first run
|
|
2
|
+
# Edit your local copy at ~/.multiagent-chat/config.yaml, not this file
|
|
3
|
+
#
|
|
4
|
+
# Multi-Agent Chat Configuration
|
|
5
|
+
# Define the agents that will collaborate on challenges
|
|
6
|
+
|
|
7
|
+
# Agent colors - used in the chat UI
|
|
8
|
+
# Default colors cycle through this palette if not specified per-agent
|
|
9
|
+
default_agent_colors:
|
|
10
|
+
- "#14f195" # Mint/Teal
|
|
11
|
+
- "#22d3ee" # Cyan
|
|
12
|
+
- "#3b82f6" # Blue
|
|
13
|
+
- "#22c55e" # Green
|
|
14
|
+
- "#f59e0b" # Amber
|
|
15
|
+
- "#ff453a" # Red
|
|
16
|
+
|
|
17
|
+
# User message styling
|
|
18
|
+
user_color: "#94a3b8" # Slate for user messages
|
|
19
|
+
|
|
20
|
+
agents:
|
|
21
|
+
- name: "Claude"
|
|
22
|
+
command: "claude"
|
|
23
|
+
args: ['--dangerously-skip-permissions']
|
|
24
|
+
use_pty: true
|
|
25
|
+
color: "#3b82f6" # Blue for Claude
|
|
26
|
+
|
|
27
|
+
- name: "Codex"
|
|
28
|
+
command: "codex"
|
|
29
|
+
args: []
|
|
30
|
+
use_pty: true
|
|
31
|
+
color: "#22c55e" # Green for Codex
|
|
32
|
+
|
|
33
|
+
# - name: "Gemini"
|
|
34
|
+
# # If the command below doesn't work, use `which gemini` to find the path on your system.
|
|
35
|
+
# command: "gemini"
|
|
36
|
+
# use_pty: true
|
|
37
|
+
# color: "#f59e0b" # Amber for Gemini
|
|
38
|
+
# init_delay_ms: 1500
|
|
39
|
+
# args: ['--yolo']
|
|
40
|
+
|
|
41
|
+
# Example: Multiple instances of the same agent type
|
|
42
|
+
# Useful for having the same model debate from different perspectives
|
|
43
|
+
# - name: "Claude-Alpha"
|
|
44
|
+
# command: "claude"
|
|
45
|
+
# args: ['--dangerously-skip-permissions']
|
|
46
|
+
# use_pty: true
|
|
47
|
+
# color: "#3b82f6" # Blue
|
|
48
|
+
#
|
|
49
|
+
# - name: "Claude-Beta"
|
|
50
|
+
# command: "claude"
|
|
51
|
+
# args: ['--dangerously-skip-permissions']
|
|
52
|
+
# use_pty: true
|
|
53
|
+
# color: "#8b5cf6" # Purple
|
|
54
|
+
|
|
55
|
+
# Working directory for chat files (hidden to avoid cluttering projects)
|
|
56
|
+
workspace: "./.multiagent-chat"
|
|
57
|
+
|
|
58
|
+
# Chat file (JSONL format for structured UI rendering)
|
|
59
|
+
chat_file: "chat.jsonl"
|
|
60
|
+
|
|
61
|
+
# Outbox directory (agents write here to send messages)
|
|
62
|
+
outbox_dir: "outbox"
|
|
63
|
+
|
|
64
|
+
# Final plan file name
|
|
65
|
+
plan_file: "PLAN_FINAL.md"
|
|
66
|
+
|
|
67
|
+
# Prompts section
|
|
68
|
+
prompts:
|
|
69
|
+
# Sent when user clicks "Start Implementing" and selects an agent
|
|
70
|
+
# Placeholders: {selected_agent}, {other_agents}
|
|
71
|
+
implementation_handoff: |
|
|
72
|
+
## 🚀 IMPLEMENTATION STAGE BEGINS
|
|
73
|
+
|
|
74
|
+
The planning phase is complete. You are now entering the **IMPLEMENTATION** stage.
|
|
75
|
+
|
|
76
|
+
**{selected_agent}**: You are the lead implementer. Please implement the agreed plan now. You may create, modify, and delete files as needed.
|
|
77
|
+
|
|
78
|
+
**{other_agents}**: Wait for {selected_agent} to confirm they have completed the implementation. Then review the changes and provide feedback. Iterate together until everyone is satisfied with the result.
|
|
79
|
+
|
|
80
|
+
# Prompt template for agents
|
|
81
|
+
# This is sent via PTY when the session starts
|
|
82
|
+
prompt_template: |
|
|
83
|
+
## Multi-Agent Collaboration Session
|
|
84
|
+
|
|
85
|
+
**You are: {agent_name}**
|
|
86
|
+
|
|
87
|
+
You are collaborating with: {agent_names}
|
|
88
|
+
|
|
89
|
+
### How This Works
|
|
90
|
+
|
|
91
|
+
1. **Messages from other agents will appear in your terminal** - the chat system delivers them to you
|
|
92
|
+
2. **To send a message**, write to `{outbox_file}` using a shell command (see below)
|
|
93
|
+
3. **Stay active** - keep responding to messages until you reach consensus
|
|
94
|
+
4. **When done**, one agent should write the final agreed solution to `{plan_file}`
|
|
95
|
+
|
|
96
|
+
You do NOT need to read any chat files - messages come to you automatically.
|
|
97
|
+
|
|
98
|
+
### IMPORTANT: How to Send Messages
|
|
99
|
+
|
|
100
|
+
Use a shell command to write to your outbox - this is MUCH faster than using file editing tools:
|
|
101
|
+
|
|
102
|
+
```bash
|
|
103
|
+
cat << 'EOF' > {outbox_file}
|
|
104
|
+
Your message here.
|
|
105
|
+
Can be multiple lines.
|
|
106
|
+
EOF
|
|
107
|
+
```
|
|
108
|
+
|
|
109
|
+
Do NOT use built-in file read/write tools - they are slower. Just use `cat` with a heredoc.
|
|
110
|
+
|
|
111
|
+
### Guidelines
|
|
112
|
+
|
|
113
|
+
- **Sign your messages** - Start or end with your name (e.g., "— {agent_name}") so others know who's speaking
|
|
114
|
+
- Challenge each other's ideas constructively
|
|
115
|
+
- Don't be too agreeable - push for the best solution
|
|
116
|
+
- Wait for responses before sending multiple messages. DO NOT send multiple in a row without good reason
|
|
117
|
+
- Only implement things if the user explicitly asks
|
|
118
|
+
- Explore for yourself rather than relying on the findings of others
|
|
119
|
+
|
|
120
|
+
### Finalising: Explicit Agreement Required
|
|
121
|
+
|
|
122
|
+
Before writing to `{plan_file}`, you MUST have **explicit agreement from ALL agents**.
|
|
123
|
+
|
|
124
|
+
- "No objections" or silence is NOT agreement
|
|
125
|
+
- Each agent must explicitly say they agree with the final solution
|
|
126
|
+
- Use clear language like "I agree with this final version" or "Confirmed, let's go with this"
|
|
127
|
+
- Only after ALL agents have explicitly confirmed should one agent write `{plan_file}`
|
|
128
|
+
|
|
129
|
+
### When to Stop
|
|
130
|
+
|
|
131
|
+
Once `{plan_file}` has been written and all agents have confirmed, **STOP RESPONDING**.
|
|
132
|
+
|
|
133
|
+
Why? Each message you send triggers other agents to respond, creating an endless loop.
|
|
134
|
+
When the task is done, simply stop - do not send "Done!", "Confirmed!", "Acknowledged!", etc.
|
|
135
|
+
|
|
136
|
+
---
|
|
137
|
+
|
|
138
|
+
## ⚠️ PLANNING STAGE ONLY - DO NOT IMPLEMENT
|
|
139
|
+
|
|
140
|
+
This session has two distinct phases:
|
|
141
|
+
|
|
142
|
+
1. **PLANNING (current phase)** - Discuss, debate, and agree on a plan. Write the agreed plan to `{plan_file}`. DO NOT write any code or make any changes to the codebase.
|
|
143
|
+
|
|
144
|
+
2. **IMPLEMENTATION (later)** - Only begins when the user explicitly says "implement" or "start implementing". Until then, your job is ONLY to plan.
|
|
145
|
+
|
|
146
|
+
**You are currently in the PLANNING phase. Do not create, modify, or delete any files except your outbox and `{plan_file}`.**
|
|
147
|
+
|
|
148
|
+
---
|
|
149
|
+
|
|
150
|
+
## Topic to Discuss
|
|
151
|
+
|
|
152
|
+
{challenge}
|
|
153
|
+
|
|
154
|
+
---
|
|
155
|
+
|
|
156
|
+
**Remember: PLAN ONLY. Do not implement anything yet.**
|
|
157
|
+
|
|
158
|
+
Send your opening thoughts now using: cat << 'EOF' > {outbox_file}
|
package/index.html
ADDED
|
@@ -0,0 +1,211 @@
|
|
|
1
|
+
<!DOCTYPE html>
|
|
2
|
+
<html lang="en">
|
|
3
|
+
<head>
|
|
4
|
+
<meta charset="UTF-8">
|
|
5
|
+
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
|
6
|
+
<link rel="icon" type="image/png" href="robot.png">
|
|
7
|
+
<title>Multi-Agent Chat</title>
|
|
8
|
+
<link rel="stylesheet" href="node_modules/@xterm/xterm/css/xterm.css">
|
|
9
|
+
<link rel="stylesheet" href="styles.css">
|
|
10
|
+
<script src="node_modules/@xterm/xterm/lib/xterm.js"></script>
|
|
11
|
+
<script src="node_modules/@xterm/addon-fit/lib/addon-fit.js"></script>
|
|
12
|
+
<script src="node_modules/marked/lib/marked.umd.js"></script>
|
|
13
|
+
</head>
|
|
14
|
+
<body>
|
|
15
|
+
<!-- Challenge Input Screen -->
|
|
16
|
+
<div id="challenge-screen" class="screen active">
|
|
17
|
+
<div class="challenge-layout">
|
|
18
|
+
<!-- Workspace Picker Sidebar -->
|
|
19
|
+
<div class="workspace-sidebar">
|
|
20
|
+
<div class="workspace-sidebar-header">
|
|
21
|
+
<h3>Workspace</h3>
|
|
22
|
+
</div>
|
|
23
|
+
<div class="workspace-list-container">
|
|
24
|
+
<ul id="recent-workspaces" class="workspace-list">
|
|
25
|
+
<li class="workspace-empty">Loading...</li>
|
|
26
|
+
</ul>
|
|
27
|
+
</div>
|
|
28
|
+
<div class="workspace-actions">
|
|
29
|
+
<button id="browse-workspace-button" class="workspace-action-button">
|
|
30
|
+
<span class="action-icon">📁</span>
|
|
31
|
+
Browse...
|
|
32
|
+
</button>
|
|
33
|
+
<button id="use-cwd-button" class="workspace-action-button" style="display: none;">
|
|
34
|
+
<span class="action-icon">📍</span>
|
|
35
|
+
Use Current Directory
|
|
36
|
+
</button>
|
|
37
|
+
</div>
|
|
38
|
+
<div class="workspace-footer">
|
|
39
|
+
<button id="edit-config-button" class="config-link-button">
|
|
40
|
+
Edit configuration →
|
|
41
|
+
</button>
|
|
42
|
+
</div>
|
|
43
|
+
</div>
|
|
44
|
+
|
|
45
|
+
<!-- Main Card -->
|
|
46
|
+
<div class="container">
|
|
47
|
+
<h1><img src="robot.png" alt="Robot" class="header-icon"> Multi-Agent Chat</h1>
|
|
48
|
+
<p class="subtitle">Autonomous collaboration for complex challenges</p>
|
|
49
|
+
|
|
50
|
+
<div id="selected-workspace-info" class="selected-workspace-info" style="display: none;">
|
|
51
|
+
<span class="selected-label">Selected workspace:</span>
|
|
52
|
+
<span id="selected-workspace-path" class="selected-path"></span>
|
|
53
|
+
<span id="cli-badge" class="cli-badge" style="display: none;">(via CLI)</span>
|
|
54
|
+
</div>
|
|
55
|
+
|
|
56
|
+
<div class="challenge-input-container">
|
|
57
|
+
<textarea
|
|
58
|
+
id="challenge-input"
|
|
59
|
+
placeholder="Describe your challenge... (e.g., 'Refactor the authentication logic in src/auth.ts to use JWT')"
|
|
60
|
+
rows="10"
|
|
61
|
+
></textarea>
|
|
62
|
+
</div>
|
|
63
|
+
|
|
64
|
+
<button id="start-button" class="primary-button" disabled>Select a Workspace</button>
|
|
65
|
+
|
|
66
|
+
<div id="config-info" class="config-info">
|
|
67
|
+
<h3>Current Environment</h3>
|
|
68
|
+
<div id="config-details">Loading...</div>
|
|
69
|
+
</div>
|
|
70
|
+
</div>
|
|
71
|
+
</div>
|
|
72
|
+
</div>
|
|
73
|
+
|
|
74
|
+
<!-- Main Session Screen -->
|
|
75
|
+
<div id="session-screen" class="screen">
|
|
76
|
+
<div class="header">
|
|
77
|
+
<h2><img src="robot.png" alt="Robot" class="header-icon"> Chat <span class="divider">/</span> <span class="subtext">Session</span></h2>
|
|
78
|
+
<div class="header-info">
|
|
79
|
+
<div id="workspace-path">Loading...</div>
|
|
80
|
+
<button id="new-session-button" class="secondary-button" title="New Session (⌘⇧N)">New Session</button>
|
|
81
|
+
</div>
|
|
82
|
+
</div>
|
|
83
|
+
|
|
84
|
+
<div class="main-content">
|
|
85
|
+
<!-- Left Panel: Agent Outputs -->
|
|
86
|
+
<div class="left-panel">
|
|
87
|
+
<div class="panel-header">
|
|
88
|
+
<h3>Terminal Instances</h3>
|
|
89
|
+
</div>
|
|
90
|
+
<div id="agent-tabs" class="tabs"></div>
|
|
91
|
+
<div id="agent-outputs" class="agent-outputs"></div>
|
|
92
|
+
</div>
|
|
93
|
+
|
|
94
|
+
<!-- Horizontal Resize Handle -->
|
|
95
|
+
<div class="resize-handle resize-handle-h" data-resize="main"></div>
|
|
96
|
+
|
|
97
|
+
<!-- Right Panel: Chat, Plan, and Diff -->
|
|
98
|
+
<div class="right-panel">
|
|
99
|
+
<!-- Top-Level Main Tabs -->
|
|
100
|
+
<div class="main-tabs">
|
|
101
|
+
<button id="main-tab-chat" class="main-tab active" data-tab="chat">Chat</button>
|
|
102
|
+
<button id="main-tab-plan" class="main-tab" data-tab="plan">Plan</button>
|
|
103
|
+
<button id="main-tab-diff" class="main-tab" data-tab="diff">
|
|
104
|
+
Diff
|
|
105
|
+
<span id="diff-badge" class="diff-badge" style="display: none;"></span>
|
|
106
|
+
</button>
|
|
107
|
+
</div>
|
|
108
|
+
|
|
109
|
+
<!-- Chat Tab Content -->
|
|
110
|
+
<div id="chat-tab-content" class="tab-content active">
|
|
111
|
+
<div class="chat-section">
|
|
112
|
+
<div class="panel-header">
|
|
113
|
+
<h3>Communication Stream</h3>
|
|
114
|
+
</div>
|
|
115
|
+
<div id="chat-viewer" class="chat-viewer"></div>
|
|
116
|
+
<div id="chat-new-messages" class="chat-new-messages" aria-hidden="true">
|
|
117
|
+
<button id="chat-new-messages-button" class="small-button">New messages ↓</button>
|
|
118
|
+
</div>
|
|
119
|
+
</div>
|
|
120
|
+
<div class="message-section">
|
|
121
|
+
<div class="panel-header">
|
|
122
|
+
<h3>Direct Intervention</h3>
|
|
123
|
+
</div>
|
|
124
|
+
<div class="message-input-container">
|
|
125
|
+
<textarea
|
|
126
|
+
id="user-message-input"
|
|
127
|
+
placeholder="Send instruction to all agents..."
|
|
128
|
+
rows="2"
|
|
129
|
+
></textarea>
|
|
130
|
+
<button id="send-message-button" class="primary-button">Send</button>
|
|
131
|
+
</div>
|
|
132
|
+
</div>
|
|
133
|
+
</div>
|
|
134
|
+
|
|
135
|
+
<!-- Plan Tab Content -->
|
|
136
|
+
<div id="plan-tab-content" class="tab-content">
|
|
137
|
+
<div class="plan-section">
|
|
138
|
+
<div class="panel-header">
|
|
139
|
+
<h3>Final Plan</h3>
|
|
140
|
+
<div class="panel-header-actions">
|
|
141
|
+
<button id="refresh-plan-button" class="small-button">Refresh</button>
|
|
142
|
+
</div>
|
|
143
|
+
</div>
|
|
144
|
+
<div id="plan-viewer" class="plan-viewer">
|
|
145
|
+
<em>Awaiting agent synthesis...</em>
|
|
146
|
+
</div>
|
|
147
|
+
<div class="plan-actions">
|
|
148
|
+
<button id="start-implementing-button" class="primary-button large" style="display: none;">Start Implementing</button>
|
|
149
|
+
</div>
|
|
150
|
+
</div>
|
|
151
|
+
</div>
|
|
152
|
+
|
|
153
|
+
<!-- Diff Tab Content -->
|
|
154
|
+
<div id="diff-tab-content" class="tab-content">
|
|
155
|
+
<div class="diff-section">
|
|
156
|
+
<div class="panel-header">
|
|
157
|
+
<h3>Git Changes</h3>
|
|
158
|
+
<div class="panel-header-actions">
|
|
159
|
+
<div id="diff-stats" class="diff-stats"></div>
|
|
160
|
+
<button id="refresh-diff-button" class="small-button">Refresh</button>
|
|
161
|
+
</div>
|
|
162
|
+
</div>
|
|
163
|
+
<div class="diff-layout">
|
|
164
|
+
<!-- File List Pane -->
|
|
165
|
+
<div class="diff-file-list">
|
|
166
|
+
<div class="file-list-header">Changed Files</div>
|
|
167
|
+
<ul id="diff-file-list-items" class="file-list-items"></ul>
|
|
168
|
+
</div>
|
|
169
|
+
<!-- Resize Handle for Diff Panes -->
|
|
170
|
+
<div class="resize-handle resize-handle-h diff-resize" data-resize="diff"></div>
|
|
171
|
+
<!-- Diff Content Pane -->
|
|
172
|
+
<div class="diff-content-pane">
|
|
173
|
+
<div id="diff-content" class="diff-content">
|
|
174
|
+
<em>Select a file or view all changes...</em>
|
|
175
|
+
</div>
|
|
176
|
+
</div>
|
|
177
|
+
</div>
|
|
178
|
+
<div id="diff-untracked" class="diff-untracked"></div>
|
|
179
|
+
</div>
|
|
180
|
+
</div>
|
|
181
|
+
</div>
|
|
182
|
+
</div>
|
|
183
|
+
</div>
|
|
184
|
+
|
|
185
|
+
<!-- Implementation Modal -->
|
|
186
|
+
<div id="implementation-modal" class="modal" style="display: none;">
|
|
187
|
+
<div class="modal-content">
|
|
188
|
+
<h3>Who should implement the plan?</h3>
|
|
189
|
+
<div id="agent-selection" class="agent-selection"></div>
|
|
190
|
+
<div class="modal-actions">
|
|
191
|
+
<button id="modal-cancel" class="small-button">Cancel</button>
|
|
192
|
+
<button id="modal-start" class="small-button primary">Start</button>
|
|
193
|
+
</div>
|
|
194
|
+
</div>
|
|
195
|
+
</div>
|
|
196
|
+
|
|
197
|
+
<!-- New Session Modal -->
|
|
198
|
+
<div id="new-session-modal" class="modal" style="display: none;">
|
|
199
|
+
<div class="modal-content">
|
|
200
|
+
<h3>Start New Session?</h3>
|
|
201
|
+
<p class="modal-description">Chat history and plan will be cleared. This won't undo code changes.</p>
|
|
202
|
+
<div class="modal-actions">
|
|
203
|
+
<button id="new-session-cancel" class="small-button">Cancel</button>
|
|
204
|
+
<button id="new-session-confirm" class="small-button primary">Start New Session</button>
|
|
205
|
+
</div>
|
|
206
|
+
</div>
|
|
207
|
+
</div>
|
|
208
|
+
|
|
209
|
+
<script src="renderer.js"></script>
|
|
210
|
+
</body>
|
|
211
|
+
</html>
|