summaryrefslogtreecommitdiffhomepage
path: root/bin
diff options
context:
space:
mode:
authorAdam Malczewski <[email protected]>2026-05-20 15:43:07 +0900
committerAdam Malczewski <[email protected]>2026-05-20 15:43:07 +0900
commit971a8f775d5e89e484e56a575e8ae2706fe2b53f (patch)
treed11f6cbbf230d73e53dee0db09e535dea9717599 /bin
parentadc8bd185b54935e7a31aae04da3175b7989927a (diff)
downloaddispatch-971a8f775d5e89e484e56a575e8ae2706fe2b53f.tar.gz
dispatch-971a8f775d5e89e484e56a575e8ae2706fe2b53f.zip
fix: sidebar layout, copilot auth script, config setup
- Sidebar uses absolute inset-0 with overflow-y-auto for proper scrolling - Border moved to inner div so it hides with sidebar - Copilot auth script uses portable sed instead of grep -P (macOS compat) - dispatch.toml with 3 keys, 4 models, fallback order - .env.dispatch with key placeholders and script reference - docker-compose loads .env.dispatch via env_file
Diffstat (limited to 'bin')
-rwxr-xr-xbin/copilot-auth84
1 files changed, 84 insertions, 0 deletions
diff --git a/bin/copilot-auth b/bin/copilot-auth
new file mode 100755
index 0000000..28d08a1
--- /dev/null
+++ b/bin/copilot-auth
@@ -0,0 +1,84 @@
+#!/usr/bin/env bash
+set -euo pipefail
+
+CLIENT_ID="Ov23li8tweQw6odWQebz"
+ENV_FILE="$(cd "$(dirname "$0")/.." && pwd)/.env.dispatch"
+
+# Parse form-encoded key=value pairs
+parse() {
+ local key="$1" data="$2"
+ local val
+ val=$(echo "$data" | sed -n "s/.*${key}=\([^&]*\).*/\1/p")
+ python3 -c "import sys,urllib.parse; print(urllib.parse.unquote(sys.stdin.read().strip()))" <<< "$val"
+}
+
+echo "=== GitHub Copilot OAuth ==="
+echo ""
+
+# Step 1: Request device code
+echo "Requesting device code..."
+RESP=$(curl -s https://github.com/login/device/code \
+ -d "client_id=$CLIENT_ID" \
+ -d "scope=read:user")
+
+DEVICE_CODE=$(parse "device_code" "$RESP")
+
+if [ -z "$DEVICE_CODE" ]; then
+ echo "Failed to get device code: $RESP"
+ exit 1
+fi
+
+USER_CODE=$(parse "user_code" "$RESP")
+VERIF_URI=$(parse "verification_uri" "$RESP")
+INTERVAL=$(parse "interval" "$RESP")
+INTERVAL=${INTERVAL:-5}
+
+echo ""
+echo "Open this URL and enter the code:"
+echo " $VERIF_URI"
+echo " Code: $USER_CODE"
+echo ""
+echo "Waiting for you to authorize..."
+
+# Step 2: Poll for access token
+TOKEN=""
+ATTEMPTS=0
+while [ -z "$TOKEN" ] && [ $ATTEMPTS -lt 60 ]; do
+ sleep "$INTERVAL"
+ ATTEMPTS=$((ATTEMPTS + 1))
+
+ TOKEN_RESP=$(curl -s https://github.com/login/oauth/access_token \
+ -d "client_id=$CLIENT_ID" \
+ -d "device_code=$DEVICE_CODE" \
+ -d "grant_type=urn:ietf:params:oauth:grant-type:device_code")
+
+ TOKEN=$(parse "access_token" "$TOKEN_RESP" || true)
+ ERROR=$(parse "error" "$TOKEN_RESP" || true)
+
+ if [ "$ERROR" = "authorization_pending" ]; then
+ continue
+ elif [ "$ERROR" = "slow_down" ]; then
+ INTERVAL=$((INTERVAL + 5))
+ continue
+ elif [ -n "$ERROR" ]; then
+ echo "Error: $ERROR"
+ exit 1
+ fi
+done
+
+if [ -z "$TOKEN" ]; then
+ echo "Timed out waiting for authorization."
+ exit 1
+fi
+
+# Step 3: Write to .env.dispatch
+mkdir -p "$(dirname "$ENV_FILE")"
+if [ -f "$ENV_FILE" ] && grep -q "^COPILOT_TOKEN=" "$ENV_FILE" 2>/dev/null; then
+ sed -i "s/^COPILOT_TOKEN=.*/COPILOT_TOKEN=$TOKEN/" "$ENV_FILE"
+else
+ echo "COPILOT_TOKEN=$TOKEN" >> "$ENV_FILE"
+fi
+
+echo ""
+echo "Token saved to .env.dispatch"
+echo "Ready — run: docker compose up"