Skip to content

Release v1.2.1#505

Merged
Power-Maverick merged 91 commits intomainfrom
dev
Apr 6, 2026
Merged

Release v1.2.1#505
Power-Maverick merged 91 commits intomainfrom
dev

Conversation

@Power-Maverick
Copy link
Copy Markdown
Contributor

Please fill in this template.

  • Use a meaningful title for the pull request.
  • Follow the guidelines from the CONTRIBUTING.md.
  • Mention the bug or the feature number the PR will be targeting.
  • Test the change in your own code. (Compile and run)
  • Resolve all GH Copilot comments.

Copilot AI and others added 30 commits February 9, 2026 12:02
Co-authored-by: Power-Maverick <36135520+Power-Maverick@users.noreply.github.com>
Co-authored-by: Power-Maverick <36135520+Power-Maverick@users.noreply.github.com>
…otarization-errors

Fix macOS notarization failures for production and nightly builds
…ofile detection (#355)

* Initial plan

* Add browser profile support for interactive authentication

- Add browserType and browserProfile fields to DataverseConnection interface
- Implement browser-specific launch logic in AuthManager
- Update add/edit connection modals with browser selection UI
- Support Chrome, Edge, Firefox, and Brave browsers
- Fallback to default browser if profile not found

Co-authored-by: Power-Maverick <36135520+Power-Maverick@users.noreply.github.com>

* Address code review feedback - use helper functions consistently

Co-authored-by: Power-Maverick <36135520+Power-Maverick@users.noreply.github.com>

* Refactor: Extract browser logic into separate BrowserManager

- Create new BrowserManager class for browser detection and profile enumeration
- Remove browser-related code from AuthManager
- AuthManager now depends on BrowserManager via constructor injection
- Add IPC channels for browser detection and profile listing
- Update preload script to expose new browser APIs

Co-authored-by: Power-Maverick <36135520+Power-Maverick@users.noreply.github.com>

* Implement dynamic browser profile detection in UI

- Replace text input with dropdown for browser profiles
- Dynamically detect browser installation on selection
- Automatically load and populate browser profiles
- Show warning when selected browser is not installed
- Support both add and edit connection modals
- Add modal-warning CSS for user feedback

Co-authored-by: Power-Maverick <36135520+Power-Maverick@users.noreply.github.com>

* Fix: Browser profile detection in modals

- Expose browser detection APIs in modalPreload.ts
- Fix browser type change event to properly trigger profile loading
- Set correct initial state for profile dropdown (No profile needed)
- Remove premature loadBrowserProfiles() call that ran before DOM ready

Fixes:
- Profile selector now loads data when browser is selected
- Browser detection APIs now available in modal context
- Initial dropdown state shows correct message
- Warning displays when browser not installed

Co-authored-by: Power-Maverick <36135520+Power-Maverick@users.noreply.github.com>

* Enhance profile detection to show friendly names, support Chrome/Edge only

- Read actual profile names from Local State file (e.g., "Person 1", "Work")
- Fallback to reading individual Preferences files if Local State unavailable
- Remove Firefox and Brave browser support (Chrome and Edge only)
- UI now displays profile.name but stores profile.path for --profile-directory
- Update both add and edit connection modals

Co-authored-by: Power-Maverick <36135520+Power-Maverick@users.noreply.github.com>

* Move browser settings to separate section available for all auth types

- Move browser type and profile selectors out of interactive-only section
- Create new "Browser Settings (Optional)" section below Environment selector
- Apply browser settings to all authentication types (interactive, clientSecret, usernamePassword, connectionString)
- Browser profile used when tools need to open URLs with authentication
- Updated both add and edit connection modals
- Updated connectionManagement to apply browser settings to all auth types

Co-authored-by: Power-Maverick <36135520+Power-Maverick@users.noreply.github.com>

* Fixed style issue and added logos

* Add browser profile tag to connection cards in sidebar

- Add browserProfileName field to DataverseConnection type
- Display browser icon and profile name as tag on connection cards
- Tag shows Chrome/Edge icon with friendly profile name (e.g., "My Cool Profile")
- Tag positioned next to environment badge
- Update form controllers to capture and store profile name
- Add CSS styling for connection-browser-tag with browser icon
- Browser icons loaded from renderer/icons/logos/

Co-authored-by: Power-Maverick <36135520+Power-Maverick@users.noreply.github.com>

* Fix modal hanging issue - improve browser profile name collection

- Fix collectFormData to safely handle empty profile selections
- Only capture browserProfileName when a profile is actually selected
- Add null-safe checks for selectedOptions array access
- Prevent attempting to read textContent from empty value options

Co-authored-by: Power-Maverick <36135520+Power-Maverick@users.noreply.github.com>

* Revert "Fix modal hanging issue - improve browser profile name collection"

This reverts commit 607fde9.

* Revert "Add browser profile tag to connection cards in sidebar"

This reverts commit e1cab02.

* feat: add browser profile name support in connection forms and UI

* Update src/renderer/modules/connectionManagement.ts

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

* Update src/main/managers/browserManager.ts

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

* Update src/main/managers/browserManager.ts

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

* Update src/common/types/connection.ts

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

---------

Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Co-authored-by: Power-Maverick <36135520+Power-Maverick@users.noreply.github.com>
Co-authored-by: Power-Maverick <danish.naglekar@hotmail.com>
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
…derivation (#354)

* Initial plan

* Add optional filters parameter to saveFile function

Co-authored-by: Power-Maverick <36135520+Power-Maverick@users.noreply.github.com>

* Fix extension extraction to use path.extname for robust handling

Co-authored-by: Power-Maverick <36135520+Power-Maverick@users.noreply.github.com>

---------

Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Co-authored-by: Power-Maverick <36135520+Power-Maverick@users.noreply.github.com>
Co-authored-by: Power-Maverick <danish.naglekar@hotmail.com>
* fix: enable recursive file search for notarization in release workflows

* feat: add YAML regeneration steps for Windows, Linux, and macOS with correct SHA256 hashes

* feat: add repackaging step for portable ZIP with signed EXE in Windows workflows
* fix: Enhance Label structure compliance and add polymorphic lookup support

This commit addresses documentation review findings and adds support for polymorphic lookup attributes (Customer/Regarding fields) to complete metadata CRUD operations implementation for issue #319.

## Type Definitions (src/common/types/dataverse.ts)
- Added `IsManaged?: boolean` property to LocalizedLabel interface
  * Microsoft examples show IsManaged included in all attribute/relationship/optionset requests
  * Properly tracks whether label originates from managed solution
- UserLocalizedLabel remains optional in Label interface
  * Entity creation docs note it as read-only
  * However, Microsoft's own examples for attributes, relationships, and optionsets include it in POST requests
  * Implementation follows Microsoft's published examples

## DataverseManager Updates (src/main/managers/dataverseManager.ts)
- Updated buildLabel() helper method:
  * Now creates LocalizedLabel with IsManaged: false property
  * Includes UserLocalizedLabel property set to same LocalizedLabel instance
  * Matches Microsoft's published examples for attribute/relationship creation
  * Example output: { LocalizedLabels: [{ Label: "Text", LanguageCode: 1033, IsManaged: false }], UserLocalizedLabel: { Label: "Text", LanguageCode: 1033, IsManaged: false } }
- Added createPolymorphicLookupAttribute() method:
  * Enables creation of lookup fields that reference multiple entity types (Customer, Regarding scenarios)
  * Validates presence of non-empty Targets array with entity logical names
  * Automatically sets AttributeType="Lookup" and AttributeTypeName={ Value: "LookupType" }
  * Delegates to createAttribute() with proper polymorphic configuration
  * Returns { AttributeId: string } matching API contract
  * Comprehensive JSDoc with Customer (account/contact) and custom Regarding examples
- Enhanced createRelationship() JSDoc:
  * Added CascadeConfiguration example with all cascade behaviors (Assign, Delete, Merge, Reparent, Share, Unshare)
  * Shows proper RemoveLink delete behavior for lookup fields
- Enhanced updateRelationship() JSDoc:
  * Added example demonstrating cascade configuration updates (RemoveLink → Cascade)
  * Illustrates retrieve-modify-PUT pattern for relationship updates
- Added LocalizedLabel to imports from common types

## IPC Infrastructure (src/common/ipc/channels.ts, src/main/index.ts)
- Added CREATE_POLYMORPHIC_LOOKUP_ATTRIBUTE channel constant
  * Value: "dataverse.createPolymorphicLookupAttribute"
- Registered IPC handler in main process:
  * Supports both primary and secondary connection targets
  * Extracts connectionId from WebContents based on connectionTarget parameter
  * Wraps dataverseManager.createPolymorphicLookupAttribute() with error handling
  * Proper cleanup with removeHandler() on application quit

## Preload Bridge (src/main/toolPreloadBridge.ts)
- Exposed createPolymorphicLookupAttribute in toolboxAPI.dataverse
- Exposed createPolymorphicLookupAttribute in window.dataverseAPI
- Both accept (entityLogicalName, attributeDefinition, options?, connectionTarget?) parameters
- Properly wrapped with ipcInvoke using CREATE_POLYMORPHIC_LOOKUP_ATTRIBUTE channel

## Public API Types (packages/dataverseAPI.d.ts)
- Added createPolymorphicLookupAttribute method signature to DataverseAPI interface
- Comprehensive JSDoc documentation:
  * Customer lookup example (account/contact on new_order entity)
  * Multi-entity Regarding example (account/contact/custom entities on new_note)
  * Documents Targets array requirement
  * Notes metadata publish requirement
  * Shows buildLabel() usage in examples
- Method signature: (entityLogicalName, attributeDefinition, options?, connectionTarget?) => Promise<{ AttributeId: string }>

## Validation
- TypeScript compilation: ✅ No errors
- ESLint: ✅ 0 errors (TypeScript version warning acceptable)
- All 12 implementation tasks completed
- Documentation compliance verified against 5 Microsoft Learn articles

## Microsoft Documentation References
- Attribute creation: https://learn.microsoft.com/en-us/power-apps/developer/data-platform/webapi/create-update-column-definitions-using-web-api
- Relationship creation: https://learn.microsoft.com/en-us/power-apps/developer/data-platform/webapi/create-update-entity-relationships-using-web-api
- Option sets: https://learn.microsoft.com/en-us/power-apps/developer/data-platform/webapi/create-update-optionsets
- Polymorphic lookups: https://learn.microsoft.com/en-us/power-apps/developer/data-platform/webapi/multitable-lookup
- Entity creation: https://learn.microsoft.com/en-us/power-apps/developer/data-platform/webapi/create-update-entity-definitions-using-web-api

Closes #319 metadata CRUD operations (enhancement for polymorphic lookups)

* fix: improve metadata CRUD error handling and add comprehensive documentation

FIXES (Code Review Issues):

1. **Metadata creation methods now throw descriptive errors on missing headers**
   - createEntityDefinition, createAttribute, createRelationship, createGlobalOptionSet
   - Previously returned empty strings silently when OData-EntityId header missing
   - Now throw explicit errors: "Failed to retrieve MetadataId from response. The OData-EntityId header was missing."
   - Guides users to identify real issues (network failures, API changes, etc.)

2. **GET_ATTRIBUTE_ODATA_TYPE IPC handler now enforces type safety**
   - Added runtime enum validation against AttributeMetadataType values
   - Removed unsafe `as any` cast that bypassed TypeScript's type system
   - Throws descriptive error listing all valid types when invalid value provided
   - Example: "Invalid attribute type: 'InvalidType'. Valid types are: String, Integer, Boolean, ..."

TECHNICAL DISCOVERY:

**Dataverse metadata operations return HTTP 204 No Content with NO response body**:
- Standard operations (entity, attribute, relationship, global option set): 204 No Content
- Only OData-EntityId header contains the created MetadataId
- Empty response body → makeHttpRequest returns `response.data = {}`
- Exception: CreateCustomerRelationships action returns 200 OK with JSON body containing AttributeId and RelationshipIds

This discovery led to abandoning a proposed "fallback to response body" approach, as responseData["MetadataId"] would always be undefined for metadata operations.

DOCUMENTATION IMPROVEMENTS:

1. **execute() method**: Added comprehensive JSDoc with examples for:
   - CreateCustomerRelationships action (customer lookup creation with 200 OK response)
   - InsertStatusValue action (status choice column values with StateCode)
   - UpdateStateValue action (state value metadata updates)
   - Bound vs unbound actions/functions

2. **queryData() method**: Added examples demonstrating:
   - Retrieving global option sets by name: `GlobalOptionSetDefinitions(Name='name')`
   - Retrieving all global option sets with filters
   - Retrieving by MetadataId

3. **createPolymorphicLookupAttribute()**: Added note about CreateCustomerRelationships alternative

4. **insertOptionValue()**: Added note about InsertStatusValue for status choice columns

5. **createGlobalOptionSet()**: Added retrieval example using queryData()

BENEFITS:

- **Fail-Fast Approach**: Clear errors replace silent failures, improving debuggability
- **Type Safety**: Runtime enum validation prevents invalid API calls
- **Complete Coverage**: All metadata operations from Microsoft documentation are supported via existing methods (execute, queryData)
- **Developer Guidance**: JSDoc examples show how to use actions like CreateCustomerRelationships, InsertStatusValue, UpdateStateValue
- **No New Methods Needed**: Generic execute() and queryData() methods handle all special cases

VALIDATION:

- ✅ TypeScript compilation passed (pnpm run typecheck)
- ✅ Linting passed (pnpm run lint - 0 errors)
- ✅ Application builds successfully (pnpm build)
- ✅ All 6 file edits applied successfully

* feat(dataverse): add whitelist-based header validation for metadata operations

Implemented comprehensive security validation for custom headers in metadata
operations to prevent header injection attacks and API compliance issues.

SECURITY ENHANCEMENTS:
- Added validateMetadataHeaders() method with whitelist-based validation
- Validates all custom headers against allowed list from Microsoft documentation
- Blocks attempts to override protected headers (Authorization, Content-Type, etc.)
- Case-insensitive header matching per HTTP specification (RFC 2616)
- Detailed error messages showing invalid headers and allowed alternatives

ALLOWED CUSTOM HEADERS (per Microsoft Dataverse Web API docs):
- MSCRM.SolutionUniqueName: Associates metadata changes with solutions
- MSCRM.MergeLabels: Controls label merging behavior (true/false)
- Consistency: Forces reading latest version (value: "Strong")
- If-Match: Standard HTTP header for optimistic concurrency control
- If-None-Match: Standard HTTP header for caching control

PROTECTED HEADERS (never allowed in customHeaders):
- Authorization, Accept, Content-Type, OData-MaxVersion, OData-Version,
  Prefer, Content-Length (all controlled by makeHttpRequest)

IMPLEMENTATION:
- Created ALLOWED_METADATA_HEADERS constant with whitelist (5 headers)
- Created PROTECTED_HEADERS constant with blacklist (7 headers)
- Integrated validation into buildMetadataHeaders() for automatic coverage
- All metadata operations now automatically validated:
  * createEntityDefinition / updateEntityDefinition
  * createAttribute / updateAttribute
  * createRelationship / updateRelationship
  * createGlobalOptionSet / updateGlobalOptionSet
  * createPolymorphicLookup

BENEFITS:
- Prevents header injection attacks and accidental header overrides
- Ensures API compliance with Microsoft's documented patterns
- Provides clear developer feedback when invalid headers are used
- Defense-in-depth validation even for type-safe inputs

DOCUMENTATION REFERENCES:
Based on thorough review of 6 Microsoft Learn articles covering all metadata
operation types (entity, attribute, relationship, option set operations).

Changes maintain backward compatibility - all existing code uses valid headers
through typed MetadataOperationOptions interface.

* fix(types): replace 'any' with MetadataOperationOptions in IPC handlers

Improved type safety in metadata operation IPC handlers by replacing all
occurrences of 'options?: any' with proper 'options?: MetadataOperationOptions'
type annotation.

CHANGES:
- Added MetadataOperationOptions to type imports from ../common/types
- Updated 9 IPC handler signatures to use MetadataOperationOptions:
  * CREATE_ENTITY_DEFINITION
  * UPDATE_ENTITY_DEFINITION
  * CREATE_ATTRIBUTE
  * UPDATE_ATTRIBUTE
  * CREATE_POLYMORPHIC_LOOKUP_ATTRIBUTE
  * CREATE_RELATIONSHIP
  * UPDATE_RELATIONSHIP
  * CREATE_GLOBAL_OPTION_SET
  * UPDATE_GLOBAL_OPTION_SET

BENEFITS:
- Eliminates use of 'any' type, maintaining TypeScript strict mode compliance
- Provides IntelliSense and autocomplete for options parameter
- Type safety ensures only valid options (solutionUniqueName, mergeLabels,
  consistencyStrong) can be passed through IPC layer
- Consistency with DataverseManager method signatures
- Compile-time validation of option properties

This change maintains backward compatibility while adding proper type checking
for all metadata operation options passed from tools via IPC.

* chore: update version to 1.0.19 in package.json

* feat(preload): sync metadata CRUD operations with toolPreloadBridge

Synchronized preload.ts with toolPreloadBridge.ts to ensure both the main
ToolBox UI and tool windows have identical metadata operation APIs available.
This maintains API parity and enables future metadata manipulation from the
main UI if needed.

ADDED METADATA OPERATIONS (22 new methods in dataverse namespace):

Metadata Helper Utilities:
- buildLabel: Build localized Label objects for metadata operations
- getAttributeODataType: Get OData type string for attribute type enums

Entity (Table) Metadata CRUD:
- createEntityDefinition: Create new entity/table definitions
- updateEntityDefinition: Update existing entity definitions (PUT)
- deleteEntityDefinition: Delete entity definitions

Attribute (Column) Metadata CRUD:
- createAttribute: Create new attributes/columns on entities
- updateAttribute: Update existing attribute definitions (PUT)
- deleteAttribute: Delete attributes from entities
- createPolymorphicLookupAttribute: Create multi-table lookup attributes

Relationship Metadata CRUD:
- createRelationship: Create 1:N, N:N, or polymorphic relationships
- updateRelationship: Update existing relationship definitions (PUT)
- deleteRelationship: Delete relationships

Global Option Set (Choice) Metadata CRUD:
- createGlobalOptionSet: Create new global option sets/choices
- updateGlobalOptionSet: Update existing global option sets (PUT)
- deleteGlobalOptionSet: Delete global option sets

Option Value Modification Actions (OData Actions):
- insertOptionValue: Insert new option values into option sets
- updateOptionValue: Update existing option values (labels, etc.)
- deleteOptionValue: Delete option values from option sets
- orderOption: Reorder option values within option sets

BENEFITS:
- API parity between main UI (preload.ts) and tool windows (toolPreloadBridge.ts)
- Main ToolBox UI can now perform metadata operations if needed in future
- Consistent API surface across all preload contexts
- Future-proofing for internal metadata management UI features
- All operations support primary/secondary connection targeting

IMPLEMENTATION NOTES:
- All methods maintain same signatures as toolPreloadBridge.ts
- Options parameter uses Record<string, unknown> for flexibility
- Connection targeting via optional connectionTarget parameter
- Validated header whitelisting enforced by DataverseManager layer

This synchronization ensures both contexts stay in sync as the metadata API
evolves and provides maximum flexibility for future UI enhancements.

---------

Co-authored-by: Power-Maverick <danish.naglekar@hotmail.com>
* Initial plan

* Fix loading screen to only block tool panel, not entire window

Co-authored-by: Power-Maverick <36135520+Power-Maverick@users.noreply.github.com>

* Address code review: Fix listener leak and simplify null coalescing

Co-authored-by: Power-Maverick <36135520+Power-Maverick@users.noreply.github.com>

* Fix IPC listener cleanup: use ipcMain.on instead of once

Co-authored-by: Power-Maverick <36135520+Power-Maverick@users.noreply.github.com>

* Fix loading overlay bounds calculation and add close button

- Get bounds directly from active tool BrowserView instead of renderer
- Add getActiveToolBounds() method to ToolWindowManager
- Remove rounded corners from overlay container
- Add close button to manually dismiss loading overlay
- Make overlay window focusable and closable

Co-authored-by: Power-Maverick <36135520+Power-Maverick@users.noreply.github.com>

* Improve close button accessibility and contrast

- Add aria-label for screen reader support
- Increase background opacity for better contrast (0.1 -> 0.15)
- Add visible focus indicator with blue border and shadow
- Improve border visibility (0.2 -> 0.3 opacity)

Co-authored-by: Power-Maverick <36135520+Power-Maverick@users.noreply.github.com>

* Fix overlay positioning and explicitly remove all rounded corners

- Use content bounds (screen coordinates) instead of incorrectly adding window bounds to BrowserView bounds
- Explicitly set border-radius:0 on overlay-container and close-button
- BrowserView bounds are content-relative, overlay BrowserWindow needs screen coordinates

Co-authored-by: Power-Maverick <36135520+Power-Maverick@users.noreply.github.com>

* Address code review feedback: fix shutdown handling, HTML escaping, and error telemetry

- Add isMainWindowClosing flag to allow overlay to close during app shutdown
- Escape HTML in loading message to prevent injection attacks
- Improve error handling with captureException and full context (activeToolId, tags)
- Properly destroy overlay window in cleanup
- Add close listener on main window to set shutdown flag

Co-authored-by: Power-Maverick <36135520+Power-Maverick@users.noreply.github.com>

* Refine code review fixes: use specific listener reference and clarify HTML escaping

- Store closeHandler reference to remove specific listener (not all listeners)
- Add comment explaining critical order of HTML entity replacements
- Prevent potential issues with removeAllListeners affecting other code

Co-authored-by: Power-Maverick <36135520+Power-Maverick@users.noreply.github.com>

* Polish destroy logic for better clarity and consistency

- Move overlayWindow null assignment inside if block for logical consistency
- Set closeHandler to null after cleanup for better flow
- Clearer separation of window cleanup vs handler cleanup

Co-authored-by: Power-Maverick <36135520+Power-Maverick@users.noreply.github.com>

---------

Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Co-authored-by: Power-Maverick <36135520+Power-Maverick@users.noreply.github.com>
)

* feat: add getCSDLDocument API for retrieving OData  endpoint (#384)

Add new getCSDLDocument() method to DataverseAPI that retrieves the complete
CSDL/EDMX metadata document from Dataverse's OData $metadata endpoint.

Key Features:
- Returns raw XML containing complete schema metadata (entities, attributes,
  relationships, actions, functions, complex types, enum types)
- Supports gzip/deflate compression for optimal transfer (70-80% size reduction)
- Automatic decompression handling using Node.js zlib module
- Multi-connection support (primary/secondary) for advanced tools
- Response size: 1-5MB typical, up to 10MB+ for complex environments

Implementation:
- Added GET_CSDL_DOCUMENT IPC channel to channels.ts
- Implemented getCSDLDocument() in DataverseManager with:
  - Custom HTTPS request handler (avoids JSON parsing)
  - Accept-Encoding: gzip, deflate headers
  - Automatic decompression via zlib.gunzip/inflate
  - Buffer-based response handling for binary data
- Registered IPC handler in index.ts with connection targeting support
- Exposed method in toolPreloadBridge.ts and preload.ts
- Added comprehensive TypeScript definitions in dataverseAPI.d.ts

Use Cases:
- Build Dataverse REST Builder (DRB) clone tools
- Create intelligent query builders and code generators
- Generate TypeScript interfaces from schema
- Explore entity relationships and metadata
- Validate action/function parameters

Naming Rationale:
Method named getCSDLDocument() (not getMetadata()) to avoid confusion with
existing entity metadata operations like getEntityMetadata() and
getAllEntitiesMetadata(). CSDL (Common Schema Definition Language) clearly
indicates it returns the OData service document.

Related: #384

* fix: expose getCSDLDocument on window.dataverseAPI for direct tool access

Fixed issue where getCSDLDocument was only accessible via
window.toolboxAPI.dataverse.getCSDLDocument but not directly on
window.dataverseAPI.getCSDLDocument like other Dataverse operations.

Changes:
- Added getCSDLDocument to toolPreloadBridge.ts dataverseAPI namespace
- Now consistent with other operations (getSolutions, queryData, etc.)
- Tools can call dataverseAPI.getCSDLDocument() directly as expected

This ensures getCSDLDocument follows the same exposure pattern as all
other Dataverse API methods.

* fix: decompress error responses in getCSDLDocument for readable error messages

Previously, error responses (non-200 status codes) were converted directly
from Buffer to UTF-8 string without checking for compression. Since the
request includes 'Accept-Encoding: gzip, deflate' header, Dataverse may
return compressed error responses, resulting in garbled error messages.

Changes:
- Added decompression logic to error response path
- Check content-encoding header (gzip/deflate/none)
- Decompress error body before converting to string
- Added try-catch to handle decompression failures gracefully
- Error messages now readable regardless of compression

This mirrors the success path's decompression logic and ensures consistent
handling of both success and error responses.
* fix: clean up toolboxAPI type definitions and improve connection handling

* fix: implement filesystem access management for tools with user consent model

* Fix filesystem access tracking to use instanceId instead of toolId (#390)

* Initial plan

* fix: track filesystem access per instance instead of per tool

This change fixes the issue where closing one instance of a tool would
revoke filesystem access for all other instances of the same tool.

Changes:
- Updated ToolFileSystemAccessManager to use instanceId as key instead of toolId
- Added getInstanceIdByWebContents() method to ToolWindowManager
- Updated all filesystem IPC handlers to use instanceId
- Updated closeTool() to revoke access only for the specific instance

This ensures that each tool instance maintains its own filesystem
permissions independently, allowing multiple instances of the same tool
to run simultaneously without interfering with each other.

Co-authored-by: Power-Maverick <36135520+Power-Maverick@users.noreply.github.com>

* refactor: eliminate code duplication in toolWindowManager methods

Refactor getToolIdByWebContents() to call getInstanceIdByWebContents()
and extract the toolId from the result, eliminating duplicated loop logic.

Co-authored-by: Power-Maverick <36135520+Power-Maverick@users.noreply.github.com>

---------

Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Co-authored-by: Power-Maverick <36135520+Power-Maverick@users.noreply.github.com>

---------

Co-authored-by: Copilot <198982749+Copilot@users.noreply.github.com>
…aller (#397)

* Initial plan

* Add Windows multi-architecture support to latest.yml generation

Co-authored-by: Power-Maverick <36135520+Power-Maverick@users.noreply.github.com>

* Apply Windows YAML merge fix to nightly-release workflow

Co-authored-by: Power-Maverick <36135520+Power-Maverick@users.noreply.github.com>

* Add standalone script to generate merged Windows latest.yml

Co-authored-by: Power-Maverick <36135520+Power-Maverick@users.noreply.github.com>

* Add buildScripts/latest.yml to gitignore and remove example file

Co-authored-by: Power-Maverick <36135520+Power-Maverick@users.noreply.github.com>

* Add macOS multi-architecture support to latest-mac.yml generation

Co-authored-by: Power-Maverick <36135520+Power-Maverick@users.noreply.github.com>

* Remove legacy build scripts and add new merge scripts for Windows and macOS

- Deleted old merge scripts: merge-macos-latest-yml.sh, merge-windows-latest-yml.sh, test-macos-build.sh, verify-build.sh
- Added new merge scripts for Windows and macOS with improved functionality and documentation.
- Created README for merge scripts detailing usage and troubleshooting.
- Implemented new test and verification scripts for macOS builds to ensure proper packaging and structure.

* fix: correct path to verify-build.sh script in build workflow

* Update buildScripts/sh/merge-latest-yml.sh

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

* Update .github/workflows/prod-release.yml

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

* Update .github/workflows/nightly-release.yml

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

---------

Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Co-authored-by: Power-Maverick <36135520+Power-Maverick@users.noreply.github.com>
Co-authored-by: Power-Maverick <danish.naglekar@hotmail.com>
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
* Add support for bundled SVG icons in tools with backward compatibility (#380)

* Initial plan

* Add SVG icon support with pptb-webview protocol for bundled icons

Co-authored-by: Power-Maverick <36135520+Power-Maverick@users.noreply.github.com>

* Address code review feedback: fix recent tools icon handling and add HTML escaping

Co-authored-by: Power-Maverick <36135520+Power-Maverick@users.noreply.github.com>

* Add comprehensive HTML escaping for XSS prevention in icon URLs

Co-authored-by: Power-Maverick <36135520+Power-Maverick@users.noreply.github.com>

* Improve accessibility and eliminate code duplication in HTML escaping

Co-authored-by: Power-Maverick <36135520+Power-Maverick@users.noreply.github.com>

* Add defensive URL validation to prevent JavaScript protocol injection

Co-authored-by: Power-Maverick <36135520+Power-Maverick@users.noreply.github.com>

* Fix CodeQL warning by blocking vbscript protocol in URL validation

Co-authored-by: Power-Maverick <36135520+Power-Maverick@users.noreply.github.com>

* Remove HTTP(S) icon support, change path to dist/ relative, rename iconUrl to icon

Co-authored-by: Power-Maverick <36135520+Power-Maverick@users.noreply.github.com>

* Update ToolManifest comment to reflect bundled icons only (no HTTP URLs)

Co-authored-by: Power-Maverick <36135520+Power-Maverick@users.noreply.github.com>

* Add support for new Supabase 'icon' column with backward compatibility fallback to 'iconurl'

Co-authored-by: Power-Maverick <36135520+Power-Maverick@users.noreply.github.com>

* Fix CSP error by allowing HTTP(S) URLs for marketplace icon display

Co-authored-by: Power-Maverick <36135520+Power-Maverick@users.noreply.github.com>

* Add pptb-webview protocol to CSP img-src to allow local SVG icon loading

Co-authored-by: Power-Maverick <36135520+Power-Maverick@users.noreply.github.com>

* feat: add SVG icon support and improve icon URL resolution

* feat: implement theme-aware SVG icon support with CSS masks and improve icon rendering

* refactor: remove tool icon configuration section from README.md

---------

Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Co-authored-by: Power-Maverick <36135520+Power-Maverick@users.noreply.github.com>
Co-authored-by: Power-Maverick <danish.naglekar@hotmail.com>

* Move tool distribution from GitHub Releases to Azure Blob Storage (#400)

* Initial plan

* Add Azure Blob Storage support for tool distribution and registry fallback

Co-authored-by: Power-Maverick <36135520+Power-Maverick@users.noreply.github.com>

* Remove hard-coded Azure Blob storage account name; resolve URLs at runtime from AZURE_BLOB_BASE_URL

Co-authored-by: Power-Maverick <36135520+Power-Maverick@users.noreply.github.com>

* Simplify registry.json downloadUrl to filename-only; packages/ prefix added automatically at runtime

Co-authored-by: Power-Maverick <36135520+Power-Maverick@users.noreply.github.com>

* Use per-tool version folder layout in Azure Blob, mirroring GitHub Releases structure

Co-authored-by: Power-Maverick <36135520+Power-Maverick@users.noreply.github.com>

* Read download URL from new 'download' column in Supabase tools table, fall back to 'downloadurl'

Co-authored-by: Power-Maverick <36135520+Power-Maverick@users.noreply.github.com>

* fix: update Azure Blob Storage migration documentation to reflect new package structure

---------

Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Co-authored-by: Power-Maverick <36135520+Power-Maverick@users.noreply.github.com>
Co-authored-by: Power-Maverick <danish.naglekar@hotmail.com>

* feat: enhance ToolManager to create tools from installed manifests and improve tool retrieval logic

* Update src/main/constants.ts

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

* Update Azure Blob test download URL to dedicated test path (#404)

* Initial plan

* Update test tool download URL to /test/pptb-standard-sample-tool-download-test.tar.gz

Co-authored-by: Power-Maverick <36135520+Power-Maverick@users.noreply.github.com>

---------

Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Co-authored-by: Power-Maverick <36135520+Power-Maverick@users.noreply.github.com>

* Fix resolveDownloadUrl to include packages/ prefix for Azure Blob Storage paths (#405)

* Initial plan

* fix: include packages/ prefix in resolveDownloadUrl for Azure Blob Storage

Co-authored-by: Power-Maverick <36135520+Power-Maverick@users.noreply.github.com>

---------

Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Co-authored-by: Power-Maverick <36135520+Power-Maverick@users.noreply.github.com>

* Fix: include `icon` field in `fetchAzureBlobRegistry` tool mapping (#406)

* Initial plan

* fix: include icon field in fetchAzureBlobRegistry mapping

Co-authored-by: Power-Maverick <36135520+Power-Maverick@users.noreply.github.com>

---------

Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Co-authored-by: Power-Maverick <36135520+Power-Maverick@users.noreply.github.com>

* Update src/main/index.ts

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

---------

Co-authored-by: Copilot <198982749+Copilot@users.noreply.github.com>
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
* Initial plan

* Add modern themed update notification modal dialog

Co-authored-by: Power-Maverick <36135520+Power-Maverick@users.noreply.github.com>

* Address review comments: reword restart warning and extract highlights from release notes

Co-authored-by: Power-Maverick <36135520+Power-Maverick@users.noreply.github.com>

* Update src/renderer/modules/autoUpdateManagement.ts

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

---------

Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Co-authored-by: Power-Maverick <36135520+Power-Maverick@users.noreply.github.com>
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
cyco77 and others added 25 commits March 15, 2026 22:50
* Remove alwaysOnTop property from loading overlay and update auto-update notification modal to prevent covering system dialogs

* Add search clear buttons to sidebar search inputs

* Potential fix for pull request finding

Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>

* Add clear buttons to search inputs in select connection modals

* Potential fix for pull request finding

Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>

* Potential fix for pull request finding

Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>

* Potential fix for pull request finding

Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>

---------

Co-authored-by: Power-Maverick <danish.naglekar@hotmail.com>
Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
* feat: implement "What's New" feature with auto-update notifications and markdown rendering

* feat: enhance "What's New" feature to support insider version detection and update URLs accordingly

* Fix: Inject PPTB_UPDATES_ORIGIN into renderer CSP at build time (#454)

* Initial plan

* fix: make CSP reflect configured PPTB_UPDATES_ORIGIN at build time via Vite transformIndexHtml

Co-authored-by: Power-Maverick <36135520+Power-Maverick@users.noreply.github.com>

---------

Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Co-authored-by: Power-Maverick <36135520+Power-Maverick@users.noreply.github.com>

* Potential fix for pull request finding

Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>

* refactor: replace duplicate escapeHtml in markdown.ts with shared import from toolIconResolver (#457)

---------

Co-authored-by: Copilot <198982749+Copilot@users.noreply.github.com>
Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
* feat: add native context menu support with IPC integration for tabs

* fix: format grantCspConsent function for improved readability

* Potential fix for pull request finding

Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>

* Potential fix for pull request finding

Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>

* Potential fix for pull request finding

Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>

* Potential fix for pull request finding

Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>

* Potential fix for pull request finding

Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>

* Potential fix for pull request finding

Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>

* Bugfix

* Bugfix context menu position

---------

Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
* Initial plan

* feat: add connection import/export with warning for incomplete credentials

Co-authored-by: Power-Maverick <36135520+Power-Maverick@users.noreply.github.com>

* fix: update color adjustment method for connection warning in light theme

* fix: improve import/export UI layout, fix theme-aware icons, add export by category

Co-authored-by: Power-Maverick <36135520+Power-Maverick@users.noreply.github.com>

* fix: always show category export button and make it theme-aware

Co-authored-by: Power-Maverick <36135520+Power-Maverick@users.noreply.github.com>

* Potential fix for pull request finding

Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>

* fix: address unresolved code review comments (error normalization, UUID, accessibility)

Co-authored-by: Power-Maverick <36135520+Power-Maverick@users.noreply.github.com>

---------

Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Co-authored-by: Power-Maverick <36135520+Power-Maverick@users.noreply.github.com>
Co-authored-by: Power-Maverick <danish.naglekar@hotmail.com>
Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
…eload (#461)

* Initial plan

* Fix refresh issue: correct BrowserView dimensions and restore session with saved connections

Co-authored-by: Power-Maverick <36135520+Power-Maverick@users.noreply.github.com>

* Fix closeAllToolViews to also close terminals and revoke filesystem access per instance

Co-authored-by: Power-Maverick <36135520+Power-Maverick@users.noreply.github.com>

---------

Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Co-authored-by: Power-Maverick <36135520+Power-Maverick@users.noreply.github.com>
…enu (#464)

* Initial plan

* Change settings to open as a tab and add Settings option in View menu

Co-authored-by: Power-Maverick <36135520+Power-Maverick@users.noreply.github.com>

* Redesign settings tab: VSCode-style UI, fix tab label to show 'Settings' only, scrollable content

Co-authored-by: Power-Maverick <36135520+Power-Maverick@users.noreply.github.com>

* refactor: reorganize settings management and remove unused navigation elements

* Rename loadSidebarSettings/saveSidebarSettings to loadSettings/saveSettings

Co-authored-by: Power-Maverick <36135520+Power-Maverick@users.noreply.github.com>

---------

Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Co-authored-by: Power-Maverick <36135520+Power-Maverick@users.noreply.github.com>
Co-authored-by: Power-Maverick <danish.naglekar@hotmail.com>
* Initial plan

* feat: import connections from XrmToolBox XML files

Co-authored-by: Power-Maverick <36135520+Power-Maverick@users.noreply.github.com>

* fix: import crypto from node built-in in connectionsManager to fix ReferenceError in main process

Co-authored-by: Power-Maverick <36135520+Power-Maverick@users.noreply.github.com>

* Potential fix for pull request finding

Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>

---------

Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Co-authored-by: Power-Maverick <36135520+Power-Maverick@users.noreply.github.com>
Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
* Initial plan

* feat: support US Gov cloud (GCC High/DoD) URLs for Dataverse connections

Co-authored-by: Power-Maverick <36135520+Power-Maverick@users.noreply.github.com>

* refactor: extract isValidDataverseUrl helper with hostname-only, anchored, case-insensitive validation

Co-authored-by: Power-Maverick <36135520+Power-Maverick@users.noreply.github.com>

---------

Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Co-authored-by: Power-Maverick <36135520+Power-Maverick@users.noreply.github.com>
* wip/feat: implement multi-agent workflow setup with defined roles and human approval gate

* feat: implement mesh collaboration and risk-based checkpointing for agent workflows

* feat: enhance chat output contracts for agents to improve communication and clarity

* feat: add important links sidebar with curated resources and strict URL validation

* feat: enhance important links sidebar with display host and improved styling

* feat: add favicon fetching functionality and update important links sidebar with descriptions and icons

* Update src/main/index.ts

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

* Fix: Rename `getFaviconApiUrl` parameter from `host` to `url` (#471)

* Initial plan

* fix: update getFaviconApiUrl parameter name from host to url

Co-authored-by: Power-Maverick <36135520+Power-Maverick@users.noreply.github.com>

---------

Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Co-authored-by: Power-Maverick <36135520+Power-Maverick@users.noreply.github.com>

* Fix: Links Hub favicon handler security, XSS, and rendering bugs (#472)

* Initial plan

* fix: address unresolved PR review comments on Links Hub favicon handler and sidebar

Co-authored-by: Power-Maverick <36135520+Power-Maverick@users.noreply.github.com>

---------

Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Co-authored-by: Power-Maverick <36135520+Power-Maverick@users.noreply.github.com>

---------

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
Co-authored-by: Copilot <198982749+Copilot@users.noreply.github.com>
…rove category and environment colour UX (#476)

* Initial plan

* fix(ui): fix dual-connection tab colours, swap test/uat env defaults, add category colour reuse in modals

Co-authored-by: Power-Maverick <36135520+Power-Maverick@users.noreply.github.com>
Agent-Logs-Url: https://github.com/PowerPlatformToolBox/desktop-app/sessions/36215f3c-c4f5-4b8d-b69c-38a10596f30b

* fix(ui): replace category datalist with styled select dropdown; show -- when no category selected

Co-authored-by: Power-Maverick <36135520+Power-Maverick@users.noreply.github.com>
Agent-Logs-Url: https://github.com/PowerPlatformToolBox/desktop-app/sessions/e63c4fea-b3f3-4128-a5e4-31201aeca998

* feat(ui): env color defaults, category reset visibility, sidebar category color swatch

Co-authored-by: Power-Maverick <36135520+Power-Maverick@users.noreply.github.com>
Agent-Logs-Url: https://github.com/PowerPlatformToolBox/desktop-app/sessions/04495a30-b495-4fa9-8788-86465ede19cb

* feat(ui): hide category color section when no category (default) is selected

Co-authored-by: Power-Maverick <36135520+Power-Maverick@users.noreply.github.com>
Agent-Logs-Url: https://github.com/PowerPlatformToolBox/desktop-app/sessions/afe2255f-00cc-455e-99a4-9ff8d1b4a95e

---------

Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Co-authored-by: Power-Maverick <36135520+Power-Maverick@users.noreply.github.com>
* Initial plan

* Replace blocking About dialog with custom modal BrowserWindow

The About dialog previously used dialog.showMessageBoxSync which is
not modal relative to the main app window and can be hidden behind it.

Now it sends a SHOW_ABOUT IPC event to the renderer which shows a
custom BrowserWindow-based modal (same pattern as the update dialog)
with version info, environment details, and a copy-to-clipboard button.

Co-authored-by: Power-Maverick <36135520+Power-Maverick@users.noreply.github.com>
Agent-Logs-Url: https://github.com/PowerPlatformToolBox/desktop-app/sessions/51cb116a-9705-4972-8e3b-242f5767550e

* Show success notification after copying About info to clipboard

Co-authored-by: Power-Maverick <36135520+Power-Maverick@users.noreply.github.com>
Agent-Logs-Url: https://github.com/PowerPlatformToolBox/desktop-app/sessions/5b424552-b2fb-4bce-adb3-1893b210285a

* Guard showAboutDialog against destroyed/loading webContents; remove unused GET_ABOUT_INFO IPC

Co-authored-by: Power-Maverick <36135520+Power-Maverick@users.noreply.github.com>
Agent-Logs-Url: https://github.com/PowerPlatformToolBox/desktop-app/sessions/a4e390e5-c47b-4e65-b9a4-6e47ed1385d3

---------

Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Co-authored-by: Power-Maverick <36135520+Power-Maverick@users.noreply.github.com>
…ers (#481)

* Initial plan

* Add appearance settings for category/environment color show/hide and border thickness

Co-authored-by: Power-Maverick <36135520+Power-Maverick@users.noreply.github.com>
Agent-Logs-Url: https://github.com/PowerPlatformToolBox/desktop-app/sessions/193f644f-df36-4d4c-8ed0-96b7a0f482c9

* Move hardcoded appearance defaults into named constants

Co-authored-by: Power-Maverick <36135520+Power-Maverick@users.noreply.github.com>
Agent-Logs-Url: https://github.com/PowerPlatformToolBox/desktop-app/sessions/f393659c-9ed8-4b82-a91b-e94a799801a8

---------

Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Co-authored-by: Power-Maverick <36135520+Power-Maverick@users.noreply.github.com>
* Initial plan

* Add 'Restore Session on Startup' setting to skip reopening tools on app start

Co-authored-by: Power-Maverick <36135520+Power-Maverick@users.noreply.github.com>
Agent-Logs-Url: https://github.com/PowerPlatformToolBox/desktop-app/sessions/8ec8d9a2-6b1a-4686-879a-b04708e4cbe8

* Fix build error, add tool name to connection modals, fix missing braces from merge

Co-authored-by: Power-Maverick <36135520+Power-Maverick@users.noreply.github.com>
Agent-Logs-Url: https://github.com/PowerPlatformToolBox/desktop-app/sessions/3d6bb8bf-f335-43ee-9634-7e61be7db8fc

* fix: silently re-authenticate connections on session restore, show modal on failure

Co-authored-by: Power-Maverick <36135520+Power-Maverick@users.noreply.github.com>
Agent-Logs-Url: https://github.com/PowerPlatformToolBox/desktop-app/sessions/24765ec3-ad59-4605-a741-566555503b34

* feat: add unsaved changes detection and close guard for settings tab
feat: made settings button sticky

* fix pr review comment - #482 (comment)

* fix: apply unresolved reviewer feedback - shared escapeHtml, await closeOtherTabs

Co-authored-by: Power-Maverick <36135520+Power-Maverick@users.noreply.github.com>
Agent-Logs-Url: https://github.com/PowerPlatformToolBox/desktop-app/sessions/fb9f6281-aee9-4813-b322-1751c3a0844b

---------

Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Co-authored-by: Power-Maverick <36135520+Power-Maverick@users.noreply.github.com>
Co-authored-by: Power-Maverick <danish.naglekar@hotmail.com>
…View and align UI with modal windows (#491)

* Initial plan

* Fix global search overlay appearing behind tool BrowserView

Co-authored-by: Power-Maverick <36135520+Power-Maverick@users.noreply.github.com>
Agent-Logs-Url: https://github.com/PowerPlatformToolBox/desktop-app/sessions/98496443-e99d-461f-9385-da0c10cd5dc5

* UI: Add modal-style header with close button to global search

Co-authored-by: Power-Maverick <36135520+Power-Maverick@users.noreply.github.com>
Agent-Logs-Url: https://github.com/PowerPlatformToolBox/desktop-app/sessions/263a78e7-da1f-4f02-9ab5-5b5d92d93119

---------

Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Co-authored-by: Power-Maverick <36135520+Power-Maverick@users.noreply.github.com>
…force-close with auto-update (#501)

* Initial plan

* fix: guard webContents.isDestroyed() to prevent crash on force-close during auto-update

Agent-Logs-Url: https://github.com/PowerPlatformToolBox/desktop-app/sessions/58b630b9-e75d-4941-9bae-5a32113756eb

Co-authored-by: Power-Maverick <36135520+Power-Maverick@users.noreply.github.com>

---------

Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Co-authored-by: Power-Maverick <36135520+Power-Maverick@users.noreply.github.com>
…se-backed links (#499)

* feat: rename Important Links to Community Resources, make links dynamic via Supabase community_links table

Agent-Logs-Url: https://github.com/PowerPlatformToolBox/desktop-app/sessions/3e132f84-fa7c-40ca-801c-b1d29fae727b

Co-authored-by: Power-Maverick <36135520+Power-Maverick@users.noreply.github.com>

* fix: address code review - remove unnecessary type assertion and simplify Supabase row cast

Agent-Logs-Url: https://github.com/PowerPlatformToolBox/desktop-app/sessions/3e132f84-fa7c-40ca-801c-b1d29fae727b

Co-authored-by: Power-Maverick <36135520+Power-Maverick@users.noreply.github.com>

* fix: remove group_sort_order column - group ordering handled by the app

Agent-Logs-Url: https://github.com/PowerPlatformToolBox/desktop-app/sessions/e2dc53c8-11c9-4527-8170-7a70b191705b

Co-authored-by: Power-Maverick <36135520+Power-Maverick@users.noreply.github.com>

* Update src/main/managers/toolRegistryManager.ts

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

* Update src/main/managers/toolRegistryManager.ts

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

---------

Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Co-authored-by: Power-Maverick <36135520+Power-Maverick@users.noreply.github.com>
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
* feat: add import connection source modal (XTB vs PPTB) with XTB export hint

Agent-Logs-Url: https://github.com/PowerPlatformToolBox/desktop-app/sessions/007d517e-6939-4a4e-9019-cb7badde489d

Co-authored-by: Power-Maverick <36135520+Power-Maverick@users.noreply.github.com>

* feat: add custom modal popup for import connection source with copy path functionality

---------

Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Co-authored-by: Power-Maverick <36135520+Power-Maverick@users.noreply.github.com>
Co-authored-by: Power-Maverick <danish.naglekar@hotmail.com>
Copilot AI review requested due to automatic review settings April 2, 2026 21:01
@github-actions
Copy link
Copy Markdown

github-actions bot commented Apr 2, 2026

Bundle Size Report 📦

Bundle Size
Main Process 955.73 KB
Renderer JS 544.83 KB
Renderer CSS 95.56 KB
Total 1.56 MB

Bundle Analysis Reports

The detailed bundle analysis reports are available in the workflow artifacts:

  • 📊 Main Process: stats-main.html
  • 📊 Renderer Process: stats-renderer.html

Download the artifacts from the workflow run to view interactive visualizations.


Bundle size tracking is now active! This helps prevent bundle bloat.

Copy link
Copy Markdown
Contributor

Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Release-focused PR that bumps the desktop app to v1.2.1 and introduces several user-facing UX features (What’s New, About dialog, Community Resources), plus new connection import/export flows and supporting IPC / preload / main-process hardening.

Changes:

  • Add in-app “What’s New” experience (auto-open after update), plus shared safe markdown rendering.
  • Add connection import/export (PPTB JSON + XrmToolBox XML source selection) and new connection/category appearance settings.
  • Add Community Resources sidebar backed by Supabase (with local JSON fallback), plus a custom About modal and various Electron lifecycle/IPC improvements.

Reviewed changes

Copilot reviewed 73 out of 81 changed files in this pull request and generated 7 comments.

Show a summary per file
File Description
vite.config.ts Injects PPTB_UPDATES_ORIGIN into Vite define and CSP placeholder at build time.
src/renderer/utils/markdown.ts Adds shared “safe markdown → HTML” renderer and external-link wiring.
src/renderer/types/index.ts Extends renderer settings state with new appearance + startup fields.
src/renderer/styles/_variables.scss Adds connection warning colors and adjusts env color assignments.
src/renderer/modules/whatsNewManagement.ts New “What’s New” tool-detail tab that fetches remote markdown.
src/renderer/modules/themeManagement.ts Updates sidebar import/export icon switching for theme changes.
src/renderer/modules/sidebarManagement.ts Updates sidebar switching to load settings + community links sidebars.
src/renderer/modules/marketplaceManagement.ts Switches README rendering to shared safe markdown + link wiring.
src/renderer/modules/initialization.ts Adds renderer-init IPC signal, new sidebar buttons, settings-tab wiring, and appearance initialization.
src/renderer/modules/globalSearchManagement.ts Improves command palette behavior with BrowserView hiding/restoration and settings-tab navigation.
src/renderer/modules/communityResourcesSidebarManagement.ts New Community Resources sidebar rendering with allowlisting and favicon support.
src/renderer/modules/aboutManagement.ts New About modal orchestration using BrowserWindow modals.
src/renderer/modals/sharedStyles.ts Adds search input wrapper + clear button styling for modals.
src/renderer/modals/selectMultiConnection/view.ts Adds tool name eyebrow support + search clear button UI.
src/renderer/modals/selectMultiConnection/controller.ts Wires search clear button behavior in multi-connection modal.
src/renderer/modals/selectConnection/view.ts Adds tool name eyebrow support + search clear button UI.
src/renderer/modals/selectConnection/controller.ts Wires search clear button behavior and normalizes event handler quoting/style.
src/renderer/modals/importConnectionSource/view.ts New modal UI to select import source (XTB vs PPTB) with guidance.
src/renderer/modals/importConnectionSource/controller.ts New controller script for import-source selection and copy-to-clipboard hint.
src/renderer/modals/editConnection/view.ts Updates edit connection UI for env/category color + category selection UX.
src/renderer/modals/editConnection/controller.ts Adds async setup for categories + improved env/category color behaviors.
src/renderer/modals/addConnection/view.ts Updates add connection UI for env/category color + category selection UX.
src/renderer/modals/addConnection/controller.ts Adds async setup for categories + improved env/category color behaviors.
src/renderer/modals/about/view.ts Adds About modal view with styled layout and local escaping.
src/renderer/modals/about/controller.ts Adds About modal controller wiring (close + copy).
src/renderer/index.html Adds Links sidebar, import/export UI, search clear buttons, settings button behavior, CSP placeholder.
src/renderer/icons/light/import.svg New import icon (light theme).
src/renderer/icons/light/export.svg New export icon (light theme).
src/renderer/icons/light/bookmark.svg New bookmark icon (light theme).
src/renderer/icons/dark/import.svg New import icon (dark theme).
src/renderer/icons/dark/export.svg New export icon (dark theme).
src/renderer/icons/dark/bookmark.svg New bookmark icon (dark theme).
src/renderer/data/importantLinks.json Bundled fallback community links collection.
src/renderer/constants/index.ts Adds activity bar icon id and new appearance defaults/min/max constants.
src/main/toolPreloadBridge.ts Tweaks type import ordering and marks loading APIs deprecated.
src/main/preload.ts Adds connections import/export, community links fetch, favicon proxy, context menu IPC, settings/about events.
src/main/modalPreload.ts Exposes connection categories API to modal context.
src/main/managers/toolWindowManager.ts Adds renderer-initialized cleanup path and refactors view teardown; devtools detach.
src/main/managers/toolsManager.ts Exposes registry manager community links fetch.
src/main/managers/toolRegistryManager.ts Implements Supabase community_links query and grouping transform.
src/main/managers/settingsManager.ts Adds default for restoreSessionOnStartup.
src/main/managers/protocolHandlerManager.ts Adds explicit enablement logic for protocol handler in dev vs packaged.
src/main/managers/modalWindowManager.ts Hardens IPC send against destroyed webContents.
src/main/managers/loadingOverlayWindowManager.ts Updates always-on-top rationale comment.
src/main/managers/dataverseManager.ts Renames select parameter names for metadata APIs (properties vs columns).
src/main/managers/connectionsManager.ts Adds export/import implementations with sanitization and validation.
src/main/managers/autoUpdateManager.ts Hardens IPC send against destroyed webContents.
src/main/index.ts Adds favicon proxy IPC, context menu IPC, openExternal hardening, auto-open What’s New, settings menu action, connection import/export handlers.
src/common/types/settings.ts Extends persisted settings with pending What’s New + appearance fields.
src/common/types/index.ts Exports new community links types.
src/common/types/connection.ts Adds hasIncompleteCredentials connection field.
src/common/types/communityLinks.ts Adds community links shared types.
src/common/types/common.ts Adds native context menu request/item types.
src/common/types/api.ts Extends toolbox API types with new methods/events (context menu, favicon, community links, import/export).
src/common/ipc/channels.ts Adds new IPC channels for categories, import/export, favicon, context menu, settings/about events, renderer initialized.
RELEASE_NOTES.md Updates release notes to 1.2.1 content and changelog link.
packages/toolboxAPI.d.ts Marks showLoading/hideLoading as deprecated in tool types.
packages/package.json Bumps @pptb/types version.
packages/dataverseAPI.d.ts Updates parameter naming in Dataverse API type definitions.
package.json Bumps app version to 1.2.1.
docs/COMMUNITY_LINKS_TABLE.md Adds documentation for Supabase community_links table schema and policies.
.vscode/tasks.json Adds pnpm-based lint/typecheck tasks and switches build task to pnpm.
.github/plans/README.md Adds documentation for plan artifact workflow.
.github/plans/plan-multi-agent-setup.md Adds plan artifact for multi-agent workflow setup.
.github/plans/plan-important-links-hub.md Adds plan artifact for links hub feature.
.github/plans/_template.md Adds plan template with triage/checkpoints.
.github/agents/UXDesigner.agent.md Adds UI Designer agent profile.
.github/agents/SecurityReviewer.agent.md Adds Security Reviewer agent profile.
.github/agents/ProductManager.agent.md Adds Product Manager agent profile.
.github/agents/ProcessDesigner.agent.md Adds Process Designer agent profile.
.github/agents/DataArchitect.agent.md Adds Data Architect agent profile.
.github/agents/Critic.agent.md Adds Critic agent profile.
.github/agents/CodingAgent.agent.md Adds App Developer agent profile.
.github/agents/CodeReviewer.agent.md Adds Code Reviewer agent profile.
.github/agents/Architect.agent.md Adds Tech Designer agent profile.
.env.example Documents PPTB_UPDATES_ORIGIN env var.
Comments suppressed due to low confidence (1)

src/renderer/modules/globalSearchManagement.ts:287

  • The settings search actions call closeGlobalSearch() while shouldRestoreToolOnClose may still be true, then navigate to the Settings tab via navigateToSetting(). This can briefly restore the previous BrowserView before the Settings detail tab hides it, causing a visible flicker. For settings navigation actions, set shouldRestoreToolOnClose = false before closing the palette (similar to the tool launch and marketplace actions).

@Power-Maverick Power-Maverick merged commit 2c6727c into main Apr 6, 2026
14 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

8 participants