Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
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
2 changes: 1 addition & 1 deletion dotnet/agentLauncher/src/Assets/agent-definition.json
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
"version": "1.0.0",
"name": "com.typeagent.launcher",
"display_name": "TypeAgent",
"description": "TypeAgent launcher for processing prompts",
"description": "Run reliable, fast actions",
"icon": "ms-resource://Files/Assets/Square150x150Logo.png",
"action_id": "TypeAgentAction"
}
315 changes: 256 additions & 59 deletions dotnet/agentLauncher/src/Install.ps1
Original file line number Diff line number Diff line change
@@ -1,72 +1,269 @@
#Requires -RunAsAdministrator
#
# TypeAgent Agent Launcher - Installation Script
# This script handles automatic elevation and installs the AgentLauncher MSIX package
#

param(
[Parameter(DontShow)]
[switch]$ElevatedInstance # Internal parameter marking this as the elevated fork
)

$ErrorActionPreference = "Stop"

$scriptDir = Split-Path -Parent $MyInvocation.MyCommand.Path
#region Utility Functions

# Paths
$pfxPath = Join-Path $scriptDir "TypeAgent_TemporaryKey.pfx"
$packageDir = Join-Path $scriptDir "bin\x64\Debug\net8.0-windows10.0.26100.0\AppPackages\AgentLauncher_1.0.0.0_x64_Debug_Test"
$msixPath = Join-Path $packageDir "AgentLauncher_1.0.0.0_x64_Debug.msix"
function Test-IsAdministrator {
<#
.SYNOPSIS
Checks if the current session has administrator privileges.
#>
$currentUser = [Security.Principal.WindowsIdentity]::GetCurrent()
$principal = New-Object Security.Principal.WindowsPrincipal($currentUser)
return $principal.IsInRole([Security.Principal.WindowsBuiltInRole]::Administrator)
}

