Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
105 commits
Select commit Hold shift + click to select a range
9b9bead
creating workflows
paullizer Sep 23, 2025
92db48f
fraud analyssis
paullizer Sep 23, 2025
864a80e
support agents
paullizer Sep 23, 2025
4e98d2a
update
paullizer Sep 23, 2025
64080a5
fix
paullizer Sep 23, 2025
20dc12d
updated demo
paullizer Sep 23, 2025
8df0343
Swagger lite (#469)
paullizer Sep 29, 2025
d24ff83
adding support for xlsm, Macro Excel files.
paullizer Sep 29, 2025
446b71f
Merge branch 'workflows' into Development
paullizer Sep 29, 2025
e97d470
moved into features
paullizer Sep 29, 2025
adbed01
initial
paullizer Sep 30, 2025
3292be1
added readme
paullizer Sep 30, 2025
75ca487
removed html code
paullizer Sep 30, 2025
24528ac
Update config.py (#477)
Patrick-Davis-MSFT Oct 1, 2025
e37bf50
Initial Setup for Pages documentation (#479)
paullizer Oct 2, 2025
46b9163
initial
paullizer Oct 2, 2025
58b58b0
added to base
paullizer Oct 2, 2025
5cd2f28
adding real data endpoints
paullizer Oct 2, 2025
2e0942f
Update route_backend_control_center.py
paullizer Oct 2, 2025
6ec77ee
added individual charts
paullizer Oct 3, 2025
1eda535
fix for bug 485
nadoylemsft Oct 3, 2025
e42ce5c
added document metrics
paullizer Oct 4, 2025
b225502
added links to control center
paullizer Oct 4, 2025
7841e42
debug
paullizer Oct 5, 2025
f39da82
added date
paullizer Oct 6, 2025
a8221b9
fixed bugs due to branch descrepancies
cjackson202 Oct 6, 2025
3e3c8c8
added Azure SQL Driver Docker File
cjackson202 Oct 7, 2025
c93ea7b
added documentation for docker_fileSession updates
cjackson202 Oct 7, 2025
8c5c2ba
Redis Managed Identity Azure Government Support Changes
cjackson202 Oct 7, 2025
39b4528
Stop tracking ignored folders
cjackson202 Oct 8, 2025
ba1ca48
updated gitignore
cjackson202 Oct 8, 2025
95a7647
Merge branch 'cj-dev' into Development - Ensured ManagedIdentity supp…
cjackson202 Oct 8, 2025
711e0de
Merge pull request #488 from cjackson202/Development
Bionic711 Oct 10, 2025
6a3c322
Merge branch 'Development' into bugfix485
nadoylemsft Oct 10, 2025
71eff52
Merge pull request #487 from microsoft/bugfix485
Bionic711 Oct 10, 2025
33f5d8c
added sort by to table for user management
paullizer Oct 16, 2025
9e124ff
storage account size processing
paullizer Oct 16, 2025
fe75d09
Front end now shows storage account sizing
paullizer Oct 16, 2025
556f6d8
export user management list to csv
paullizer Oct 16, 2025
6e6c976
adding group management
paullizer Oct 16, 2025
f5fa596
fixing swagger generation
paullizer Oct 23, 2025
b412a60
fix
paullizer Oct 23, 2025
17e6fed
Added inline dynamic property generation
paullizer Oct 23, 2025
9ca0bf2
added YAML support
paullizer Oct 23, 2025
34b2b71
Improved muiltform vs app/json detection
paullizer Oct 23, 2025
5090eec
added Control Center Admin role
paullizer Oct 23, 2025
52ac365
ai search sizing is working for groups
paullizer Oct 24, 2025
0a0978e
group refresh fixed
paullizer Oct 24, 2025
c72dfe1
added group data fix
paullizer Oct 24, 2025
503a3e0
group table refresh
paullizer Oct 24, 2025
0f5c73f
updated export to include group docs
paullizer Oct 25, 2025
b4007c8
adding public workspace management
paullizer Oct 25, 2025
9eca474
removed sample data and consolidated row generators
paullizer Oct 25, 2025
8469bc7
Changed both caching helper functions to use the existing update_docu…
paullizer Oct 29, 2025
b520432
removed workflow, will work on that in different branch
paullizer Oct 31, 2025
044c7d9
Document Set Fingerprinting, Scope-Aware Cache Key Generation, Event-…
paullizer Nov 10, 2025
7ac37b4
added debug logging
paullizer Nov 10, 2025
3d84394
setup cache feature and ttl time to admin app settings
paullizer Nov 10, 2025
bf1f14a
removed cosmos level ttl
paullizer Nov 10, 2025
baa71a9
Keyvault for secrets (#492)
Bionic711 Nov 11, 2025
db74c0d
Feature/remove abp for pr (#510)
Bionic711 Nov 12, 2025
0fd0eae
Merge branch 'improved-search' into Development
paullizer Nov 12, 2025
2035b90
Feature/group agents actions (#521)
Bionic711 Nov 19, 2025
fab926b
Merge branch 'Data-and-Workspace-Management' into Development
paullizer Nov 19, 2025
ab0a4ef
Add cosmos activity logs container configuration
paullizer Nov 20, 2025
d50064a
incorporate branch updates Add 372 fix 489
paullizer Nov 21, 2025
41e924d
Support deployment via AZD UP (#530)
SteveCInVA Nov 23, 2025
e545917
Video Indexer, Multi-Modal Enhancements, Scope Bug
paullizer Nov 24, 2025
164459f
Conversation Management Features (#532)
paullizer Nov 24, 2025
3bf067a
Message management (#553)
paullizer Dec 19, 2025
c91d555
Configure Application from AZD Up command (#548)
SteveCInVA Dec 19, 2025
f7afced
Adds Azure Billing Plugin in Community Customizations (#546)
Bionic711 Dec 19, 2025
ef2a2a7
Security/container build (#549)
Bionic711 Dec 19, 2025
04b5c12
Feature/speech managed identity (#543)
Xeelee33 Dec 19, 2025
6a85856
Banner text color picker from Vivien (#555)
clarked-msft Dec 23, 2025
0e67ac8
Remove opencensus
clarked-msft Jan 5, 2026
460b14b
Merge pull request #559 from clarked-msft/remove-opencensus-requirement
Bionic711 Jan 6, 2026
1555dbf
Add flask instrumentation
clarked-msft Jan 6, 2026
40f5cfd
Add troubleshooting doc
clarked-msft Jan 6, 2026
74df9f8
Add troubleshooting doc
clarked-msft Jan 6, 2026
164dd80
Merge pull request #562 from clarked-msft/flask-intrumentor
Bionic711 Jan 6, 2026
3913480
Control center (#567)
paullizer Jan 13, 2026
a2bb469
Adding release notes
paullizer Jan 13, 2026
43989ac
Merge origin/main into Development - Resolved all conflicts
paullizer Jan 13, 2026
29dfbe0
fixed debug_debug_print
paullizer Jan 13, 2026
df2d77e
Updated README
paullizer Jan 13, 2026
2c7b627
Update README.md
paullizer Jan 13, 2026
9a8ce3b
Merge branch 'main' into Development
paullizer Jan 13, 2026
de013e4
accepted changes
paullizer Jan 13, 2026
49959e8
removed files
paullizer Jan 13, 2026
db0729e
GitHub Actions workflow that runs Python compilation checks on all Py…
paullizer Jan 13, 2026
1c3c133
Upated to v0.235.002
paullizer Jan 13, 2026
b20a5c7
removed debug test file
paullizer Jan 13, 2026
f70934c
Updated to v0.235.003
paullizer Jan 13, 2026
80ec215
Merge branch 'main' into Development
paullizer Jan 13, 2026
09fe817
Update python-syntax-check.yml
paullizer Jan 13, 2026
ce140f5
fixed disable group creation bug
paullizer Jan 15, 2026
4aac607
fixed bug not showing raw activity log for groups
paullizer Jan 15, 2026
9b9644e
fixed control center access to not require admin role when enabling c…
paullizer Jan 15, 2026
31ced93
fix documentation
paullizer Jan 15, 2026
e6f33c0
Update release_notes.md
paullizer Jan 15, 2026
919ed52
Update README.md
paullizer Jan 15, 2026
8878f1d
Merge branch 'main' into control-center-bug-fixes
paullizer Jan 15, 2026
646aaba
added click restrictions to top items in control center
paullizer Jan 15, 2026
2c2d92a
Merge pull request #598 from microsoft/control-center-bug-fixes
Bionic711 Jan 15, 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
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ applyTo: '**'
## Documentation Directory
All new feature documentation should be placed in:
```
..\docs\features\
..\docs\explanation\features\
```

## File Naming Convention
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ applyTo: '**'
## Documentation Directory
All bug fixes and issue resolution documentation should be placed in:
```
..\docs\fixes\
..\docs\explanation\fixes\
```

## File Naming Convention
Expand Down
1 change: 1 addition & 0 deletions .github/workflows/python-syntax-check.yml
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ on:
pull_request:
branches:
- main
- Development
paths:
- 'application/single_app/**.py'
- '.github/workflows/python-syntax-check.yml'
Expand Down
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -118,7 +118,7 @@ azd env select <environment>
This step will begin the deployment process.

```powershell
Use azd up
azd up
```

## Architecture
Expand Down
2 changes: 1 addition & 1 deletion application/single_app/config.py
Original file line number Diff line number Diff line change
Expand Up @@ -88,7 +88,7 @@
EXECUTOR_TYPE = 'thread'
EXECUTOR_MAX_WORKERS = 30
SESSION_TYPE = 'filesystem'
VERSION = "0.235.003"
VERSION = "0.235.012"


SECRET_KEY = os.getenv('SECRET_KEY', 'dev-secret-key-change-in-production')
Expand Down
64 changes: 40 additions & 24 deletions application/single_app/functions_authentication.py
Original file line number Diff line number Diff line change
Expand Up @@ -731,10 +731,17 @@ def control_center_required(access_level='admin'):
Args:
access_level: 'admin' for full admin access, 'dashboard' for dashboard-only access

Access logic:
Access logic when require_member_of_control_center_admin is ENABLED:
- ControlCenterAdmin role → Full access to everything (admin + dashboard)
- ControlCenterDashboardReader role → Dashboard access only
- Regular admins → Access when role requirements are disabled (default)
- ControlCenterDashboardReader role → Dashboard access only (if that setting is also enabled)
- Regular Admin role → NO access (must have ControlCenterAdmin)
- ControlCenterAdmin role is REQUIRED - having it without the setting enabled does nothing

Access logic when require_member_of_control_center_admin is DISABLED (default):
- Regular Admin role → Full access to dashboard + management + activity logs
- ControlCenterAdmin role → IGNORED (role feature not enabled)
- ControlCenterDashboardReader role → Dashboard access only (if that setting is enabled)
- Non-admins → NO access
"""
def decorator(f):
@wraps(f)
Expand All @@ -744,37 +751,46 @@ def decorated_function(*args, **kwargs):
require_member_of_control_center_admin = settings.get("require_member_of_control_center_admin", False)
require_member_of_control_center_dashboard_reader = settings.get("require_member_of_control_center_dashboard_reader", False)

has_admin_role = 'roles' in user and 'ControlCenterAdmin' in user['roles']
has_control_center_admin_role = 'roles' in user and 'ControlCenterAdmin' in user['roles']
has_dashboard_reader_role = 'roles' in user and 'ControlCenterDashboardReader' in user['roles']
has_regular_admin_role = 'roles' in user and 'Admin' in user['roles']

# ControlCenterAdmin always has full access
if has_admin_role:
return f(*args, **kwargs)

# For dashboard access, check if DashboardReader role grants access
if access_level == 'dashboard':
if require_member_of_control_center_dashboard_reader and has_dashboard_reader_role:
return f(*args, **kwargs)

# Check if role requirements are enforced
# Check if ControlCenterAdmin role requirement is enforced
if require_member_of_control_center_admin:
# Admin role required but user doesn't have it
# ControlCenterAdmin role is REQUIRED for access
# Only ControlCenterAdmin role grants full access
if has_control_center_admin_role:
return f(*args, **kwargs)

# For dashboard access, check if DashboardReader role grants access
if access_level == 'dashboard':
if require_member_of_control_center_dashboard_reader and has_dashboard_reader_role:
return f(*args, **kwargs)

# User doesn't have ControlCenterAdmin role, deny access
# Note: Regular Admin role does NOT grant access when this setting is enabled
is_api_request = (request.accept_mimetypes.accept_json and not request.accept_mimetypes.accept_html) or request.path.startswith('/api/')
if is_api_request:
return jsonify({"error": "Forbidden", "message": "Insufficient permissions (ControlCenterAdmin role required)"}), 403
else:
return "Forbidden: ControlCenterAdmin role required", 403

if access_level == 'dashboard' and require_member_of_control_center_dashboard_reader:
# Dashboard reader role required but user doesn't have it
is_api_request = (request.accept_mimetypes.accept_json and not request.accept_mimetypes.accept_html) or request.path.startswith('/api/')
if is_api_request:
return jsonify({"error": "Forbidden", "message": "Insufficient permissions (ControlCenterDashboardReader role required)"}), 403
else:
return "Forbidden: ControlCenterDashboardReader role required", 403
# ControlCenterAdmin requirement is NOT enforced (default behavior)
# Only regular Admin role grants access - ControlCenterAdmin role is IGNORED
if has_regular_admin_role:
return f(*args, **kwargs)

# No role requirements enabled → allow all admins (default behavior)
return f(*args, **kwargs)
# For dashboard-only access, check if DashboardReader role is enabled and user has it
if access_level == 'dashboard':
if require_member_of_control_center_dashboard_reader and has_dashboard_reader_role:
return f(*args, **kwargs)

# User is not an admin and doesn't have special roles - deny access
is_api_request = (request.accept_mimetypes.accept_json and not request.accept_mimetypes.accept_html) or request.path.startswith('/api/')
if is_api_request:
return jsonify({"error": "Forbidden", "message": "Insufficient permissions (Admin role required)"}), 403
else:
return "Forbidden: Admin role required", 403
return decorated_function
return decorator

Expand Down
3 changes: 2 additions & 1 deletion application/single_app/route_frontend_admin_settings.py
Original file line number Diff line number Diff line change
Expand Up @@ -593,7 +593,8 @@ def is_valid_url(url):
# Workspaces
'enable_user_workspace': form_data.get('enable_user_workspace') == 'on',
'enable_group_workspaces': form_data.get('enable_group_workspaces') == 'on',
'enable_group_creation': form_data.get('enable_group_creation') == 'on',
# disable_group_creation is inverted: when checked (on), enable_group_creation = False
'enable_group_creation': form_data.get('disable_group_creation') != 'on',
'enable_public_workspaces': form_data.get('enable_public_workspaces') == 'on',
'enable_file_sharing': form_data.get('enable_file_sharing') == 'on',
'enable_file_processing_logs': enable_file_processing_logs,
Expand Down
20 changes: 18 additions & 2 deletions application/single_app/route_frontend_control_center.py
Original file line number Diff line number Diff line change
Expand Up @@ -28,14 +28,30 @@ def control_center():
stats = get_control_center_statistics()

# Check user's role for frontend conditional rendering
# Determine if user has full admin access (can see all tabs)
user = session.get('user', {})
has_admin_role = 'ControlCenterAdmin' in user.get('roles', [])
user_roles = user.get('roles', [])
require_member_of_control_center_admin = settings.get("require_member_of_control_center_admin", False)

# User has full admin access based on which role requirement is active:
# - When require_member_of_control_center_admin is ENABLED: Only ControlCenterAdmin role grants access
# - When require_member_of_control_center_admin is DISABLED: Only regular Admin role grants access
has_control_center_admin_role = 'ControlCenterAdmin' in user_roles
has_regular_admin_role = 'Admin' in user_roles

# Full admin access means they can see dashboard + management tabs + activity logs
if require_member_of_control_center_admin:
# ControlCenterAdmin role is required - only that role grants full access
has_full_admin_access = has_control_center_admin_role
else:
# ControlCenterAdmin requirement is disabled - only regular Admin role grants full access
has_full_admin_access = has_regular_admin_role

return render_template('control_center.html',
app_settings=public_settings,
settings=public_settings,
statistics=stats,
has_control_center_admin=has_admin_role)
has_control_center_admin=has_full_admin_access)
except Exception as e:
debug_print(f"Error loading control center: {e}")
flash(f"Error loading control center: {str(e)}", "error")
Expand Down
4 changes: 4 additions & 0 deletions application/single_app/static/js/group/manage_group.js
Original file line number Diff line number Diff line change
Expand Up @@ -1139,6 +1139,10 @@ function copyRawActivityToClipboard() {
});
}

// Make functions globally available for onclick handlers
window.showRawActivity = showRawActivity;
window.copyRawActivityToClipboard = copyRawActivityToClipboard;

function showCsvError(message) {
$("#csvErrorList").html(`<pre class="mb-0">${escapeHtml(message)}</pre>`);
$("#csvErrorDetails").show();
Expand Down
20 changes: 14 additions & 6 deletions application/single_app/templates/_sidebar_nav.html
Original file line number Diff line number Diff line change
Expand Up @@ -484,8 +484,11 @@
</div>
{% endif %}

<!-- Control Center Section - Show when on control center page for admins OR users with ControlCenter roles -->
{% if request.endpoint == 'control_center' and ((session.get('user') and 'ControlCenterAdmin' in session['user']['roles']) or (app_settings.require_member_of_control_center_dashboard_reader and session.get('user') and 'ControlCenterDashboardReader' in session['user']['roles']) or ('Admin' in session['user']['roles'] and not app_settings.require_member_of_control_center_admin and not app_settings.require_member_of_control_center_dashboard_reader)) %}
<!-- Control Center Section - Show when on control center page for users with proper access -->
<!-- Access logic: When require_member_of_control_center_admin is ENABLED, only ControlCenterAdmin role grants access -->
<!-- When DISABLED (default), only regular Admin role grants access (ControlCenterAdmin is ignored) -->
<!-- DashboardReader role grants dashboard-only access when that setting is enabled -->
{% if request.endpoint == 'control_center' and ((app_settings.require_member_of_control_center_admin and session.get('user') and 'ControlCenterAdmin' in session['user']['roles']) or (app_settings.require_member_of_control_center_dashboard_reader and session.get('user') and 'ControlCenterDashboardReader' in session['user']['roles']) or (not app_settings.require_member_of_control_center_admin and 'Admin' in session['user']['roles'])) %}
<div class="overflow-auto">
<div id="control-center-toggle" class="mt-2 mb-1 ps-3 pe-2 text-muted small d-flex align-items-center justify-content-between" style="font-weight: 500; letter-spacing: 0.02em; cursor: pointer; user-select: none;">
<div class="d-flex align-items-center">
Expand Down Expand Up @@ -513,8 +516,10 @@
<i class="bi bi-speedometer2 me-2"></i><span class="nav-text">Dashboard</span>
</a>
</li>
{# Only show admin tabs if user has ControlCenterAdmin role #}
{% if session.get('user') and 'ControlCenterAdmin' in session['user']['roles'] %}
{# Only show admin tabs if user has full admin access based on settings #}
{# When require_member_of_control_center_admin is ENABLED: need ControlCenterAdmin role #}
{# When DISABLED: need regular Admin role #}
{% if (app_settings.require_member_of_control_center_admin and session.get('user') and 'ControlCenterAdmin' in session['user']['roles']) or (not app_settings.require_member_of_control_center_admin and session.get('user') and 'Admin' in session['user']['roles']) %}
<li class="nav-item">
<a class="nav-link d-flex align-items-center control-center-nav-tab" href="#" data-tab="users">
<i class="bi bi-people me-2"></i><span class="nav-text">User Management</span>
Expand Down Expand Up @@ -687,8 +692,11 @@
<a class="dropdown-item" href="{{ url_for('admin_settings') }}">App Settings</a>
</li>
{% endif %}
{# Control Center - accessible to admins OR users with ControlCenter roles #}
{% if (session.get('user') and 'ControlCenterAdmin' in session['user']['roles']) or (app_settings.require_member_of_control_center_dashboard_reader and session.get('user') and 'ControlCenterDashboardReader' in session['user']['roles']) or ('Admin' in session['user']['roles'] and not app_settings.require_member_of_control_center_admin and not app_settings.require_member_of_control_center_dashboard_reader) %}
{# Control Center - access based on role requirements #}
{# When require_member_of_control_center_admin ENABLED: only ControlCenterAdmin role grants access #}
{# When DISABLED (default): only regular Admin role grants access #}
{# DashboardReader role grants dashboard-only access when that setting is enabled #}
{% if (app_settings.require_member_of_control_center_admin and session.get('user') and 'ControlCenterAdmin' in session['user']['roles']) or (app_settings.require_member_of_control_center_dashboard_reader and session.get('user') and 'ControlCenterDashboardReader' in session['user']['roles']) or (not app_settings.require_member_of_control_center_admin and 'Admin' in session['user']['roles']) %}
<li>
<a class="dropdown-item" href="{{ url_for('control_center') }}">Control Center</a>
</li>
Expand Down
7 changes: 5 additions & 2 deletions application/single_app/templates/_top_nav.html
Original file line number Diff line number Diff line change
Expand Up @@ -191,8 +191,11 @@
<a class="dropdown-item" href="{{ url_for('admin_settings') }}">App Settings</a>
</li>
{% endif %}
{# Control Center - accessible to admins OR users with ControlCenter roles #}
{% if (session.get('user') and 'ControlCenterAdmin' in session['user']['roles']) or (app_settings.require_member_of_control_center_dashboard_reader and session.get('user') and 'ControlCenterDashboardReader' in session['user']['roles']) or ('Admin' in session['user']['roles'] and not app_settings.require_member_of_control_center_admin and not app_settings.require_member_of_control_center_dashboard_reader) %}
{# Control Center - access based on role requirements #}
{# When require_member_of_control_center_admin ENABLED: only ControlCenterAdmin role grants access #}
{# When DISABLED (default): only regular Admin role grants access #}
{# DashboardReader role grants dashboard-only access when that setting is enabled #}
{% if (app_settings.require_member_of_control_center_admin and session.get('user') and 'ControlCenterAdmin' in session['user']['roles']) or (app_settings.require_member_of_control_center_dashboard_reader and session.get('user') and 'ControlCenterDashboardReader' in session['user']['roles']) or (not app_settings.require_member_of_control_center_admin and 'Admin' in session['user']['roles']) %}
<li>
<a class="dropdown-item" href="{{ url_for('control_center') }}">Control Center</a>
</li>
Expand Down
Loading
Loading