agent-relay 2.3.4 → 2.3.6
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 +1 -1
- package/dist/src/cli/index.js +124 -7
- package/dist/src/cli/index.js.map +1 -1
- package/package.json +23 -26
- package/packages/acp-bridge/package.json +2 -2
- package/packages/bridge/package.json +7 -7
- package/packages/config/package.json +2 -2
- package/packages/continuity/package.json +2 -2
- package/packages/daemon/package.json +12 -12
- package/packages/hooks/package.json +4 -4
- package/packages/mcp/package.json +5 -5
- package/packages/memory/package.json +2 -2
- package/packages/policy/package.json +2 -2
- package/packages/protocol/package.json +1 -1
- package/packages/resiliency/package.json +1 -1
- package/packages/sdk/dist/index.d.ts +1 -29
- package/packages/sdk/dist/index.d.ts.map +1 -1
- package/packages/sdk/dist/index.js +1 -38
- package/packages/sdk/dist/index.js.map +1 -1
- package/packages/sdk/package.json +4 -25
- package/packages/sdk/src/index.ts +1 -69
- package/packages/sdk-py/README.md +56 -0
- package/packages/sdk-py/pyproject.toml +23 -0
- package/packages/sdk-py/src/agent_relay/__init__.py +27 -0
- package/packages/sdk-py/src/agent_relay/builder.py +367 -0
- package/packages/sdk-py/src/agent_relay/types.py +92 -0
- package/packages/sdk-py/tests/__init__.py +0 -0
- package/packages/sdk-py/tests/test_builder.py +101 -0
- package/packages/sdk-ts/dist/index.d.ts +1 -0
- package/packages/sdk-ts/dist/index.d.ts.map +1 -1
- package/packages/sdk-ts/dist/index.js +1 -0
- package/packages/sdk-ts/dist/index.js.map +1 -1
- package/packages/sdk-ts/dist/workflows/barrier.d.ts +72 -0
- package/packages/sdk-ts/dist/workflows/barrier.d.ts.map +1 -0
- package/packages/sdk-ts/dist/workflows/barrier.js +162 -0
- package/packages/sdk-ts/dist/workflows/barrier.js.map +1 -0
- package/packages/sdk-ts/dist/workflows/builder.d.ts +101 -0
- package/packages/sdk-ts/dist/workflows/builder.d.ts.map +1 -0
- package/packages/sdk-ts/dist/workflows/builder.js +179 -0
- package/packages/sdk-ts/dist/workflows/builder.js.map +1 -0
- package/packages/sdk-ts/dist/workflows/cli.d.ts +10 -0
- package/packages/sdk-ts/dist/workflows/cli.d.ts.map +1 -0
- package/packages/sdk-ts/dist/workflows/cli.js +82 -0
- package/packages/sdk-ts/dist/workflows/cli.js.map +1 -0
- package/packages/sdk-ts/dist/workflows/coordinator.d.ts +68 -0
- package/packages/sdk-ts/dist/workflows/coordinator.d.ts.map +1 -0
- package/packages/sdk-ts/dist/workflows/coordinator.js +353 -0
- package/packages/sdk-ts/dist/workflows/coordinator.js.map +1 -0
- package/packages/sdk-ts/dist/workflows/index.d.ts +10 -0
- package/packages/sdk-ts/dist/workflows/index.d.ts.map +1 -0
- package/packages/sdk-ts/dist/workflows/index.js +10 -0
- package/packages/sdk-ts/dist/workflows/index.js.map +1 -0
- package/packages/sdk-ts/dist/workflows/memory-db.d.ts +17 -0
- package/packages/sdk-ts/dist/workflows/memory-db.d.ts.map +1 -0
- package/packages/sdk-ts/dist/workflows/memory-db.js +33 -0
- package/packages/sdk-ts/dist/workflows/memory-db.js.map +1 -0
- package/packages/sdk-ts/dist/workflows/run.d.ts +31 -0
- package/packages/sdk-ts/dist/workflows/run.d.ts.map +1 -0
- package/packages/sdk-ts/dist/workflows/run.js +24 -0
- package/packages/sdk-ts/dist/workflows/run.js.map +1 -0
- package/packages/sdk-ts/dist/workflows/runner.d.ts +119 -0
- package/packages/sdk-ts/dist/workflows/runner.d.ts.map +1 -0
- package/packages/sdk-ts/dist/workflows/runner.js +650 -0
- package/packages/sdk-ts/dist/workflows/runner.js.map +1 -0
- package/packages/sdk-ts/dist/workflows/state.d.ts +77 -0
- package/packages/sdk-ts/dist/workflows/state.d.ts.map +1 -0
- package/packages/sdk-ts/dist/workflows/state.js +140 -0
- package/packages/sdk-ts/dist/workflows/state.js.map +1 -0
- package/packages/sdk-ts/dist/workflows/templates.d.ts +47 -0
- package/packages/sdk-ts/dist/workflows/templates.d.ts.map +1 -0
- package/packages/sdk-ts/dist/workflows/templates.js +395 -0
- package/packages/sdk-ts/dist/workflows/templates.js.map +1 -0
- package/packages/sdk-ts/dist/workflows/types.d.ts +126 -0
- package/packages/sdk-ts/dist/workflows/types.d.ts.map +1 -0
- package/packages/sdk-ts/dist/workflows/types.js +8 -0
- package/packages/sdk-ts/dist/workflows/types.js.map +1 -0
- package/packages/sdk-ts/package.json +8 -2
- package/packages/sdk-ts/src/__tests__/error-scenarios.test.ts +682 -0
- package/packages/sdk-ts/src/__tests__/swarm-coordinator.test.ts +416 -0
- package/packages/sdk-ts/src/__tests__/workflow-runner.test.ts +333 -0
- package/packages/sdk-ts/src/index.ts +1 -0
- package/packages/sdk-ts/src/workflows/README.md +450 -0
- package/packages/sdk-ts/src/workflows/barrier.ts +254 -0
- package/packages/sdk-ts/src/workflows/builder.ts +241 -0
- package/packages/sdk-ts/src/workflows/builtin-templates/bug-fix.yaml +75 -0
- package/packages/sdk-ts/src/workflows/builtin-templates/code-review.yaml +82 -0
- package/packages/sdk-ts/src/workflows/builtin-templates/documentation.yaml +70 -0
- package/packages/sdk-ts/src/workflows/builtin-templates/feature-dev.yaml +76 -0
- package/packages/sdk-ts/src/workflows/builtin-templates/refactor.yaml +82 -0
- package/packages/sdk-ts/src/workflows/builtin-templates/security-audit.yaml +84 -0
- package/packages/sdk-ts/src/workflows/cli.ts +93 -0
- package/packages/sdk-ts/src/workflows/coordinator.ts +520 -0
- package/packages/sdk-ts/src/workflows/index.ts +9 -0
- package/packages/sdk-ts/src/workflows/memory-db.ts +39 -0
- package/packages/sdk-ts/src/workflows/run.ts +47 -0
- package/packages/sdk-ts/src/workflows/runner.ts +873 -0
- package/packages/sdk-ts/src/workflows/schema.json +321 -0
- package/packages/sdk-ts/src/workflows/state.ts +279 -0
- package/packages/sdk-ts/src/workflows/templates.ts +544 -0
- package/packages/sdk-ts/src/workflows/types.ts +178 -0
- package/packages/sdk-ts/tsconfig.json +6 -1
- package/packages/spawner/package.json +1 -1
- package/packages/state/package.json +1 -1
- package/packages/storage/package.json +2 -2
- package/packages/telemetry/package.json +1 -1
- package/packages/trajectory/package.json +2 -2
- package/packages/user-directory/package.json +2 -2
- package/packages/utils/package.json +3 -3
- package/packages/wrapper/package.json +5 -6
- package/packages/api-types/.trajectories/active/traj_xbsvuzogscey.json +0 -15
- package/packages/api-types/.trajectories/index.json +0 -12
- package/packages/api-types/dist/index.d.ts +0 -21
- package/packages/api-types/dist/index.d.ts.map +0 -1
- package/packages/api-types/dist/index.js +0 -22
- package/packages/api-types/dist/index.js.map +0 -1
- package/packages/api-types/dist/schemas/agent.d.ts +0 -259
- package/packages/api-types/dist/schemas/agent.d.ts.map +0 -1
- package/packages/api-types/dist/schemas/agent.js +0 -102
- package/packages/api-types/dist/schemas/agent.js.map +0 -1
- package/packages/api-types/dist/schemas/api.d.ts +0 -290
- package/packages/api-types/dist/schemas/api.d.ts.map +0 -1
- package/packages/api-types/dist/schemas/api.js +0 -162
- package/packages/api-types/dist/schemas/api.js.map +0 -1
- package/packages/api-types/dist/schemas/decision.d.ts +0 -230
- package/packages/api-types/dist/schemas/decision.d.ts.map +0 -1
- package/packages/api-types/dist/schemas/decision.js +0 -104
- package/packages/api-types/dist/schemas/decision.js.map +0 -1
- package/packages/api-types/dist/schemas/fleet.d.ts +0 -615
- package/packages/api-types/dist/schemas/fleet.d.ts.map +0 -1
- package/packages/api-types/dist/schemas/fleet.js +0 -71
- package/packages/api-types/dist/schemas/fleet.js.map +0 -1
- package/packages/api-types/dist/schemas/history.d.ts +0 -180
- package/packages/api-types/dist/schemas/history.d.ts.map +0 -1
- package/packages/api-types/dist/schemas/history.js +0 -72
- package/packages/api-types/dist/schemas/history.js.map +0 -1
- package/packages/api-types/dist/schemas/index.d.ts +0 -14
- package/packages/api-types/dist/schemas/index.d.ts.map +0 -1
- package/packages/api-types/dist/schemas/index.js +0 -22
- package/packages/api-types/dist/schemas/index.js.map +0 -1
- package/packages/api-types/dist/schemas/message.d.ts +0 -456
- package/packages/api-types/dist/schemas/message.d.ts.map +0 -1
- package/packages/api-types/dist/schemas/message.js +0 -88
- package/packages/api-types/dist/schemas/message.js.map +0 -1
- package/packages/api-types/dist/schemas/session.d.ts +0 -60
- package/packages/api-types/dist/schemas/session.d.ts.map +0 -1
- package/packages/api-types/dist/schemas/session.js +0 -36
- package/packages/api-types/dist/schemas/session.js.map +0 -1
- package/packages/api-types/dist/schemas/task.d.ts +0 -111
- package/packages/api-types/dist/schemas/task.d.ts.map +0 -1
- package/packages/api-types/dist/schemas/task.js +0 -64
- package/packages/api-types/dist/schemas/task.js.map +0 -1
- package/packages/api-types/package.json +0 -61
- package/packages/api-types/scripts/generate-openapi.ts +0 -106
- package/packages/api-types/src/index.ts +0 -22
- package/packages/api-types/src/schemas/agent.test.ts +0 -164
- package/packages/api-types/src/schemas/agent.ts +0 -110
- package/packages/api-types/src/schemas/api.test.ts +0 -372
- package/packages/api-types/src/schemas/api.ts +0 -194
- package/packages/api-types/src/schemas/decision.test.ts +0 -324
- package/packages/api-types/src/schemas/decision.ts +0 -136
- package/packages/api-types/src/schemas/fleet.test.ts +0 -212
- package/packages/api-types/src/schemas/fleet.ts +0 -83
- package/packages/api-types/src/schemas/history.test.ts +0 -242
- package/packages/api-types/src/schemas/history.ts +0 -84
- package/packages/api-types/src/schemas/index.ts +0 -148
- package/packages/api-types/src/schemas/message.test.ts +0 -192
- package/packages/api-types/src/schemas/message.ts +0 -98
- package/packages/api-types/src/schemas/session.test.ts +0 -104
- package/packages/api-types/src/schemas/session.ts +0 -40
- package/packages/api-types/src/schemas/task.test.ts +0 -192
- package/packages/api-types/src/schemas/task.ts +0 -78
- package/packages/api-types/tsconfig.json +0 -19
- package/packages/api-types/vitest.config.ts +0 -9
- package/packages/benchmark/README.md +0 -200
- package/packages/benchmark/datasets/coding-tasks.yaml +0 -127
- package/packages/benchmark/datasets/coordination-tasks.yaml +0 -122
- package/packages/benchmark/datasets/quick-test.yaml +0 -20
- package/packages/benchmark/dist/benchmark.d.ts +0 -47
- package/packages/benchmark/dist/benchmark.d.ts.map +0 -1
- package/packages/benchmark/dist/benchmark.js +0 -224
- package/packages/benchmark/dist/benchmark.js.map +0 -1
- package/packages/benchmark/dist/cli.d.ts +0 -8
- package/packages/benchmark/dist/cli.d.ts.map +0 -1
- package/packages/benchmark/dist/cli.js +0 -185
- package/packages/benchmark/dist/cli.js.map +0 -1
- package/packages/benchmark/dist/harbor.d.ts +0 -53
- package/packages/benchmark/dist/harbor.d.ts.map +0 -1
- package/packages/benchmark/dist/harbor.js +0 -127
- package/packages/benchmark/dist/harbor.js.map +0 -1
- package/packages/benchmark/dist/index.d.ts +0 -48
- package/packages/benchmark/dist/index.d.ts.map +0 -1
- package/packages/benchmark/dist/index.js +0 -50
- package/packages/benchmark/dist/index.js.map +0 -1
- package/packages/benchmark/dist/runners/base.d.ts +0 -63
- package/packages/benchmark/dist/runners/base.d.ts.map +0 -1
- package/packages/benchmark/dist/runners/base.js +0 -156
- package/packages/benchmark/dist/runners/base.js.map +0 -1
- package/packages/benchmark/dist/runners/index.d.ts +0 -10
- package/packages/benchmark/dist/runners/index.d.ts.map +0 -1
- package/packages/benchmark/dist/runners/index.js +0 -10
- package/packages/benchmark/dist/runners/index.js.map +0 -1
- package/packages/benchmark/dist/runners/single.d.ts +0 -19
- package/packages/benchmark/dist/runners/single.d.ts.map +0 -1
- package/packages/benchmark/dist/runners/single.js +0 -111
- package/packages/benchmark/dist/runners/single.js.map +0 -1
- package/packages/benchmark/dist/runners/subagent.d.ts +0 -32
- package/packages/benchmark/dist/runners/subagent.d.ts.map +0 -1
- package/packages/benchmark/dist/runners/subagent.js +0 -212
- package/packages/benchmark/dist/runners/subagent.js.map +0 -1
- package/packages/benchmark/dist/runners/swarm.d.ts +0 -36
- package/packages/benchmark/dist/runners/swarm.d.ts.map +0 -1
- package/packages/benchmark/dist/runners/swarm.js +0 -273
- package/packages/benchmark/dist/runners/swarm.js.map +0 -1
- package/packages/benchmark/dist/types.d.ts +0 -178
- package/packages/benchmark/dist/types.d.ts.map +0 -1
- package/packages/benchmark/dist/types.js +0 -16
- package/packages/benchmark/dist/types.js.map +0 -1
- package/packages/benchmark/package.json +0 -80
- package/packages/benchmark/src/benchmark.ts +0 -298
- package/packages/benchmark/src/cli.ts +0 -240
- package/packages/benchmark/src/harbor.ts +0 -170
- package/packages/benchmark/src/index.ts +0 -73
- package/packages/benchmark/src/runners/base.ts +0 -205
- package/packages/benchmark/src/runners/index.ts +0 -10
- package/packages/benchmark/src/runners/single.ts +0 -121
- package/packages/benchmark/src/runners/subagent.ts +0 -240
- package/packages/benchmark/src/runners/swarm.ts +0 -326
- package/packages/benchmark/src/types.ts +0 -205
- package/packages/benchmark/tsconfig.json +0 -20
- package/packages/cli-tester/README.md +0 -277
- package/packages/cli-tester/dist/index.d.ts +0 -21
- package/packages/cli-tester/dist/index.d.ts.map +0 -1
- package/packages/cli-tester/dist/index.js +0 -21
- package/packages/cli-tester/dist/index.js.map +0 -1
- package/packages/cli-tester/dist/utils/credential-check.d.ts +0 -56
- package/packages/cli-tester/dist/utils/credential-check.d.ts.map +0 -1
- package/packages/cli-tester/dist/utils/credential-check.js +0 -230
- package/packages/cli-tester/dist/utils/credential-check.js.map +0 -1
- package/packages/cli-tester/dist/utils/socket-client.d.ts +0 -76
- package/packages/cli-tester/dist/utils/socket-client.d.ts.map +0 -1
- package/packages/cli-tester/dist/utils/socket-client.js +0 -153
- package/packages/cli-tester/dist/utils/socket-client.js.map +0 -1
- package/packages/cli-tester/docker/Dockerfile +0 -61
- package/packages/cli-tester/docker/docker-compose.yml +0 -71
- package/packages/cli-tester/docker/entrypoint.sh +0 -58
- package/packages/cli-tester/package.json +0 -32
- package/packages/cli-tester/scripts/clear-auth.sh +0 -101
- package/packages/cli-tester/scripts/inject-message.sh +0 -42
- package/packages/cli-tester/scripts/start.sh +0 -71
- package/packages/cli-tester/scripts/test-cli.sh +0 -56
- package/packages/cli-tester/scripts/test-full-spawn.sh +0 -238
- package/packages/cli-tester/scripts/test-registration.sh +0 -182
- package/packages/cli-tester/scripts/test-setup-flow.sh +0 -202
- package/packages/cli-tester/scripts/test-spawn.sh +0 -140
- package/packages/cli-tester/scripts/test-with-daemon.sh +0 -247
- package/packages/cli-tester/scripts/verify-auth.sh +0 -112
- package/packages/cli-tester/src/index.ts +0 -40
- package/packages/cli-tester/src/utils/credential-check.ts +0 -284
- package/packages/cli-tester/src/utils/socket-client.ts +0 -211
- package/packages/cli-tester/tests/credential-check.test.ts +0 -56
- package/packages/cli-tester/tsconfig.json +0 -11
- package/packages/sdk/dist/browser-client.d.ts +0 -212
- package/packages/sdk/dist/browser-client.d.ts.map +0 -1
- package/packages/sdk/dist/browser-client.js +0 -750
- package/packages/sdk/dist/browser-client.js.map +0 -1
- package/packages/sdk/dist/browser-framing.d.ts +0 -46
- package/packages/sdk/dist/browser-framing.d.ts.map +0 -1
- package/packages/sdk/dist/browser-framing.js +0 -122
- package/packages/sdk/dist/browser-framing.js.map +0 -1
- package/packages/sdk/dist/standalone.d.ts +0 -89
- package/packages/sdk/dist/standalone.d.ts.map +0 -1
- package/packages/sdk/dist/standalone.js +0 -131
- package/packages/sdk/dist/standalone.js.map +0 -1
- package/packages/sdk/dist/transports/index.d.ts +0 -92
- package/packages/sdk/dist/transports/index.d.ts.map +0 -1
- package/packages/sdk/dist/transports/index.js +0 -129
- package/packages/sdk/dist/transports/index.js.map +0 -1
- package/packages/sdk/dist/transports/socket-transport.d.ts +0 -30
- package/packages/sdk/dist/transports/socket-transport.d.ts.map +0 -1
- package/packages/sdk/dist/transports/socket-transport.js +0 -94
- package/packages/sdk/dist/transports/socket-transport.js.map +0 -1
- package/packages/sdk/dist/transports/types.d.ts +0 -69
- package/packages/sdk/dist/transports/types.d.ts.map +0 -1
- package/packages/sdk/dist/transports/types.js +0 -10
- package/packages/sdk/dist/transports/types.js.map +0 -1
- package/packages/sdk/dist/transports/websocket-transport.d.ts +0 -55
- package/packages/sdk/dist/transports/websocket-transport.d.ts.map +0 -1
- package/packages/sdk/dist/transports/websocket-transport.js +0 -180
- package/packages/sdk/dist/transports/websocket-transport.js.map +0 -1
- package/packages/sdk/src/browser-client.ts +0 -985
- package/packages/sdk/src/browser-framing.test.ts +0 -115
- package/packages/sdk/src/browser-framing.ts +0 -150
- package/packages/sdk/src/standalone.ts +0 -183
- package/packages/sdk/src/transports/index.ts +0 -197
- package/packages/sdk/src/transports/socket-transport.ts +0 -115
- package/packages/sdk/src/transports/types.ts +0 -77
- package/packages/sdk/src/transports/websocket-transport.ts +0 -245
|
@@ -1,32 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"name": "@agent-relay/cli-tester",
|
|
3
|
-
"version": "2.3.4",
|
|
4
|
-
"description": "Manual interactive testing for CLI authentication flows",
|
|
5
|
-
"type": "module",
|
|
6
|
-
"main": "dist/index.js",
|
|
7
|
-
"types": "dist/index.d.ts",
|
|
8
|
-
"scripts": {
|
|
9
|
-
"build": "tsc",
|
|
10
|
-
"start": "./scripts/start.sh",
|
|
11
|
-
"start:clean": "./scripts/start.sh --clean",
|
|
12
|
-
"start:daemon": "./scripts/start.sh --daemon",
|
|
13
|
-
"docker:build": "docker compose -f docker/docker-compose.yml build",
|
|
14
|
-
"docker:up": "docker compose -f docker/docker-compose.yml up",
|
|
15
|
-
"docker:up:daemon": "docker compose -f docker/docker-compose.yml --profile daemon up",
|
|
16
|
-
"docker:down": "docker compose -f docker/docker-compose.yml down",
|
|
17
|
-
"test": "vitest run",
|
|
18
|
-
"test:watch": "vitest"
|
|
19
|
-
},
|
|
20
|
-
"keywords": [
|
|
21
|
-
"cli",
|
|
22
|
-
"testing",
|
|
23
|
-
"authentication",
|
|
24
|
-
"relay-pty"
|
|
25
|
-
],
|
|
26
|
-
"author": "Agent Workforce",
|
|
27
|
-
"license": "Apache-2.0",
|
|
28
|
-
"devDependencies": {
|
|
29
|
-
"typescript": "^5.3.3",
|
|
30
|
-
"vitest": "^1.2.0"
|
|
31
|
-
}
|
|
32
|
-
}
|
|
@@ -1,101 +0,0 @@
|
|
|
1
|
-
#!/bin/bash
|
|
2
|
-
# Clear CLI credentials for fresh testing
|
|
3
|
-
# Usage: ./clear-auth.sh <cli|all>
|
|
4
|
-
# Example: ./clear-auth.sh claude
|
|
5
|
-
# ./clear-auth.sh all
|
|
6
|
-
|
|
7
|
-
CLI=${1:-}
|
|
8
|
-
|
|
9
|
-
if [ -z "$CLI" ]; then
|
|
10
|
-
echo "Usage: ./clear-auth.sh <cli|all>"
|
|
11
|
-
echo ""
|
|
12
|
-
echo "Options:"
|
|
13
|
-
echo " claude - Clear Claude credentials"
|
|
14
|
-
echo " codex - Clear Codex credentials"
|
|
15
|
-
echo " gemini - Clear Gemini credentials"
|
|
16
|
-
echo " cursor - Clear Cursor credentials"
|
|
17
|
-
echo " opencode - Clear OpenCode credentials"
|
|
18
|
-
echo " droid - Clear Droid credentials"
|
|
19
|
-
echo " copilot - Clear GitHub Copilot credentials"
|
|
20
|
-
echo " all - Clear all credentials"
|
|
21
|
-
exit 1
|
|
22
|
-
fi
|
|
23
|
-
|
|
24
|
-
clear_cli() {
|
|
25
|
-
local cli=$1
|
|
26
|
-
local dir=""
|
|
27
|
-
local files=()
|
|
28
|
-
|
|
29
|
-
case $cli in
|
|
30
|
-
claude)
|
|
31
|
-
dir="$HOME/.claude"
|
|
32
|
-
files=(".credentials.json" "settings.json" "settings.local.json")
|
|
33
|
-
;;
|
|
34
|
-
codex)
|
|
35
|
-
dir="$HOME/.codex"
|
|
36
|
-
files=("auth.json" "config.json" "config.toml")
|
|
37
|
-
;;
|
|
38
|
-
gemini)
|
|
39
|
-
dir="$HOME/.gemini"
|
|
40
|
-
files=("credentials.json" "settings.json")
|
|
41
|
-
# Also check gcloud location
|
|
42
|
-
if [ -f "$HOME/.config/gcloud/application_default_credentials.json" ]; then
|
|
43
|
-
echo " Removing: $HOME/.config/gcloud/application_default_credentials.json"
|
|
44
|
-
rm -f "$HOME/.config/gcloud/application_default_credentials.json"
|
|
45
|
-
fi
|
|
46
|
-
;;
|
|
47
|
-
cursor|agent)
|
|
48
|
-
# Cursor CLI installs as 'agent', credentials in ~/.cursor/
|
|
49
|
-
dir="$HOME/.cursor"
|
|
50
|
-
files=("auth.json" "settings.json")
|
|
51
|
-
;;
|
|
52
|
-
opencode)
|
|
53
|
-
dir="$HOME/.local/share/opencode"
|
|
54
|
-
files=("auth.json")
|
|
55
|
-
;;
|
|
56
|
-
droid)
|
|
57
|
-
dir="$HOME/.droid"
|
|
58
|
-
files=("auth.json")
|
|
59
|
-
;;
|
|
60
|
-
copilot)
|
|
61
|
-
# GitHub Copilot uses gh CLI auth - stored in ~/.config/gh/
|
|
62
|
-
dir="$HOME/.config/gh"
|
|
63
|
-
files=("hosts.yml" "config.yml")
|
|
64
|
-
;;
|
|
65
|
-
*)
|
|
66
|
-
echo "Unknown CLI: $cli"
|
|
67
|
-
return 1
|
|
68
|
-
;;
|
|
69
|
-
esac
|
|
70
|
-
|
|
71
|
-
echo "Clearing credentials for: $cli"
|
|
72
|
-
|
|
73
|
-
if [ -d "$dir" ]; then
|
|
74
|
-
for file in "${files[@]}"; do
|
|
75
|
-
if [ -f "$dir/$file" ]; then
|
|
76
|
-
echo " Removing: $dir/$file"
|
|
77
|
-
rm -f "$dir/$file"
|
|
78
|
-
fi
|
|
79
|
-
done
|
|
80
|
-
echo " ✓ Done"
|
|
81
|
-
else
|
|
82
|
-
echo " (no config directory found)"
|
|
83
|
-
fi
|
|
84
|
-
}
|
|
85
|
-
|
|
86
|
-
echo "========================================"
|
|
87
|
-
echo " Clearing CLI Credentials"
|
|
88
|
-
echo "========================================"
|
|
89
|
-
echo ""
|
|
90
|
-
|
|
91
|
-
if [ "$CLI" = "all" ]; then
|
|
92
|
-
for c in claude codex gemini cursor opencode droid copilot; do
|
|
93
|
-
clear_cli "$c"
|
|
94
|
-
echo ""
|
|
95
|
-
done
|
|
96
|
-
else
|
|
97
|
-
clear_cli "$CLI"
|
|
98
|
-
fi
|
|
99
|
-
|
|
100
|
-
echo ""
|
|
101
|
-
echo "Credentials cleared. Run test-cli.sh to test fresh authentication."
|
|
@@ -1,42 +0,0 @@
|
|
|
1
|
-
#!/bin/bash
|
|
2
|
-
# Send a message to a CLI via relay-pty socket
|
|
3
|
-
# Usage: ./inject-message.sh <session-name> <message>
|
|
4
|
-
# Example: ./inject-message.sh test-claude "What is 2+2?"
|
|
5
|
-
|
|
6
|
-
NAME=${1:-test-claude}
|
|
7
|
-
MESSAGE=${2:-"Test message from inject script"}
|
|
8
|
-
SOCKET="/tmp/relay-pty-${NAME}.sock"
|
|
9
|
-
|
|
10
|
-
if [ ! -S "$SOCKET" ]; then
|
|
11
|
-
echo "Error: Socket not found: $SOCKET"
|
|
12
|
-
echo ""
|
|
13
|
-
echo "Make sure relay-pty is running with --name ${NAME}"
|
|
14
|
-
echo "Run: test-cli.sh ${NAME#test-}"
|
|
15
|
-
exit 1
|
|
16
|
-
fi
|
|
17
|
-
|
|
18
|
-
# Generate unique message ID
|
|
19
|
-
MSG_ID="manual-$(date +%s)-$RANDOM"
|
|
20
|
-
|
|
21
|
-
echo "Sending message to $NAME..."
|
|
22
|
-
echo " Socket: $SOCKET"
|
|
23
|
-
echo " Message ID: $MSG_ID"
|
|
24
|
-
echo " Body: $MESSAGE"
|
|
25
|
-
echo ""
|
|
26
|
-
|
|
27
|
-
# Build JSON request
|
|
28
|
-
REQUEST=$(cat <<EOF
|
|
29
|
-
{"type":"inject","id":"$MSG_ID","from":"Tester","body":"$MESSAGE","priority":0}
|
|
30
|
-
EOF
|
|
31
|
-
)
|
|
32
|
-
|
|
33
|
-
# Send request and read response
|
|
34
|
-
# nc -U connects to Unix socket, -q 1 waits 1 second for response
|
|
35
|
-
echo "$REQUEST" | nc -U "$SOCKET" -q 2 | while read -r line; do
|
|
36
|
-
if [ -n "$line" ]; then
|
|
37
|
-
echo "Response: $line" | jq '.' 2>/dev/null || echo "Response: $line"
|
|
38
|
-
fi
|
|
39
|
-
done
|
|
40
|
-
|
|
41
|
-
echo ""
|
|
42
|
-
echo "Message sent. Check the CLI session to see if it was delivered."
|
|
@@ -1,71 +0,0 @@
|
|
|
1
|
-
#!/bin/bash
|
|
2
|
-
# Start the CLI tester Docker environment
|
|
3
|
-
# Usage: ./start.sh [--clean] [--build] [--daemon]
|
|
4
|
-
|
|
5
|
-
set -e
|
|
6
|
-
|
|
7
|
-
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
8
|
-
PACKAGE_DIR="$(dirname "$SCRIPT_DIR")"
|
|
9
|
-
DOCKER_DIR="$PACKAGE_DIR/docker"
|
|
10
|
-
|
|
11
|
-
# Parse arguments
|
|
12
|
-
CLEAN=false
|
|
13
|
-
BUILD=false
|
|
14
|
-
WITH_DAEMON=false
|
|
15
|
-
while [[ $# -gt 0 ]]; do
|
|
16
|
-
case $1 in
|
|
17
|
-
--clean)
|
|
18
|
-
CLEAN=true
|
|
19
|
-
shift
|
|
20
|
-
;;
|
|
21
|
-
--build)
|
|
22
|
-
BUILD=true
|
|
23
|
-
shift
|
|
24
|
-
;;
|
|
25
|
-
--daemon)
|
|
26
|
-
WITH_DAEMON=true
|
|
27
|
-
shift
|
|
28
|
-
;;
|
|
29
|
-
*)
|
|
30
|
-
echo "Unknown option: $1"
|
|
31
|
-
echo "Usage: ./start.sh [--clean] [--build] [--daemon]"
|
|
32
|
-
echo " --clean Remove credential volumes before starting"
|
|
33
|
-
echo " --build Force rebuild of Docker image"
|
|
34
|
-
echo " --daemon Start with relay daemon for full integration testing"
|
|
35
|
-
exit 1
|
|
36
|
-
;;
|
|
37
|
-
esac
|
|
38
|
-
done
|
|
39
|
-
|
|
40
|
-
cd "$DOCKER_DIR"
|
|
41
|
-
|
|
42
|
-
# Clean volumes if requested
|
|
43
|
-
if [ "$CLEAN" = true ]; then
|
|
44
|
-
echo "Removing credential volumes..."
|
|
45
|
-
docker compose down -v 2>/dev/null || true
|
|
46
|
-
fi
|
|
47
|
-
|
|
48
|
-
# Build compose args
|
|
49
|
-
COMPOSE_ARGS=()
|
|
50
|
-
if [ "$WITH_DAEMON" = true ]; then
|
|
51
|
-
COMPOSE_ARGS+=(--profile daemon)
|
|
52
|
-
fi
|
|
53
|
-
|
|
54
|
-
# Build if requested or if image doesn't exist
|
|
55
|
-
if [ "$BUILD" = true ]; then
|
|
56
|
-
echo "Building Docker image..."
|
|
57
|
-
docker compose "${COMPOSE_ARGS[@]}" build
|
|
58
|
-
fi
|
|
59
|
-
|
|
60
|
-
# Start the container interactively
|
|
61
|
-
echo ""
|
|
62
|
-
if [ "$WITH_DAEMON" = true ]; then
|
|
63
|
-
echo "Starting CLI tester environment with daemon..."
|
|
64
|
-
echo "The daemon will be available at http://daemon:3377"
|
|
65
|
-
else
|
|
66
|
-
echo "Starting CLI tester environment..."
|
|
67
|
-
fi
|
|
68
|
-
echo "Use Ctrl+D or 'exit' to leave the container."
|
|
69
|
-
echo ""
|
|
70
|
-
|
|
71
|
-
docker compose "${COMPOSE_ARGS[@]}" run --rm cli-tester
|
|
@@ -1,56 +0,0 @@
|
|
|
1
|
-
#!/bin/bash
|
|
2
|
-
# Test a specific CLI with relay-pty
|
|
3
|
-
# Usage: ./test-cli.sh <cli> [extra-args...]
|
|
4
|
-
# Example: ./test-cli.sh claude
|
|
5
|
-
# ./test-cli.sh codex --device-auth
|
|
6
|
-
# DEBUG=1 ./test-cli.sh cursor
|
|
7
|
-
|
|
8
|
-
set -e
|
|
9
|
-
|
|
10
|
-
CLI=${1:-claude}
|
|
11
|
-
shift 2>/dev/null || true # Shift to get extra args, ignore if no more args
|
|
12
|
-
|
|
13
|
-
# Map CLI name to actual command (cursor installs as 'agent')
|
|
14
|
-
CLI_CMD="$CLI"
|
|
15
|
-
if [ "$CLI" = "cursor" ]; then
|
|
16
|
-
CLI_CMD="agent"
|
|
17
|
-
fi
|
|
18
|
-
|
|
19
|
-
NAME="test-${CLI}"
|
|
20
|
-
SOCKET="/tmp/relay-pty-${NAME}.sock"
|
|
21
|
-
|
|
22
|
-
# Remove stale socket if exists
|
|
23
|
-
rm -f "$SOCKET"
|
|
24
|
-
|
|
25
|
-
echo "========================================"
|
|
26
|
-
echo " Testing: $CLI"
|
|
27
|
-
echo "========================================"
|
|
28
|
-
echo ""
|
|
29
|
-
echo "Session name: $NAME"
|
|
30
|
-
echo "Socket path: $SOCKET"
|
|
31
|
-
echo ""
|
|
32
|
-
echo "After authenticating, open another terminal and run:"
|
|
33
|
-
echo " verify-auth.sh $CLI"
|
|
34
|
-
echo " inject-message.sh $NAME 'Hello world'"
|
|
35
|
-
echo ""
|
|
36
|
-
echo "Press Ctrl+C to stop the session."
|
|
37
|
-
echo "========================================"
|
|
38
|
-
echo ""
|
|
39
|
-
|
|
40
|
-
# Build relay-pty args
|
|
41
|
-
RELAY_ARGS=(
|
|
42
|
-
--name "$NAME"
|
|
43
|
-
--socket "$SOCKET"
|
|
44
|
-
--idle-timeout 500
|
|
45
|
-
)
|
|
46
|
-
|
|
47
|
-
# Add debug output if DEBUG is set
|
|
48
|
-
if [ -n "$DEBUG" ]; then
|
|
49
|
-
RELAY_ARGS+=(--json-output)
|
|
50
|
-
echo "[DEBUG] JSON output enabled - relay commands will be printed to stderr"
|
|
51
|
-
echo ""
|
|
52
|
-
fi
|
|
53
|
-
|
|
54
|
-
# Run relay-pty with the CLI
|
|
55
|
-
# Pass through any extra arguments to the CLI
|
|
56
|
-
exec relay-pty "${RELAY_ARGS[@]}" -- "$CLI_CMD" "$@"
|
|
@@ -1,238 +0,0 @@
|
|
|
1
|
-
#!/bin/bash
|
|
2
|
-
# Full spawn simulation - replicates the EXACT spawner flow
|
|
3
|
-
# This is the most accurate test for debugging registration timeouts
|
|
4
|
-
#
|
|
5
|
-
# Usage: ./test-full-spawn.sh <cli> [interactive]
|
|
6
|
-
# Example: ./test-full-spawn.sh cursor # Non-interactive (with --force)
|
|
7
|
-
# ./test-full-spawn.sh cursor true # Interactive (no --force, like setup terminal)
|
|
8
|
-
# DEBUG=1 ./test-full-spawn.sh cursor true
|
|
9
|
-
|
|
10
|
-
set -e
|
|
11
|
-
|
|
12
|
-
CLI=${1:-cursor}
|
|
13
|
-
INTERACTIVE=${2:-false}
|
|
14
|
-
|
|
15
|
-
# Map CLI to command
|
|
16
|
-
CLI_CMD="$CLI"
|
|
17
|
-
if [ "$CLI" = "cursor" ]; then
|
|
18
|
-
CLI_CMD="agent"
|
|
19
|
-
fi
|
|
20
|
-
|
|
21
|
-
# Generate name
|
|
22
|
-
if [ "$INTERACTIVE" = "true" ]; then
|
|
23
|
-
TIMESTAMP=$(date +%s | tail -c 8)
|
|
24
|
-
RANDOM_SUFFIX=$(head /dev/urandom | tr -dc 'a-z0-9' | head -c 4)
|
|
25
|
-
NAME="__setup__${CLI}-${TIMESTAMP}${RANDOM_SUFFIX}"
|
|
26
|
-
else
|
|
27
|
-
NAME="spawn-test-${CLI}"
|
|
28
|
-
fi
|
|
29
|
-
|
|
30
|
-
SOCKET="/tmp/relay-pty-${NAME}.sock"
|
|
31
|
-
LOG_FILE="/tmp/relay-spawn-${NAME}.log"
|
|
32
|
-
REGISTRATION_TIMEOUT=30
|
|
33
|
-
|
|
34
|
-
echo "========================================"
|
|
35
|
-
echo " Full Spawn Simulation: $CLI"
|
|
36
|
-
echo "========================================"
|
|
37
|
-
echo ""
|
|
38
|
-
echo "Mode: $([ "$INTERACTIVE" = "true" ] && echo "INTERACTIVE (setup terminal)" || echo "NON-INTERACTIVE (normal spawn)")"
|
|
39
|
-
echo ""
|
|
40
|
-
echo "Configuration:"
|
|
41
|
-
echo " CLI: $CLI_CMD"
|
|
42
|
-
echo " Agent name: $NAME"
|
|
43
|
-
echo " Interactive: $INTERACTIVE"
|
|
44
|
-
echo " Registration timeout: ${REGISTRATION_TIMEOUT}s"
|
|
45
|
-
echo ""
|
|
46
|
-
|
|
47
|
-
# Build CLI args based on mode
|
|
48
|
-
CLI_ARGS=()
|
|
49
|
-
if [ "$INTERACTIVE" != "true" ]; then
|
|
50
|
-
case $CLI in
|
|
51
|
-
cursor)
|
|
52
|
-
CLI_ARGS+=(--force)
|
|
53
|
-
echo " Adding: --force (non-interactive cursor)"
|
|
54
|
-
;;
|
|
55
|
-
claude)
|
|
56
|
-
CLI_ARGS+=(--dangerously-skip-permissions)
|
|
57
|
-
echo " Adding: --dangerously-skip-permissions (non-interactive claude)"
|
|
58
|
-
;;
|
|
59
|
-
copilot)
|
|
60
|
-
# Copilot uses device flow for headless auth
|
|
61
|
-
CLI_ARGS+=(auth login --device)
|
|
62
|
-
echo " Adding: auth login --device (non-interactive copilot)"
|
|
63
|
-
;;
|
|
64
|
-
codex)
|
|
65
|
-
# Codex supports device flow
|
|
66
|
-
CLI_ARGS+=(login --device-auth)
|
|
67
|
-
echo " Adding: login --device-auth (non-interactive codex)"
|
|
68
|
-
;;
|
|
69
|
-
esac
|
|
70
|
-
else
|
|
71
|
-
echo " No auto-accept flags (interactive mode)"
|
|
72
|
-
# For interactive copilot, still need auth login command
|
|
73
|
-
if [ "$CLI" = "copilot" ]; then
|
|
74
|
-
CLI_ARGS+=(auth login)
|
|
75
|
-
echo " Adding: auth login (interactive copilot)"
|
|
76
|
-
fi
|
|
77
|
-
fi
|
|
78
|
-
echo ""
|
|
79
|
-
|
|
80
|
-
# Cleanup
|
|
81
|
-
cleanup() {
|
|
82
|
-
echo ""
|
|
83
|
-
echo "========================================"
|
|
84
|
-
echo " Cleanup"
|
|
85
|
-
echo "========================================"
|
|
86
|
-
rm -f "$SOCKET"
|
|
87
|
-
if [ -n "$PTY_PID" ] && kill -0 $PTY_PID 2>/dev/null; then
|
|
88
|
-
echo "Stopping relay-pty (PID: $PTY_PID)..."
|
|
89
|
-
kill $PTY_PID 2>/dev/null || true
|
|
90
|
-
fi
|
|
91
|
-
echo ""
|
|
92
|
-
echo "Log file: $LOG_FILE"
|
|
93
|
-
if [ -f "$LOG_FILE" ]; then
|
|
94
|
-
echo ""
|
|
95
|
-
echo "Last 30 lines of output:"
|
|
96
|
-
echo "----------------------------------------"
|
|
97
|
-
tail -30 "$LOG_FILE"
|
|
98
|
-
echo "----------------------------------------"
|
|
99
|
-
fi
|
|
100
|
-
}
|
|
101
|
-
trap cleanup EXIT
|
|
102
|
-
|
|
103
|
-
# Remove stale files
|
|
104
|
-
rm -f "$SOCKET" "$LOG_FILE"
|
|
105
|
-
|
|
106
|
-
echo "========================================"
|
|
107
|
-
echo " Phase 1: Start PTY"
|
|
108
|
-
echo "========================================"
|
|
109
|
-
echo ""
|
|
110
|
-
|
|
111
|
-
# This is what spawner does: pty.start()
|
|
112
|
-
RELAY_ARGS=(
|
|
113
|
-
--name "$NAME"
|
|
114
|
-
--socket "$SOCKET"
|
|
115
|
-
--idle-timeout 300
|
|
116
|
-
)
|
|
117
|
-
|
|
118
|
-
if [ -n "$DEBUG" ]; then
|
|
119
|
-
RELAY_ARGS+=(--json-output)
|
|
120
|
-
fi
|
|
121
|
-
|
|
122
|
-
echo "[$(date +%T)] Starting: relay-pty ${RELAY_ARGS[*]} -- $CLI_CMD ${CLI_ARGS[*]}"
|
|
123
|
-
echo ""
|
|
124
|
-
|
|
125
|
-
# Start relay-pty and capture output
|
|
126
|
-
if [ ${#CLI_ARGS[@]} -gt 0 ]; then
|
|
127
|
-
relay-pty "${RELAY_ARGS[@]}" -- "$CLI_CMD" "${CLI_ARGS[@]}" > "$LOG_FILE" 2>&1 &
|
|
128
|
-
else
|
|
129
|
-
relay-pty "${RELAY_ARGS[@]}" -- "$CLI_CMD" > "$LOG_FILE" 2>&1 &
|
|
130
|
-
fi
|
|
131
|
-
PTY_PID=$!
|
|
132
|
-
|
|
133
|
-
echo "[$(date +%T)] PTY started (PID: $PTY_PID)"
|
|
134
|
-
|
|
135
|
-
# Brief wait for startup
|
|
136
|
-
sleep 1
|
|
137
|
-
|
|
138
|
-
if ! kill -0 $PTY_PID 2>/dev/null; then
|
|
139
|
-
echo "[$(date +%T)] ERROR: PTY exited immediately!"
|
|
140
|
-
echo ""
|
|
141
|
-
cat "$LOG_FILE"
|
|
142
|
-
exit 1
|
|
143
|
-
fi
|
|
144
|
-
|
|
145
|
-
echo "[$(date +%T)] PTY is running"
|
|
146
|
-
echo ""
|
|
147
|
-
|
|
148
|
-
echo "========================================"
|
|
149
|
-
echo " Phase 2: Wait for Registration"
|
|
150
|
-
echo "========================================"
|
|
151
|
-
echo ""
|
|
152
|
-
echo "In the real spawner, this calls waitForAgentRegistration()"
|
|
153
|
-
echo "which polls connected-agents.json and agents.json for ${REGISTRATION_TIMEOUT}s"
|
|
154
|
-
echo ""
|
|
155
|
-
echo "Without a daemon, these files won't be updated, causing timeout."
|
|
156
|
-
echo "But we can still see if the CLI starts successfully."
|
|
157
|
-
echo ""
|
|
158
|
-
|
|
159
|
-
# Simulate the spawner's registration polling
|
|
160
|
-
START_TIME=$(date +%s)
|
|
161
|
-
POLL_COUNT=0
|
|
162
|
-
|
|
163
|
-
while true; do
|
|
164
|
-
POLL_COUNT=$((POLL_COUNT + 1))
|
|
165
|
-
CURRENT_TIME=$(date +%s)
|
|
166
|
-
ELAPSED=$((CURRENT_TIME - START_TIME))
|
|
167
|
-
|
|
168
|
-
# Check if PTY is still running
|
|
169
|
-
if ! kill -0 $PTY_PID 2>/dev/null; then
|
|
170
|
-
echo ""
|
|
171
|
-
echo "[$(date +%T)] PTY exited after ${ELAPSED}s (${POLL_COUNT} polls)"
|
|
172
|
-
echo ""
|
|
173
|
-
echo "Exit could be normal (auth complete) or an error."
|
|
174
|
-
echo "Check log output below."
|
|
175
|
-
exit 0
|
|
176
|
-
fi
|
|
177
|
-
|
|
178
|
-
# Check socket status
|
|
179
|
-
SOCKET_STATUS="no socket"
|
|
180
|
-
if [ -S "$SOCKET" ]; then
|
|
181
|
-
RESPONSE=$(echo '{"type":"status"}' | timeout 1 nc -U "$SOCKET" 2>/dev/null | head -1 || echo "")
|
|
182
|
-
if [ -n "$RESPONSE" ]; then
|
|
183
|
-
IDLE=$(echo "$RESPONSE" | grep -o '"agent_idle":[^,}]*' | cut -d: -f2 || echo "?")
|
|
184
|
-
QUEUE=$(echo "$RESPONSE" | grep -o '"queue_length":[^,}]*' | cut -d: -f2 || echo "?")
|
|
185
|
-
SOCKET_STATUS="idle=$IDLE queue=$QUEUE"
|
|
186
|
-
else
|
|
187
|
-
SOCKET_STATUS="no response"
|
|
188
|
-
fi
|
|
189
|
-
fi
|
|
190
|
-
|
|
191
|
-
# Log poll (like spawner does for first 3 and every 10th)
|
|
192
|
-
if [ $POLL_COUNT -le 3 ] || [ $((POLL_COUNT % 10)) -eq 0 ]; then
|
|
193
|
-
echo "[$(date +%T)] Poll #$POLL_COUNT: elapsed=${ELAPSED}s socket=[$SOCKET_STATUS]"
|
|
194
|
-
fi
|
|
195
|
-
|
|
196
|
-
# Check registration timeout (what spawner does)
|
|
197
|
-
if [ $ELAPSED -ge $REGISTRATION_TIMEOUT ]; then
|
|
198
|
-
echo ""
|
|
199
|
-
echo "========================================"
|
|
200
|
-
echo " REGISTRATION TIMEOUT (${REGISTRATION_TIMEOUT}s)"
|
|
201
|
-
echo "========================================"
|
|
202
|
-
echo ""
|
|
203
|
-
echo "This is where the real spawner would fail with:"
|
|
204
|
-
echo " 'Agent registration timeout'"
|
|
205
|
-
echo ""
|
|
206
|
-
echo "The CLI started but didn't register with daemon."
|
|
207
|
-
echo ""
|
|
208
|
-
echo "Possible causes:"
|
|
209
|
-
if [ "$INTERACTIVE" = "true" ]; then
|
|
210
|
-
echo " 1. CLI is waiting for user input (trust prompt, auth)"
|
|
211
|
-
echo " 2. No daemon running to register with"
|
|
212
|
-
echo " 3. CLI crashed silently"
|
|
213
|
-
else
|
|
214
|
-
echo " 1. --force flag not working as expected"
|
|
215
|
-
echo " 2. No daemon running to register with"
|
|
216
|
-
echo " 3. CLI has other blocking prompts"
|
|
217
|
-
fi
|
|
218
|
-
echo ""
|
|
219
|
-
echo "To see what the CLI is doing, check the log file:"
|
|
220
|
-
echo " cat $LOG_FILE"
|
|
221
|
-
echo ""
|
|
222
|
-
echo "Or tail it live in another terminal:"
|
|
223
|
-
echo " tail -f $LOG_FILE"
|
|
224
|
-
echo ""
|
|
225
|
-
|
|
226
|
-
# Show recent output
|
|
227
|
-
echo "Recent output (last 20 lines):"
|
|
228
|
-
echo "----------------------------------------"
|
|
229
|
-
tail -20 "$LOG_FILE" 2>/dev/null || echo "(no output)"
|
|
230
|
-
echo "----------------------------------------"
|
|
231
|
-
echo ""
|
|
232
|
-
echo "Process is still running. Press Enter to stop."
|
|
233
|
-
read -r
|
|
234
|
-
exit 1
|
|
235
|
-
fi
|
|
236
|
-
|
|
237
|
-
sleep 0.5
|
|
238
|
-
done
|