Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
29 commits
Select commit Hold shift + click to select a range
026aa97
fix security issue with playwright/test 1.49.1 (#6592)
vhvb1989 Jan 23, 2026
cb20d72
Merge branch 'main' of https://github.com/Azure/azure-dev
vhvb1989 Jan 23, 2026
6335069
Merge branch 'main' of https://github.com/Azure/azure-dev
vhvb1989 Jan 24, 2026
3696c9f
Checkpoint from VS Code for cloud agent session
vhvb1989 Jan 24, 2026
193532d
Update parameter popup border color to cyan in concurX extension
Copilot Jan 24, 2026
c60594d
Complete concurX parameter popup color update
Copilot Jan 24, 2026
1ab8ca4
cspell
vhvb1989 Jan 24, 2026
4640197
Merge branch 'copilot/vscode-mkrqfyvm-kps6' of https://github.com/Azu…
vhvb1989 Jan 24, 2026
2d99040
Remove unintended changes to azure.ai.finetune extension
Copilot Jan 24, 2026
6f1b3f6
azure.ai.agents - Set `CGO_ENABLED=0` for x64 Linux build (#6611)
JeffreyCA Jan 26, 2026
3bee29e
Bump version to 0.1.8-preview (#6613)
JeffreyCA Jan 26, 2026
2b2b50c
Extension update fixes/enhancements (#6604)
Copilot Jan 26, 2026
0061e60
Fix bicep CLI uninitialized path in container app deployments (#6610)
Copilot Jan 26, 2026
4b1f840
Add azure.ai.agent 0.1.8-preview to registry (#6615)
JeffreyCA Jan 26, 2026
a3f52af
Release 1.23.2 (#6616)
Copilot Jan 26, 2026
7046a61
Increment CLI version after release (#6617)
azure-sdk Jan 27, 2026
d3bdb4d
Migrate to use new shared eng package (#6600)
bwateratmsft Jan 27, 2026
b96cb28
Fix VS Code extension commands failing with undefined fsPath in virtu…
Copilot Jan 27, 2026
7f0d907
Add missing keys to `azd config options` (#6619)
Copilot Jan 27, 2026
3fd6e76
Raising for missing method type (#6628)
achauhan-scc Jan 28, 2026
ec6e3f2
RFT grader fixes (#6629)
achauhan-scc Jan 28, 2026
3369e1d
including .14-preview to main registry (#6630)
achauhan-scc Jan 28, 2026
d8a388b
Add a naive attempt at downloading manifest (#6631)
trangevi Jan 29, 2026
e4f6d36
Dev container feature - allow installing extensions (#6460)
stuartleeks Jan 29, 2026
e6967ca
Enable full figspec generation for extensions with metadata capabilit…
Copilot Jan 29, 2026
0bb1b56
Add concurX binary to gitignore
Copilot Jan 29, 2026
49d809e
Merge branch 'main' of https://github.com/Azure/azure-dev into copilo…
vhvb1989 Jan 29, 2026
5cab4b0
lint
vhvb1989 Jan 29, 2026
11b9885
Update TestAskerConsoleExternalPrompt to use new external prompt mech…
Copilot Jan 30, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -71,3 +71,6 @@ cli/azd/extensions/microsoft.azd.concurx/microsoft.azd.concurx
cli/azd/extensions/microsoft.azd.concurx/microsoft.azd.concurx.exe
cli/azd/azd-test
cli/azd/azd
cli/azd/extensions/microsoft.azd.concurx/concurx
cli/azd/extensions/microsoft.azd.concurx/concurx
cli/azd/extensions/microsoft.azd.concurx/concurx.exe
3 changes: 3 additions & 0 deletions cli/azd/.vscode/cspell.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -304,6 +304,9 @@ overrides:
- filename: extensions/microsoft.azd.demo/internal/cmd/metadata.go
words:
- invopop
- filename: extensions/microsoft.azd.concurx/internal/cmd/prompt_model.go
words:
- textinput
ignorePaths:
- "**/*_test.go"
- "**/mock*.go"
Expand Down
15 changes: 14 additions & 1 deletion cli/azd/cmd/container.go
Original file line number Diff line number Diff line change
Expand Up @@ -135,11 +135,24 @@ func registerCommonDependencies(container *ioc.NestedContainer) {
isTerminal := cmd.OutOrStdout() == os.Stdout &&
cmd.InOrStdin() == os.Stdin && terminal.IsTerminal(os.Stdout.Fd(), os.Stdin.Fd())

// Check for external prompt configuration from environment variables
var externalPromptCfg *input.ExternalPromptConfiguration
if endpoint := os.Getenv("AZD_UI_PROMPT_ENDPOINT"); endpoint != "" {
if key := os.Getenv("AZD_UI_PROMPT_KEY"); key != "" {
externalPromptCfg = &input.ExternalPromptConfiguration{
Endpoint: endpoint,
Key: key,
Transporter: http.DefaultClient,
NoPromptDialog: os.Getenv("AZD_UI_NO_PROMPT_DIALOG") != "",
}
}
}

return input.NewConsole(rootOptions.NoPrompt, isTerminal, input.Writers{Output: writer}, input.ConsoleHandles{
Stdin: cmd.InOrStdin(),
Stdout: cmd.OutOrStdout(),
Stderr: cmd.ErrOrStderr(),
}, formatter, nil)
}, formatter, externalPromptCfg)
})

container.MustRegisterSingleton(
Expand Down
160 changes: 160 additions & 0 deletions cli/azd/cmd/external_prompt_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,160 @@
// Copyright (c) Microsoft Corporation. All rights reserved.
// Licensed under the MIT License.

package cmd

import (
"encoding/json"
"net/http"
"net/http/httptest"
"os"
"testing"

"github.com/azure/azure-dev/cli/azd/internal"
"github.com/azure/azure-dev/cli/azd/pkg/input"
"github.com/azure/azure-dev/cli/azd/pkg/output"
"github.com/spf13/cobra"
"github.com/stretchr/testify/require"
)

// TestExternalPromptFromEnvironmentVariables verifies that the console reads
// AZD_UI_PROMPT_ENDPOINT and AZD_UI_PROMPT_KEY environment variables and
// configures external prompting accordingly.
func TestExternalPromptFromEnvironmentVariables(t *testing.T) {
// Create a test HTTP server that simulates the external prompt endpoint
server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
// Return a success response
w.Header().Set("Content-Type", "application/json")
json.NewEncoder(w).Encode(map[string]any{
"status": "success",
"value": "test-response",
})
}))
defer server.Close()

testKey := "test-secret-key-12345"

// Set environment variables
t.Setenv("AZD_UI_PROMPT_ENDPOINT", server.URL)
t.Setenv("AZD_UI_PROMPT_KEY", testKey)

// Create a mock cobra command
cmd := &cobra.Command{}
cmd.SetIn(os.Stdin)
cmd.SetOut(os.Stdout)
cmd.SetErr(os.Stderr)

// Create root options
rootOptions := &internal.GlobalCommandOptions{
NoPrompt: false,
}

// Create formatter
var formatter output.Formatter = nil

// This simulates what happens in container.go when registering the console
writer := cmd.OutOrStdout()

isTerminal := false // Force non-terminal for test

// Check for external prompt configuration from environment variables
// (This is the code we added to container.go)
var externalPromptCfg *input.ExternalPromptConfiguration
if endpoint := os.Getenv("AZD_UI_PROMPT_ENDPOINT"); endpoint != "" {
if key := os.Getenv("AZD_UI_PROMPT_KEY"); key != "" {
externalPromptCfg = &input.ExternalPromptConfiguration{
Endpoint: endpoint,
Key: key,
Transporter: http.DefaultClient,
}
}
}

// Verify the config was created
require.NotNil(t, externalPromptCfg, "External prompt config should be created from env vars")
require.Equal(t, server.URL, externalPromptCfg.Endpoint)
require.Equal(t, testKey, externalPromptCfg.Key)
require.NotNil(t, externalPromptCfg.Transporter)

// Create the console with external prompting configured
console := input.NewConsole(
rootOptions.NoPrompt,
isTerminal,
input.Writers{Output: writer},
input.ConsoleHandles{
Stdin: cmd.InOrStdin(),
Stdout: cmd.OutOrStdout(),
Stderr: cmd.ErrOrStderr(),
},
formatter,
externalPromptCfg,
)

require.NotNil(t, console)

// Note: Actually testing that the console uses external prompting would require
// calling Prompt/Select/Confirm methods, which is tested in console_test.go
// This test verifies the environment variable reading logic works correctly.
}

// TestExternalPromptNotConfiguredWithoutEnvVars verifies that when the
// environment variables are not set, no external prompt config is created.
func TestExternalPromptNotConfiguredWithoutEnvVars(t *testing.T) {
// Ensure env vars are not set
os.Unsetenv("AZD_UI_PROMPT_ENDPOINT")
os.Unsetenv("AZD_UI_PROMPT_KEY")

// Check for external prompt configuration from environment variables
var externalPromptCfg *input.ExternalPromptConfiguration
if endpoint := os.Getenv("AZD_UI_PROMPT_ENDPOINT"); endpoint != "" {
if key := os.Getenv("AZD_UI_PROMPT_KEY"); key != "" {
externalPromptCfg = &input.ExternalPromptConfiguration{
Endpoint: endpoint,
Key: key,
Transporter: http.DefaultClient,
}
}
}

require.Nil(t, externalPromptCfg, "External prompt config should be nil when env vars not set")
}

// TestExternalPromptRequiresBothEnvVars verifies that both environment
// variables must be set for external prompting to be configured.
func TestExternalPromptRequiresBothEnvVars(t *testing.T) {
t.Run("only endpoint set", func(t *testing.T) {
t.Setenv("AZD_UI_PROMPT_ENDPOINT", "http://localhost:8080")
os.Unsetenv("AZD_UI_PROMPT_KEY")

var externalPromptCfg *input.ExternalPromptConfiguration
if endpoint := os.Getenv("AZD_UI_PROMPT_ENDPOINT"); endpoint != "" {
if key := os.Getenv("AZD_UI_PROMPT_KEY"); key != "" {
externalPromptCfg = &input.ExternalPromptConfiguration{
Endpoint: endpoint,
Key: key,
Transporter: http.DefaultClient,
}
}
}

require.Nil(t, externalPromptCfg, "Config should be nil when only endpoint is set")
})

t.Run("only key set", func(t *testing.T) {
os.Unsetenv("AZD_UI_PROMPT_ENDPOINT")
t.Setenv("AZD_UI_PROMPT_KEY", "secret-key")

var externalPromptCfg *input.ExternalPromptConfiguration
if endpoint := os.Getenv("AZD_UI_PROMPT_ENDPOINT"); endpoint != "" {
if key := os.Getenv("AZD_UI_PROMPT_KEY"); key != "" {
externalPromptCfg = &input.ExternalPromptConfiguration{
Endpoint: endpoint,
Key: key,
Transporter: http.DefaultClient,
}
}
}

require.Nil(t, externalPromptCfg, "Config should be nil when only key is set")
})
}
Loading
Loading