feat(amazon-q): introduce amazon-q module to coder/registry (#95)
Co-authored-by: M Atif Ali <atif@coder.com>
This commit is contained in:
parent
a87c76bea6
commit
6c7f06e240
BIN
registry/coder/.images/amazon-q.png
Normal file
BIN
registry/coder/.images/amazon-q.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 74 KiB |
140
registry/coder/modules/amazon-q/README.md
Normal file
140
registry/coder/modules/amazon-q/README.md
Normal file
@ -0,0 +1,140 @@
|
|||||||
|
---
|
||||||
|
display_name: Amazon Q
|
||||||
|
description: Run Amazon Q in your workspace to access Amazon's AI coding assistant.
|
||||||
|
icon: ../../../../.icons/aws.svg
|
||||||
|
maintainer_github: coder
|
||||||
|
verified: true
|
||||||
|
tags: [ai, helper, amazon-q]
|
||||||
|
---
|
||||||
|
|
||||||
|
# Amazon Q
|
||||||
|
|
||||||
|
Run [Amazon Q](https://aws.amazon.com/q/) in your workspace to access Amazon's AI coding assistant. This module installs and launches Amazon Q, with support for background operation, task reporting, and custom pre/post install scripts.
|
||||||
|
|
||||||
|
```tf
|
||||||
|
module "amazon-q" {
|
||||||
|
source = "registry.coder.com/coder/amazon-q/coder"
|
||||||
|
version = "1.0.0"
|
||||||
|
agent_id = coder_agent.example.id
|
||||||
|
# Required: see below for how to generate
|
||||||
|
experiment_auth_tarball = var.amazon_q_auth_tarball
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
## Prerequisites
|
||||||
|
|
||||||
|
- You must generate an authenticated Amazon Q tarball on another machine:
|
||||||
|
```sh
|
||||||
|
cd ~/.local/share/amazon-q && tar -c . | zstd | base64 -w 0
|
||||||
|
```
|
||||||
|
Paste the result into the `experiment_auth_tarball` variable.
|
||||||
|
- To run in the background, your workspace must have `screen` or `tmux` installed.
|
||||||
|
|
||||||
|
<details>
|
||||||
|
<summary><strong>How to generate the Amazon Q auth tarball (step-by-step)</strong></summary>
|
||||||
|
|
||||||
|
**1. Install and authenticate Amazon Q on your local machine:**
|
||||||
|
|
||||||
|
- Download and install Amazon Q from the [official site](https://aws.amazon.com/q/developer/).
|
||||||
|
- Run `q login` and complete the authentication process in your terminal.
|
||||||
|
|
||||||
|
**2. Locate your Amazon Q config directory:**
|
||||||
|
|
||||||
|
- The config is typically stored at `~/.local/share/amazon-q`.
|
||||||
|
|
||||||
|
**3. Generate the tarball:**
|
||||||
|
|
||||||
|
- Run the following command in your terminal:
|
||||||
|
```sh
|
||||||
|
cd ~/.local/share/amazon-q
|
||||||
|
tar -c . | zstd | base64 -w 0
|
||||||
|
```
|
||||||
|
|
||||||
|
**4. Copy the output:**
|
||||||
|
|
||||||
|
- The command will output a long string. Copy this entire string.
|
||||||
|
|
||||||
|
**5. Paste into your Terraform variable:**
|
||||||
|
|
||||||
|
- Assign the string to the `experiment_auth_tarball` variable in your Terraform configuration, for example:
|
||||||
|
```tf
|
||||||
|
variable "amazon_q_auth_tarball" {
|
||||||
|
type = string
|
||||||
|
default = "PASTE_LONG_STRING_HERE"
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
**Note:**
|
||||||
|
|
||||||
|
- You must re-generate the tarball if you log out or re-authenticate Amazon Q on your local machine.
|
||||||
|
- This process is required for each user who wants to use Amazon Q in their workspace.
|
||||||
|
|
||||||
|
[Reference: Amazon Q documentation](https://docs.aws.amazon.com/amazonq/latest/qdeveloper-ug/generate-docs.html)
|
||||||
|
|
||||||
|
</details>
|
||||||
|
|
||||||
|
## Examples
|
||||||
|
|
||||||
|
### Run Amazon Q in the background with tmux
|
||||||
|
|
||||||
|
```tf
|
||||||
|
module "amazon-q" {
|
||||||
|
source = "registry.coder.com/coder/amazon-q/coder"
|
||||||
|
version = "1.0.0"
|
||||||
|
agent_id = coder_agent.example.id
|
||||||
|
experiment_auth_tarball = var.amazon_q_auth_tarball
|
||||||
|
experiment_use_tmux = true
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### Enable task reporting (experimental)
|
||||||
|
|
||||||
|
```tf
|
||||||
|
module "amazon-q" {
|
||||||
|
source = "registry.coder.com/coder/amazon-q/coder"
|
||||||
|
version = "1.0.0"
|
||||||
|
agent_id = coder_agent.example.id
|
||||||
|
experiment_auth_tarball = var.amazon_q_auth_tarball
|
||||||
|
experiment_report_tasks = true
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### Run custom scripts before/after install
|
||||||
|
|
||||||
|
```tf
|
||||||
|
module "amazon-q" {
|
||||||
|
source = "registry.coder.com/coder/amazon-q/coder"
|
||||||
|
version = "1.0.0"
|
||||||
|
agent_id = coder_agent.example.id
|
||||||
|
experiment_auth_tarball = var.amazon_q_auth_tarball
|
||||||
|
experiment_pre_install_script = "echo Pre-install!"
|
||||||
|
experiment_post_install_script = "echo Post-install!"
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
## Variables
|
||||||
|
|
||||||
|
| Name | Required | Default | Description |
|
||||||
|
| -------------------------------- | -------- | ------------------------ | ----------------------------------------------------------------------------------------------- |
|
||||||
|
| `agent_id` | Yes | — | The ID of a Coder agent. |
|
||||||
|
| `experiment_auth_tarball` | Yes | — | Base64-encoded, zstd-compressed tarball of a pre-authenticated Amazon Q config directory. |
|
||||||
|
| `install_amazon_q` | No | `true` | Whether to install Amazon Q. |
|
||||||
|
| `amazon_q_version` | No | `latest` | Version to install. |
|
||||||
|
| `experiment_use_screen` | No | `false` | Use GNU screen for background operation. |
|
||||||
|
| `experiment_use_tmux` | No | `false` | Use tmux for background operation. |
|
||||||
|
| `experiment_report_tasks` | No | `false` | Enable task reporting to Coder. |
|
||||||
|
| `experiment_pre_install_script` | No | `null` | Custom script to run before install. |
|
||||||
|
| `experiment_post_install_script` | No | `null` | Custom script to run after install. |
|
||||||
|
| `icon` | No | `/icon/amazon-q.svg` | The icon to use for the app. |
|
||||||
|
| `folder` | No | `/home/coder` | The folder to run Amazon Q in. |
|
||||||
|
| `order` | No | `null` | The order determines the position of app in the UI presentation. |
|
||||||
|
| `system_prompt` | No | See [main.tf](./main.tf) | The system prompt to use for Amazon Q. This should instruct the agent how to do task reporting. |
|
||||||
|
| `ai_prompt` | No | See [main.tf](./main.tf) | The initial task prompt to send to Amazon Q. |
|
||||||
|
|
||||||
|
## Notes
|
||||||
|
|
||||||
|
- Only one of `experiment_use_screen` or `experiment_use_tmux` can be true at a time.
|
||||||
|
- If neither is set, Amazon Q runs in the foreground.
|
||||||
|
- For more details, see the [main.tf](./main.tf) source.
|
||||||
41
registry/coder/modules/amazon-q/main.test.ts
Normal file
41
registry/coder/modules/amazon-q/main.test.ts
Normal file
@ -0,0 +1,41 @@
|
|||||||
|
import { describe, it, expect } from "bun:test";
|
||||||
|
import {
|
||||||
|
runTerraformApply,
|
||||||
|
runTerraformInit,
|
||||||
|
testRequiredVariables,
|
||||||
|
findResourceInstance,
|
||||||
|
} from "~test";
|
||||||
|
import path from "path";
|
||||||
|
|
||||||
|
const moduleDir = path.resolve(__dirname);
|
||||||
|
|
||||||
|
const requiredVars = {
|
||||||
|
agent_id: "dummy-agent-id",
|
||||||
|
};
|
||||||
|
|
||||||
|
describe("amazon-q module", async () => {
|
||||||
|
await runTerraformInit(moduleDir);
|
||||||
|
|
||||||
|
// 1. Required variables
|
||||||
|
testRequiredVariables(moduleDir, requiredVars);
|
||||||
|
|
||||||
|
// 2. coder_script resource is created
|
||||||
|
it("creates coder_script resource", async () => {
|
||||||
|
const state = await runTerraformApply(moduleDir, requiredVars);
|
||||||
|
const scriptResource = findResourceInstance(state, "coder_script");
|
||||||
|
expect(scriptResource).toBeDefined();
|
||||||
|
expect(scriptResource.agent_id).toBe(requiredVars.agent_id);
|
||||||
|
// Optionally, check that the script contains expected lines
|
||||||
|
expect(scriptResource.script).toContain("Installing Amazon Q");
|
||||||
|
});
|
||||||
|
|
||||||
|
// 3. coder_app resource is created
|
||||||
|
it("creates coder_app resource", async () => {
|
||||||
|
const state = await runTerraformApply(moduleDir, requiredVars);
|
||||||
|
const appResource = findResourceInstance(state, "coder_app", "amazon_q");
|
||||||
|
expect(appResource).toBeDefined();
|
||||||
|
expect(appResource.agent_id).toBe(requiredVars.agent_id);
|
||||||
|
});
|
||||||
|
|
||||||
|
// Add more state-based tests as needed
|
||||||
|
});
|
||||||
329
registry/coder/modules/amazon-q/main.tf
Normal file
329
registry/coder/modules/amazon-q/main.tf
Normal file
@ -0,0 +1,329 @@
|
|||||||
|
terraform {
|
||||||
|
required_version = ">= 1.0"
|
||||||
|
|
||||||
|
required_providers {
|
||||||
|
coder = {
|
||||||
|
source = "coder/coder"
|
||||||
|
version = ">= 0.17"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
variable "agent_id" {
|
||||||
|
type = string
|
||||||
|
description = "The ID of a Coder agent."
|
||||||
|
}
|
||||||
|
|
||||||
|
data "coder_workspace" "me" {}
|
||||||
|
|
||||||
|
data "coder_workspace_owner" "me" {}
|
||||||
|
|
||||||
|
variable "order" {
|
||||||
|
type = number
|
||||||
|
description = "The order determines the position of app in the UI presentation. The lowest order is shown first and apps with equal order are sorted by name (ascending order)."
|
||||||
|
default = null
|
||||||
|
}
|
||||||
|
|
||||||
|
variable "icon" {
|
||||||
|
type = string
|
||||||
|
description = "The icon to use for the app."
|
||||||
|
default = "/icon/amazon-q.svg"
|
||||||
|
}
|
||||||
|
|
||||||
|
variable "folder" {
|
||||||
|
type = string
|
||||||
|
description = "The folder to run Amazon Q in."
|
||||||
|
default = "/home/coder"
|
||||||
|
}
|
||||||
|
|
||||||
|
variable "install_amazon_q" {
|
||||||
|
type = bool
|
||||||
|
description = "Whether to install Amazon Q."
|
||||||
|
default = true
|
||||||
|
}
|
||||||
|
|
||||||
|
variable "amazon_q_version" {
|
||||||
|
type = string
|
||||||
|
description = "The version of Amazon Q to install."
|
||||||
|
default = "latest"
|
||||||
|
}
|
||||||
|
|
||||||
|
variable "experiment_use_screen" {
|
||||||
|
type = bool
|
||||||
|
description = "Whether to use screen for running Amazon Q in the background."
|
||||||
|
default = false
|
||||||
|
}
|
||||||
|
|
||||||
|
variable "experiment_use_tmux" {
|
||||||
|
type = bool
|
||||||
|
description = "Whether to use tmux instead of screen for running Amazon Q in the background."
|
||||||
|
default = false
|
||||||
|
}
|
||||||
|
|
||||||
|
variable "experiment_report_tasks" {
|
||||||
|
type = bool
|
||||||
|
description = "Whether to enable task reporting."
|
||||||
|
default = false
|
||||||
|
}
|
||||||
|
|
||||||
|
variable "experiment_pre_install_script" {
|
||||||
|
type = string
|
||||||
|
description = "Custom script to run before installing Amazon Q."
|
||||||
|
default = null
|
||||||
|
}
|
||||||
|
|
||||||
|
variable "experiment_post_install_script" {
|
||||||
|
type = string
|
||||||
|
description = "Custom script to run after installing Amazon Q."
|
||||||
|
default = null
|
||||||
|
}
|
||||||
|
|
||||||
|
variable "experiment_auth_tarball" {
|
||||||
|
type = string
|
||||||
|
description = "Base64 encoded, zstd compressed tarball of a pre-authenticated ~/.local/share/amazon-q directory. After running `q login` on another machine, you may generate it with: `cd ~/.local/share/amazon-q && tar -c . | zstd | base64 -w 0`"
|
||||||
|
default = "tarball"
|
||||||
|
}
|
||||||
|
|
||||||
|
variable "system_prompt" {
|
||||||
|
type = string
|
||||||
|
description = "The system prompt to use for Amazon Q. This should instruct the agent how to do task reporting."
|
||||||
|
default = <<-EOT
|
||||||
|
You are a helpful Coding assistant. Aim to autonomously investigate
|
||||||
|
and solve issues the user gives you and test your work, whenever possible.
|
||||||
|
Avoid shortcuts like mocking tests. When you get stuck, you can ask the user
|
||||||
|
but opt for autonomy.
|
||||||
|
|
||||||
|
YOU MUST REPORT ALL TASKS TO CODER.
|
||||||
|
When reporting tasks, you MUST follow these EXACT instructions:
|
||||||
|
- IMMEDIATELY report status after receiving ANY user message.
|
||||||
|
- Be granular. If you are investigating with multiple steps, report each step to coder.
|
||||||
|
|
||||||
|
Task state MUST be one of the following:
|
||||||
|
- Use "state": "working" when actively processing WITHOUT needing additional user input.
|
||||||
|
- Use "state": "complete" only when finished with a task.
|
||||||
|
- Use "state": "failure" when you need ANY user input, lack sufficient details, or encounter blockers.
|
||||||
|
|
||||||
|
Task summaries MUST:
|
||||||
|
- Include specifics about what you're doing.
|
||||||
|
- Include clear and actionable steps for the user.
|
||||||
|
- Be less than 160 characters in length.
|
||||||
|
EOT
|
||||||
|
}
|
||||||
|
|
||||||
|
variable "ai_prompt" {
|
||||||
|
type = string
|
||||||
|
description = "The initial task prompt to send to Amazon Q."
|
||||||
|
default = "Please help me with my coding tasks. I'll provide specific instructions as needed."
|
||||||
|
}
|
||||||
|
|
||||||
|
locals {
|
||||||
|
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) : ""
|
||||||
|
# We need to use allowed tools to limit the context Amazon Q receives.
|
||||||
|
# Amazon Q can't handle big contexts, and the `create_template_version` tool
|
||||||
|
# has a description that's too long.
|
||||||
|
mcp_json = <<EOT
|
||||||
|
{
|
||||||
|
"mcpServers": {
|
||||||
|
"coder": {
|
||||||
|
"command": "coder",
|
||||||
|
"args": ["exp", "mcp", "server", "--allowed-tools", "coder_report_task"],
|
||||||
|
"env": {
|
||||||
|
"CODER_MCP_APP_STATUS_SLUG": "amazon-q"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
EOT
|
||||||
|
encoded_mcp_json = base64encode(local.mcp_json)
|
||||||
|
full_prompt = <<-EOT
|
||||||
|
${var.system_prompt}
|
||||||
|
|
||||||
|
Your first task is:
|
||||||
|
|
||||||
|
${var.ai_prompt}
|
||||||
|
EOT
|
||||||
|
}
|
||||||
|
|
||||||
|
resource "coder_script" "amazon_q" {
|
||||||
|
agent_id = var.agent_id
|
||||||
|
display_name = "Amazon Q"
|
||||||
|
icon = var.icon
|
||||||
|
script = <<-EOT
|
||||||
|
#!/bin/bash
|
||||||
|
set -o errexit
|
||||||
|
set -o pipefail
|
||||||
|
|
||||||
|
command_exists() {
|
||||||
|
command -v "$1" >/dev/null 2>&1
|
||||||
|
}
|
||||||
|
|
||||||
|
if [ -n "${local.encoded_pre_install_script}" ]; then
|
||||||
|
echo "Running pre-install script..."
|
||||||
|
echo "${local.encoded_pre_install_script}" | base64 -d > /tmp/pre_install.sh
|
||||||
|
chmod +x /tmp/pre_install.sh
|
||||||
|
/tmp/pre_install.sh
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ "${var.install_amazon_q}" = "true" ]; then
|
||||||
|
echo "Installing Amazon Q..."
|
||||||
|
PREV_DIR="$PWD"
|
||||||
|
TMP_DIR="$(mktemp -d)"
|
||||||
|
cd "$TMP_DIR"
|
||||||
|
|
||||||
|
ARCH="$(uname -m)"
|
||||||
|
case "$ARCH" in
|
||||||
|
"x86_64")
|
||||||
|
Q_URL="https://desktop-release.q.us-east-1.amazonaws.com/${var.amazon_q_version}/q-x86_64-linux.zip"
|
||||||
|
;;
|
||||||
|
"aarch64"|"arm64")
|
||||||
|
Q_URL="https://desktop-release.codewhisperer.us-east-1.amazonaws.com/${var.amazon_q_version}/q-aarch64-linux.zip"
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
echo "Error: Unsupported architecture: $ARCH. Amazon Q only supports x86_64 and arm64."
|
||||||
|
exit 1
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
|
||||||
|
echo "Downloading Amazon Q for $ARCH..."
|
||||||
|
curl --proto '=https' --tlsv1.2 -sSf "$Q_URL" -o "q.zip"
|
||||||
|
unzip q.zip
|
||||||
|
./q/install.sh --no-confirm
|
||||||
|
cd "$PREV_DIR"
|
||||||
|
export PATH="$PATH:$HOME/.local/bin"
|
||||||
|
echo "Installed Amazon Q version: $(q --version)"
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo "Extracting auth tarball..."
|
||||||
|
PREV_DIR="$PWD"
|
||||||
|
echo "${var.experiment_auth_tarball}" | base64 -d > /tmp/auth.tar.zst
|
||||||
|
rm -rf ~/.local/share/amazon-q
|
||||||
|
mkdir -p ~/.local/share/amazon-q
|
||||||
|
cd ~/.local/share/amazon-q
|
||||||
|
tar -I zstd -xf /tmp/auth.tar.zst
|
||||||
|
rm /tmp/auth.tar.zst
|
||||||
|
cd "$PREV_DIR"
|
||||||
|
echo "Extracted auth tarball"
|
||||||
|
|
||||||
|
if [ -n "${local.encoded_post_install_script}" ]; then
|
||||||
|
echo "Running post-install script..."
|
||||||
|
echo "${local.encoded_post_install_script}" | base64 -d > /tmp/post_install.sh
|
||||||
|
chmod +x /tmp/post_install.sh
|
||||||
|
/tmp/post_install.sh
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ "${var.experiment_report_tasks}" = "true" ]; then
|
||||||
|
echo "Configuring Amazon Q to report tasks via Coder MCP..."
|
||||||
|
mkdir -p ~/.aws/amazonq
|
||||||
|
echo "${local.encoded_mcp_json}" | base64 -d > ~/.aws/amazonq/mcp.json
|
||||||
|
echo "Created the ~/.aws/amazonq/mcp.json configuration file"
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ "${var.experiment_use_tmux}" = "true" ] && [ "${var.experiment_use_screen}" = "true" ]; then
|
||||||
|
echo "Error: Both experiment_use_tmux and experiment_use_screen cannot be true simultaneously."
|
||||||
|
echo "Please set only one of them to true."
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ "${var.experiment_use_tmux}" = "true" ]; then
|
||||||
|
echo "Running Amazon Q in the background with tmux..."
|
||||||
|
|
||||||
|
if ! command_exists tmux; then
|
||||||
|
echo "Error: tmux is not installed. Please install tmux manually."
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
touch "$HOME/.amazon-q.log"
|
||||||
|
|
||||||
|
export LANG=en_US.UTF-8
|
||||||
|
export LC_ALL=en_US.UTF-8
|
||||||
|
|
||||||
|
tmux new-session -d -s amazon-q -c "${var.folder}" "q chat --trust-all-tools | tee -a "$HOME/.amazon-q.log" && exec bash"
|
||||||
|
|
||||||
|
tmux send-keys -t amazon-q "${local.full_prompt}"
|
||||||
|
sleep 5
|
||||||
|
tmux send-keys -t amazon-q Enter
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ "${var.experiment_use_screen}" = "true" ]; then
|
||||||
|
echo "Running Amazon Q in the background..."
|
||||||
|
|
||||||
|
if ! command_exists screen; then
|
||||||
|
echo "Error: screen is not installed. Please install screen manually."
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
touch "$HOME/.amazon-q.log"
|
||||||
|
|
||||||
|
if [ ! -f "$HOME/.screenrc" ]; then
|
||||||
|
echo "Creating ~/.screenrc and adding multiuser settings..." | tee -a "$HOME/.amazon-q.log"
|
||||||
|
echo -e "multiuser on\nacladd $(whoami)" > "$HOME/.screenrc"
|
||||||
|
fi
|
||||||
|
|
||||||
|
if ! grep -q "^multiuser on$" "$HOME/.screenrc"; then
|
||||||
|
echo "Adding 'multiuser on' to ~/.screenrc..." | tee -a "$HOME/.amazon-q.log"
|
||||||
|
echo "multiuser on" >> "$HOME/.screenrc"
|
||||||
|
fi
|
||||||
|
|
||||||
|
if ! grep -q "^acladd $(whoami)$" "$HOME/.screenrc"; then
|
||||||
|
echo "Adding 'acladd $(whoami)' to ~/.screenrc..." | tee -a "$HOME/.amazon-q.log"
|
||||||
|
echo "acladd $(whoami)" >> "$HOME/.screenrc"
|
||||||
|
fi
|
||||||
|
export LANG=en_US.UTF-8
|
||||||
|
export LC_ALL=en_US.UTF-8
|
||||||
|
|
||||||
|
screen -U -dmS amazon-q bash -c '
|
||||||
|
cd ${var.folder}
|
||||||
|
q chat --trust-all-tools | tee -a "$HOME/.amazon-q.log
|
||||||
|
exec bash
|
||||||
|
'
|
||||||
|
# Extremely hacky way to send the prompt to the screen session
|
||||||
|
# This will be fixed in the future, but `amazon-q` was not sending MCP
|
||||||
|
# tasks when an initial prompt is provided.
|
||||||
|
screen -S amazon-q -X stuff "${local.full_prompt}"
|
||||||
|
sleep 5
|
||||||
|
screen -S amazon-q -X stuff "^M"
|
||||||
|
else
|
||||||
|
if ! command_exists q; then
|
||||||
|
echo "Error: Amazon Q is not installed. Please enable install_amazon_q or install it manually."
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
EOT
|
||||||
|
run_on_start = true
|
||||||
|
}
|
||||||
|
|
||||||
|
resource "coder_app" "amazon_q" {
|
||||||
|
slug = "amazon-q"
|
||||||
|
display_name = "Amazon Q"
|
||||||
|
agent_id = var.agent_id
|
||||||
|
command = <<-EOT
|
||||||
|
#!/bin/bash
|
||||||
|
set -e
|
||||||
|
|
||||||
|
export LANG=en_US.UTF-8
|
||||||
|
export LC_ALL=en_US.UTF-8
|
||||||
|
|
||||||
|
if [ "${var.experiment_use_tmux}" = "true" ]; then
|
||||||
|
if tmux has-session -t amazon-q 2>/dev/null; then
|
||||||
|
echo "Attaching to existing Amazon Q tmux session." | tee -a "$HOME/.amazon-q.log"
|
||||||
|
tmux attach-session -t amazon-q
|
||||||
|
else
|
||||||
|
echo "Starting a new Amazon Q tmux session." | tee -a "$HOME/.amazon-q.log"
|
||||||
|
tmux new-session -s amazon-q -c ${var.folder} "q chat --trust-all-tools | tee -a \"$HOME/.amazon-q.log\"; exec bash"
|
||||||
|
fi
|
||||||
|
elif [ "${var.experiment_use_screen}" = "true" ]; then
|
||||||
|
if screen -list | grep -q "amazon-q"; then
|
||||||
|
echo "Attaching to existing Amazon Q screen session." | tee -a "$HOME/.amazon-q.log"
|
||||||
|
screen -xRR amazon-q
|
||||||
|
else
|
||||||
|
echo "Starting a new Amazon Q screen session." | tee -a "$HOME/.amazon-q.log"
|
||||||
|
screen -S amazon-q bash -c 'q chat --trust-all-tools | tee -a "$HOME/.amazon-q.log"; exec bash'
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
cd ${var.folder}
|
||||||
|
q chat --trust-all-tools
|
||||||
|
fi
|
||||||
|
EOT
|
||||||
|
icon = var.icon
|
||||||
|
}
|
||||||
Loading…
x
Reference in New Issue
Block a user