@@ -5,6 +5,7 @@ SCRIPT_DIR=$(dirname "${BASH_SOURCE[0]}")
5
5
source " ${SCRIPT_DIR} /lib.sh"
6
6
7
7
CODER_BIN=${CODER_BIN:- " $( which coder) " }
8
+ AGENTAPI_SLUG=${AGENTAPI_SLUG:- " " }
8
9
9
10
[[-n ${VERBOSE:- } ]]&& set -x
10
11
set -euo pipefail
@@ -28,8 +29,45 @@ create() {
28
29
}
29
30
30
31
prompt () {
32
+ if [[-z " ${AGENTAPI_SLUG} " ]]; then
33
+ prompt_ssh
34
+ else
35
+ prompt_agentapi
36
+ fi
37
+ }
38
+
39
+ prompt_ssh () {
31
40
requiredenvs CODER_URL CODER_SESSION_TOKEN WORKSPACE_NAME PROMPT
32
41
42
+ # For sanity, use OpenSSH with coder config-ssh.
43
+ OPENSSH_CONFIG_FILE=/tmp/coder-ssh.config
44
+ " ${CODER_BIN} " \
45
+ config-ssh \
46
+ --url" ${CODER_URL} " \
47
+ --token" ${CODER_SESSION_TOKEN} " \
48
+ --ssh-config-file=" ${OPENSSH_CONFIG_FILE} " \
49
+ --yes
50
+
51
+ # Write prompt to a file in the workspace
52
+ ssh \
53
+ -F /tmp/coder-ssh.config \
54
+ " ${WORKSPACE_NAME} .coder" \
55
+ -- \
56
+ " cat > /tmp/prompt.txt" <<< " ${PROMPT}"
57
+
58
+ # Execute claude over SSH
59
+ # Note: use of cat to work around claude-code#7357
60
+ ssh \
61
+ -F /tmp/coder-ssh.config \
62
+ " ${WORKSPACE_NAME} .coder" \
63
+ -- \
64
+ " cat /tmp/prompt.txt |\"\$ {HOME}\" /.local/bin/claude --print --verbose --output-format=stream-json"
65
+ exit 0
66
+ }
67
+
68
+ prompt_agentapi () {
69
+ requiredenvs CODER_URL CODER_SESSION_TOKEN WORKSPACE_NAME AGENTAPI_SLUG PROMPT
70
+
33
71
wait
34
72
35
73
username=$( curl \
@@ -54,7 +92,7 @@ prompt() {
54
92
--request POST \
55
93
--show-error \
56
94
--silent \
57
- " ${CODER_URL} /@${username} /${WORKSPACE_NAME} /apps/agentapi /message" | jq -r' .ok' )
95
+ " ${CODER_URL} /@${username} /${WORKSPACE_NAME} /apps/${AGENTAPI_SLUG} /message" | jq -r' .ok' )
58
96
if [[" ${response} " != " true" ]]; then
59
97
echo " Failed to send prompt"
60
98
exit 1