Write-Host "TypeAgent Agent Launcher - Installation Script" -ForegroundColor Cyan
Write-Host "=============================================" -ForegroundColor Cyan
Write-Host ""
function Restart-ScriptElevated {
<#
.SYNOPSIS
Restarts the script with administrator privileges.
.DESCRIPTION
Copies the script to TEMP to handle path issues, then launches elevated instance.
#>

# Step 1: Check if package exists
if (-not (Test-Path $msixPath)) {
Write-Host "ERROR: Package not found at: $msixPath" -ForegroundColor Red
Write-Host "Please build the project first with: dotnet build" -ForegroundColor Yellow
exit 1
}
Write-Host "`nThis script requires administrator privileges to install the MSIX package." -ForegroundColor Yellow
Write-Host "You will be prompted to elevate..." -ForegroundColor Yellow
Write-Host ""

# Step 2: Install certificate to Trusted Root
Write-Host "Step 1: Installing development certificate..." -ForegroundColor Yellow
try {
$password = ConvertTo-SecureString -String "test123" -Force -AsPlainText
Import-PfxCertificate -FilePath $pfxPath -CertStoreLocation "Cert:\LocalMachine\Root" -Password $password -ErrorAction SilentlyContinue | Out-Null
Write-Host " Certificate installed successfully" -ForegroundColor Green
} catch {
Write-Host " Certificate may already be installed (this is OK)" -ForegroundColor Gray
}
# Create temp directory with timestamp to avoid conflicts
$timestamp = Get-Date -Format "yyyyMMddHHmmss"
$tempScriptDir = Join-Path $env:TEMP "AgentLauncher_Install_$timestamp"

try {
# Copy script to temp
Write-Host "Preparing elevated script..." -ForegroundColor Cyan
New-Item -ItemType Directory -Path $tempScriptDir -Force | Out-Null
Copy-Item "$PSScriptRoot\Install.ps1" -Destination $tempScriptDir -Force

$tempScriptPath = Join-Path $tempScriptDir "Install.ps1"

# Detect which PowerShell version is running
$powershellExecutable = if ($PSVersionTable.PSEdition -eq 'Core') {
"pwsh.exe"
} else {
"powershell.exe"
}

Write-Host "Launching elevated instance using $powershellExecutable..." -ForegroundColor Cyan
Write-Host ""

# Start elevated process and wait for completion
$process = Start-Process $powershellExecutable -ArgumentList "-ExecutionPolicy", "Bypass", "-File", "`"$tempScriptPath`"", "-ElevatedInstance" -Verb RunAs -Wait -PassThru

# Check if user cancelled the UAC prompt
if ($null -eq $process) {
Write-Host "Elevation cancelled by user." -ForegroundColor Yellow

# Clean up temp folder
if (Test-Path $tempScriptDir) {
Remove-Item $tempScriptDir -Recurse -Force -ErrorAction SilentlyContinue
}

return 1
}

# Step 3: Remove old package if exists
Write-Host ""
Write-Host "Step 2: Removing existing package (if any)..." -ForegroundColor Yellow
$existingPackage = Get-AppxPackage -Name "TypeAgent.AgentLauncher" -ErrorAction SilentlyContinue
if ($existingPackage) {
Remove-AppxPackage -Package $existingPackage.PackageFullName
Write-Host " Removed existing package" -ForegroundColor Green
} else {
Write-Host " No existing package found" -ForegroundColor Gray
if ($process.ExitCode -ne 0) {
Write-Host "Elevated installation FAILED with exit code: $($process.ExitCode)" -ForegroundColor Red

# Clean up temp folder on failure
if (Test-Path $tempScriptDir) {
Remove-Item $tempScriptDir -Recurse -Force -ErrorAction SilentlyContinue
}

return $process.ExitCode
}

Write-Host "Elevated installation completed successfully." -ForegroundColor Green

# Clean up temp folder on success
if (Test-Path $tempScriptDir) {
Remove-Item $tempScriptDir -Recurse -Force -ErrorAction SilentlyContinue
}

return 0
}
catch {
Write-Host "Failed to restart with elevation. Error: $($_.Exception.Message)" -ForegroundColor Red
Write-Host "Please run PowerShell as Administrator manually and try again." -ForegroundColor Yellow

# Clean up temp folder on error
if (Test-Path $tempScriptDir) {
Remove-Item $tempScriptDir -Recurse -Force -ErrorAction SilentlyContinue
}

return 1
}
}

# Step 4: Install new package
Write-Host ""
Write-Host "Step 3: Installing TypeAgent Agent Launcher..." -ForegroundColor Yellow
Add-AppxPackage -Path $msixPath
Write-Host " Package installed successfully" -ForegroundColor Green

# Verify installation
Write-Host ""
Write-Host "Verifying installation..." -ForegroundColor Yellow
$installed = Get-AppxPackage -Name "TypeAgent.AgentLauncher"
if ($installed) {
Write-Host " Installation verified!" -ForegroundColor Green
#endregion

#region Main Installation Logic

function Install-AgentLauncher {
<#
.SYNOPSIS
Performs the actual installation of the AgentLauncher package.
.DESCRIPTION
This function contains all the operations that require elevation:
- Installing the development certificate
- Removing old package
- Installing new package
#>

# Use PSScriptRoot if available, otherwise try to find it
$scriptDir = $PSScriptRoot
if ([string]::IsNullOrEmpty($scriptDir)) {
$scriptDir = Split-Path -Parent $MyInvocation.MyCommand.Path
}

# If we're running from TEMP (elevated instance), navigate back to the actual install location
if ($scriptDir -like "*\Temp\*") {
# Assume the actual location is the standard path
$scriptDir = "D:\repos\TypeAgent\dotnet\agentLauncher\src"
if (-not (Test-Path $scriptDir)) {
Write-Host "ERROR: Could not determine installation directory" -ForegroundColor Red
Write-Host "Please run this script from the agentLauncher\src directory" -ForegroundColor Yellow
return 1
}
}

# Paths
$pfxPath = Join-Path $scriptDir "TypeAgent_TemporaryKey.pfx"
$packageDir = Join-Path $scriptDir "bin\x64\Debug\net8.0-windows10.0.26100.0\AppPackages\AgentLauncher_1.0.0.0_x64_Debug_Test"
$msixPath = Join-Path $packageDir "AgentLauncher_1.0.0.0_x64_Debug.msix"

Write-Host "TypeAgent Agent Launcher - Installation Script" -ForegroundColor Cyan
Write-Host "=============================================" -ForegroundColor Cyan
Write-Host ""
Write-Host "Package Details:" -ForegroundColor Cyan
Write-Host " Name: $($installed.Name)"
Write-Host " Version: $($installed.Version)"
Write-Host " Install Location: $($installed.InstallLocation)"
} else {
Write-Host " ERROR: Package not found after installation" -ForegroundColor Red
exit 1
Write-Host "Installation directory: $scriptDir" -ForegroundColor Gray
Write-Host ""

# Step 1: Check if package exists
if (-not (Test-Path $msixPath)) {
Write-Host "ERROR: Package not found at: $msixPath" -ForegroundColor Red
Write-Host "Please build the project first with: .\Build.ps1" -ForegroundColor Yellow
return 1
}

Write-Host "Package found:" -ForegroundColor Green
Write-Host " $msixPath" -ForegroundColor Gray
Write-Host ""

# Step 2: Install certificate to Trusted Root
Write-Host "Step 1: Installing development certificate..." -ForegroundColor Yellow
try {
$password = ConvertTo-SecureString -String "test123" -Force -AsPlainText
Import-PfxCertificate -FilePath $pfxPath -CertStoreLocation "Cert:\LocalMachine\Root" -Password $password -ErrorAction SilentlyContinue | Out-Null
Write-Host " Certificate installed successfully" -ForegroundColor Green
} catch {
Write-Host " Certificate may already be installed (this is OK)" -ForegroundColor Gray
}

# Step 3: Remove old package if exists
Write-Host ""
Write-Host "Step 2: Removing existing package (if any)..." -ForegroundColor Yellow
$existingPackage = Get-AppxPackage -Name "TypeAgent.AgentLauncher" -ErrorAction SilentlyContinue
if ($existingPackage) {
Remove-AppxPackage -Package $existingPackage.PackageFullName
Write-Host " Removed existing package: $($existingPackage.Version)" -ForegroundColor Green
} else {
Write-Host " No existing package found" -ForegroundColor Gray
}

# Step 4: Install new package
Write-Host ""
Write-Host "Step 3: Installing TypeAgent Agent Launcher..." -ForegroundColor Yellow
try {
Add-AppxPackage -Path $msixPath
Write-Host " Package installed successfully" -ForegroundColor Green
} catch {
Write-Host " ERROR: Failed to install package" -ForegroundColor Red
Write-Host " $($_.Exception.Message)" -ForegroundColor Red
return 1
}

# Step 5: Verify installation
Write-Host ""
Write-Host "Verifying installation..." -ForegroundColor Yellow
$installed = Get-AppxPackage -Name "TypeAgent.AgentLauncher"
if ($installed) {
Write-Host " Installation verified!" -ForegroundColor Green
Write-Host ""
Write-Host "Package Details:" -ForegroundColor Cyan
Write-Host " Name: $($installed.Name)" -ForegroundColor Gray
Write-Host " Version: $($installed.Version)" -ForegroundColor Gray
Write-Host " Install Location: $($installed.InstallLocation)" -ForegroundColor Gray
Write-Host " Package Family Name: $($installed.PackageFamilyName)" -ForegroundColor Gray
} else {
Write-Host " ERROR: Package not found after installation" -ForegroundColor Red
return 1
}

Write-Host ""
Write-Host "Installation complete!" -ForegroundColor Green
Write-Host ""
Write-Host "Next steps:" -ForegroundColor Cyan
Write-Host " 1. Check ODR registration: odr app-agents list" -ForegroundColor Gray
Write-Host " 2. Ensure TypeAgent's agent service is running" -ForegroundColor Gray
Write-Host " 3. Run actions using the universal composer" -ForegroundColor Gray
Write-Host ""

return 0
}

Write-Host ""
Write-Host "Installation complete!" -ForegroundColor Green
Write-Host ""
Write-Host "Next steps:" -ForegroundColor Cyan
Write-Host " 1. Configure the script path: AgentLauncher.exe --settings set scriptpath <path>" -ForegroundColor Gray
Write-Host " 2. Test the launcher: AgentLauncher.exe --test 'Hello from TypeAgent'" -ForegroundColor Gray
Write-Host " 3. Check ODR registration: odr app-agents list" -ForegroundColor Gray
#endregion

#region Main Entry Point

function Main {
<#
.SYNOPSIS
Main entry point for the installation script.
.DESCRIPTION
Handles elevation logic:
- If already admin: Install directly
- If not admin: Launch elevated instance and wait
- If elevated instance: Install and exit
#>

$isAdmin = Test-IsAdministrator

if ($isAdmin) {
# Already running as admin - proceed with installation
if ($ElevatedInstance) {
Write-Host "Running as Administrator (elevated instance)..." -ForegroundColor Green
} else {
Write-Host "Running as Administrator..." -ForegroundColor Green
}
Write-Host ""

$exitCode = Install-AgentLauncher

if ($ElevatedInstance) {
# Pause so user can see results before window closes
Write-Host ""
Write-Host "Press any key to continue..." -ForegroundColor Gray
$null = $Host.UI.RawUI.ReadKey("NoEcho,IncludeKeyDown")
}

exit $exitCode
} else {
# Not admin - need to elevate
$exitCode = Restart-ScriptElevated
exit $exitCode
}
}

# Execute main function
Main

#endregion