Compare commits

...

20 Commits

Author SHA1 Message Date
Hugo Dutka
677318c8b4 agentapi 0.2.2, screen support 2025-06-23 16:51:10 +02:00
Hugo Dutka
1916bade3e add sidebar app block back 2025-06-19 18:28:13 +02:00
Hugo Dutka
c053b891fc remove sidebar app block 2025-06-19 18:27:33 +02:00
Hugo Dutka
1fcfcab8dd syntax fix 2025-06-18 16:23:18 +02:00
Hugo Dutka
f24946503f add ai task resource 2025-06-18 16:17:16 +02:00
Asher
e950669f93
Use AgentAPI for additional Claude status reporting (#150)
Is it OK to add the flag like this or do we need to check the cli
version to determine whether the new flag is available? Or I could just
throw in an `||` to run the command again without the flag if it fails.

Blocked on adding AgentAPI to Claude.

Will need to do the same for Goose.
2025-06-17 19:14:42 +02:00
DevCats
3d78f5e262
Merge branch 'main' into claude-code-web 2025-06-16 20:02:40 -05:00
Hugo Dutka
1469373a50 uncomment the claude code app 2025-06-05 18:56:48 +02:00
Hugo Dutka
1551c17413 comment out the claude-code app temporarily 2025-06-05 18:53:36 +02:00
Hugo Dutka
eac3e55537 add healthcheck to claude code web 2025-06-05 18:26:37 +02:00
Hugo Dutka
c301da7e6b remove tee pipes - they make claude ignore actual terminal width and render 80 char lines 2025-06-04 19:03:41 +02:00
Hugo Dutka
7d64e7ea84 use agentapi attach 2025-06-04 17:53:07 +02:00
Hugo Dutka
b5937c06a9 adjust agentapi terminal width and height 2025-06-04 15:41:33 +02:00
Hugo Dutka
d2b91ae1a8 adjust agentapi terminal width and height 2025-06-04 14:32:27 +02:00
Hugo Dutka
bd05d06a3b change claude code web app url 2025-06-04 13:19:05 +02:00
Ben Potter
e340affe95
fix another typo 2025-06-03 18:36:50 -05:00
Ben Potter
16892d806e
fix typo 2025-06-03 18:31:30 -05:00
Ben Potter
056f4b5a68
remove duplicate app 2025-06-03 18:29:28 -05:00
Ben Potter
1c99c57b6e
add agentapi 2025-06-03 18:27:29 -05:00
BrunoQuaresma
a0c1a051ed feat: add claude_code_web in claude-code 2025-06-03 20:54:58 +00:00

View File

@ -4,7 +4,7 @@ terraform {
required_providers { required_providers {
coder = { coder = {
source = "coder/coder" source = "coder/coder"
version = ">= 2.5" version = ">= 2.7.0"
} }
} }
} }
@ -54,6 +54,18 @@ variable "claude_code_version" {
default = "latest" default = "latest"
} }
variable "install_agentapi" {
type = bool
description = "Whether to install AgentAPI."
default = true
}
variable "agentapi_version" {
type = string
description = "The version of AgentAPI to install."
default = "v0.2.2"
}
variable "experiment_use_screen" { variable "experiment_use_screen" {
type = bool type = bool
description = "Whether to use screen for running Claude Code in the background." description = "Whether to use screen for running Claude Code in the background."
@ -87,6 +99,15 @@ variable "experiment_post_install_script" {
locals { locals {
encoded_pre_install_script = var.experiment_pre_install_script != null ? base64encode(var.experiment_pre_install_script) : "" encoded_pre_install_script = var.experiment_pre_install_script != null ? base64encode(var.experiment_pre_install_script) : ""
encoded_post_install_script = var.experiment_post_install_script != null ? base64encode(var.experiment_post_install_script) : "" encoded_post_install_script = var.experiment_post_install_script != null ? base64encode(var.experiment_post_install_script) : ""
agentapi_start_command = <<-EOT
#!/bin/bash
set -e
# use low width to fit in the tasks UI sidebar. height is adjusted to ~match the default 80k (80x1000) characters
# visible in the terminal screen.
agentapi server --term-width 67 --term-height 1190 -- bash -c "claude --dangerously-skip-permissions \"$(cat ~/.claude-code-prompt)\""
EOT
agentapi_start_command_base64 = base64encode(local.agentapi_start_command)
} }
# Install and Initialize Claude Code # Install and Initialize Claude Code
@ -131,9 +152,35 @@ resource "coder_script" "claude_code" {
npm install -g @anthropic-ai/claude-code@${var.claude_code_version} npm install -g @anthropic-ai/claude-code@${var.claude_code_version}
fi fi
# Install AgentAPI if enabled
if [ "${var.install_agentapi}" = "true" ]; then
echo "Installing AgentAPI..."
arch=$(uname -m)
if [ "$arch" = "x86_64" ]; then
binary_name="agentapi-linux-amd64"
elif [ "$arch" = "aarch64" ]; then
binary_name="agentapi-linux-arm64"
else
echo "Error: Unsupported architecture: $arch"
exit 1
fi
wget "https://github.com/coder/agentapi/releases/download/${var.agentapi_version}/$binary_name"
chmod +x "$binary_name"
sudo mv "$binary_name" /usr/local/bin/agentapi
fi
if ! command_exists agentapi; then
echo "Error: AgentAPI is not installed. Please enable install_agentapi or install it manually."
exit 1
fi
echo -n "$CODER_MCP_CLAUDE_TASK_PROMPT" > ~/.claude-code-prompt
echo -n "${local.agentapi_start_command_base64}" | base64 -d > ~/.agentapi-start-command
chmod +x ~/.agentapi-start-command
if [ "${var.experiment_report_tasks}" = "true" ]; then if [ "${var.experiment_report_tasks}" = "true" ]; then
echo "Configuring Claude Code to report tasks via Coder MCP..." echo "Configuring Claude Code to report tasks via Coder MCP..."
coder exp mcp configure claude-code ${var.folder} coder exp mcp configure claude-code ${var.folder} --ai-agentapi-url http://localhost:3284
fi fi
# Run post-install script if provided # Run post-install script if provided
@ -166,8 +213,24 @@ resource "coder_script" "claude_code" {
export LANG=en_US.UTF-8 export LANG=en_US.UTF-8
export LC_ALL=en_US.UTF-8 export LC_ALL=en_US.UTF-8
# Create a new tmux session in detached mode # use low width to fit in the tasks UI sidebar. height is adjusted to ~match the default 80k (80x1000) characters
tmux new-session -d -s claude-code -c ${var.folder} "claude --dangerously-skip-permissions \"$CODER_MCP_CLAUDE_TASK_PROMPT\"" # visible in the terminal screen.
tmux new-session -d -s claude-code-agentapi -c ${var.folder} '~/.agentapi-start-command; exec bash'
echo "Waiting for agentapi server to start on port 3284..."
for i in $(seq 1 15); do
if lsof -i :3284 | grep -q 'LISTEN'; then
echo "agentapi server started on port 3284."
break
fi
echo "Waiting... ($i/15)"
sleep 1
done
if ! lsof -i :3284 | grep -q 'LISTEN'; then
echo "Error: agentapi server did not start on port 3284 after 15 seconds."
exit 1
fi
tmux new-session -d -s claude-code -c ${var.folder} "agentapi attach"
fi fi
@ -203,7 +266,7 @@ resource "coder_script" "claude_code" {
screen -U -dmS claude-code bash -c ' screen -U -dmS claude-code bash -c '
cd ${var.folder} cd ${var.folder}
claude --dangerously-skip-permissions "$CODER_MCP_CLAUDE_TASK_PROMPT" | tee -a "$HOME/.claude-code.log" ~/.agentapi-start-command
exec bash exec bash
' '
else else
@ -217,6 +280,20 @@ resource "coder_script" "claude_code" {
run_on_start = true run_on_start = true
} }
resource "coder_app" "claude_code_web" {
slug = "claude-code-web"
display_name = "Claude Code Web"
agent_id = var.agent_id
url = "http://localhost:3284/"
icon = var.icon
subdomain = true
healthcheck {
url = "http://localhost:3284/status"
interval = 5
threshold = 3
}
}
resource "coder_app" "claude_code" { resource "coder_app" "claude_code" {
slug = "claude-code" slug = "claude-code"
display_name = "Claude Code" display_name = "Claude Code"
@ -229,12 +306,18 @@ resource "coder_app" "claude_code" {
export LC_ALL=en_US.UTF-8 export LC_ALL=en_US.UTF-8
if [ "${var.experiment_use_tmux}" = "true" ]; then if [ "${var.experiment_use_tmux}" = "true" ]; then
if ! tmux has-session -t claude-code-agentapi 2>/dev/null; then
echo "Starting a new Claude Code agentapi tmux session." | tee -a "$HOME/.claude-code.log"
tmux new-session -d -s claude-code-agentapi -c ${var.folder} '~/.agentapi-start-command; exec bash'
fi
if tmux has-session -t claude-code 2>/dev/null; then if tmux has-session -t claude-code 2>/dev/null; then
echo "Attaching to existing Claude Code tmux session." | tee -a "$HOME/.claude-code.log" echo "Attaching to existing Claude Code tmux session." | tee -a "$HOME/.claude-code.log"
tmux attach-session -t claude-code tmux attach-session -t claude-code
else else
echo "Starting a new Claude Code tmux session." | tee -a "$HOME/.claude-code.log" echo "Starting a new Claude Code tmux session." | tee -a "$HOME/.claude-code.log"
tmux new-session -s claude-code -c ${var.folder} "claude --dangerously-skip-permissions | tee -a \"$HOME/.claude-code.log\"; exec bash" tmux new-session -s claude-code -c ${var.folder} "agentapi attach; exec bash"
fi fi
elif [ "${var.experiment_use_screen}" = "true" ]; then elif [ "${var.experiment_use_screen}" = "true" ]; then
if screen -list | grep -q "claude-code"; then if screen -list | grep -q "claude-code"; then
@ -242,7 +325,7 @@ resource "coder_app" "claude_code" {
screen -xRR claude-code screen -xRR claude-code
else else
echo "Starting a new Claude Code screen session." | tee -a "$HOME/.claude-code.log" echo "Starting a new Claude Code screen session." | tee -a "$HOME/.claude-code.log"
screen -S claude-code bash -c 'claude --dangerously-skip-permissions | tee -a "$HOME/.claude-code.log"; exec bash' screen -S claude-code bash -c 'agentapi attach; exec bash'
fi fi
else else
cd ${var.folder} cd ${var.folder}
@ -253,3 +336,9 @@ resource "coder_app" "claude_code" {
order = var.order order = var.order
group = var.group group = var.group
} }
resource "coder_ai_task" "claude_code" {
sidebar_app {
id = coder_app.claude_code.id
}
}