Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
83 commits
Select commit Hold shift + click to select a range
ae1a656
update dev from main (#151)
marc-romu Apr 20, 2025
e29a896
update marc-romu/chat (#152)
marc-romu Apr 20, 2025
8d37db8
chore(branch): update marc-romu/chat from marc-romu/workflows for pat…
actions-user Apr 20, 2025
4e8f908
chore(branch): update marc-romu/chat from marc-romu/workflows for pat…
marc-romu Apr 20, 2025
bd71462
chore(branch): update marc-romu/chat from main for path .github
actions-user Apr 20, 2025
6c996cc
chore(branch): update dev from main for path .github
actions-user Apr 20, 2025
1465fd9
chore(branch): update dev from main for path .github (#157)
marc-romu Apr 20, 2025
b238201
chore(branch): update marc-romu/chat from main for path .github (#156)
marc-romu Apr 20, 2025
3a68468
update dev (#158)
marc-romu Apr 20, 2025
3256740
fix(tools): fixed wrong namespaces
marc-romu Apr 20, 2025
86eef2b
udpate dev from main (#164)
marc-romu Apr 20, 2025
0cc7d8c
remove(user-update-branch)
marc-romu Apr 20, 2025
f4e88a4
update marc-romu/chat from main (#165)
marc-romu Apr 20, 2025
f946cb9
feat(components): add GhRetrieveComponents component and ghretrieveco…
marc-romu Apr 20, 2025
b079711
feat(ghretrieve): make filter case insensitive
marc-romu Apr 20, 2025
ddc33c1
refactor(ghtools): code cleanup
marc-romu Apr 20, 2025
33d7484
fix(ghtools): add inputs and outputs, and synonyms dictionary
marc-romu Apr 20, 2025
dbabf31
docs
marc-romu Apr 20, 2025
2832e40
feat(ghretrieve): add GhRetrieveComponents component and AI tool (#166)
marc-romu Apr 20, 2025
017b473
feat(ghcategories): new tool to retrieve all available categories and…
marc-romu Apr 20, 2025
886c251
docs
marc-romu Apr 20, 2025
d447e76
feat(ghcategories): new tool to retrieve all available categories and…
marc-romu Apr 20, 2025
6c62fc9
feat(tools): new ghtooglepreview ai tool to toogle preview of compone…
marc-romu Apr 20, 2025
2fb2a69
feat(tools): add ghtogglepreview AI tool for toggling component previ…
marc-romu Apr 20, 2025
da2b839
feat(tools): new ghtooglelocked ai tool to toogle locked (enabled/dis…
marc-romu Apr 20, 2025
304b92f
fix(ghtogglepreview): not properly toggling params
marc-romu Apr 20, 2025
0cd12ef
feat(tools): new ghtooglelocked ai tool to toogle locked (enabled/dis…
marc-romu Apr 20, 2025
6bebd55
feat(core-grasshopper): add MoveInstance method and ghmoveobj AI tool
marc-romu Apr 20, 2025
5608077
fix(ghmoveobj): fixed incorrect redraw
marc-romu Apr 20, 2025
21b95c4
fix(ghput): component value property case-sensibility error
marc-romu Apr 20, 2025
561cd4d
feat(core-grasshopper): add MoveInstance method and ghmoveobj AI tool…
marc-romu Apr 20, 2025
4df5c0c
refactor(security): enhanced security for aitoolmanager and providerm…
marc-romu Apr 20, 2025
f96a950
refactor(security): ensure strong names in compilation
marc-romu Apr 21, 2025
4f3ea93
build(net48): dropped support for net48
marc-romu Apr 21, 2025
a9990ab
feat(mac): supposed compatibility with mac but not tested
marc-romu Apr 21, 2025
f251598
build: fix issues WIP
marc-romu Apr 21, 2025
5a9bbb5
build: fix issues WIP
marc-romu Apr 21, 2025
d4a2365
build: fix issues WIP
marc-romu Apr 21, 2025
a515d04
build: fix issues WIP
marc-romu Apr 21, 2025
baff249
build: fix issues WIP
marc-romu Apr 21, 2025
df8b31a
ci
marc-romu Apr 21, 2025
055e8e7
feat(providers): enhanced security for providers (#171)
marc-romu Apr 21, 2025
c5b985b
docs: update version badge for dev
actions-user Apr 21, 2025
4c6a67a
docs: update version badge for dev to 0.3.0-dev.250421 (#172)
marc-romu Apr 21, 2025
07a60c9
update marc-romu/chat branch from dev (#173)
marc-romu Apr 21, 2025
5d47384
feat(providers): enhances security for providers with improvements in…
marc-romu Apr 21, 2025
4fc7735
fix(settings): prevent settings from being erased when providers are …
marc-romu Apr 21, 2025
f89e30f
docs
marc-romu Apr 21, 2025
ee35196
fix(settings): WIP issue saving and loading settings
marc-romu Apr 21, 2025
e9a607e
feat(settings): WIP improved provider settings security by disabling …
marc-romu Apr 23, 2025
be35584
ci(windsurf): update of rules
marc-romu Apr 23, 2025
f6239b1
feat(settings): WIP improved provider settings security by disabling …
marc-romu Apr 23, 2025
3ac5055
docs
marc-romu Apr 23, 2025
9ba9109
feat(security): enhanced security by signing providers and verifying …
marc-romu Apr 23, 2025
720e62a
docs: update version badge for dev
actions-user Apr 23, 2025
83736bf
docs: update version badge for dev to 0.3.0-dev.250423 (#175)
marc-romu Apr 23, 2025
3b64d41
fix(mistralai): MistralAI provider not loading tools
marc-romu Apr 26, 2025
8328e9e
chore(aiutils): adding debug logs to getresponse
marc-romu Apr 26, 2025
458da27
feat(providers): validation of signature algorithm
marc-romu Apr 26, 2025
2f9c264
feat(providers): verify strong name and authenticode before loading p…
marc-romu Apr 26, 2025
3398aba
ci(tests): added multiple testing units
marc-romu Apr 26, 2025
f6abf53
chore: update development version date to 0.3.0-dev.250426
actions-user Apr 26, 2025
9eede00
reorganization
marc-romu Apr 26, 2025
043dbeb
update marc-romu/chat from dev (#177)
marc-romu Apr 26, 2025
df46a0e
chore: update development version date to 0.3.0-dev.250426 (#176)
marc-romu Apr 26, 2025
b687488
ci(worklows): add permissions to ci-dotnet-tests
marc-romu Apr 26, 2025
163235b
feat(messagebox): good-looking error warning and information dialogs …
marc-romu Apr 26, 2025
5a90417
feat(dialogs): added smarthopper logo in webchat, message, about and …
marc-romu Apr 26, 2025
377b078
fix(ghget): reenable the select button function
marc-romu Apr 26, 2025
8f598c7
docs(changelog)
marc-romu Apr 26, 2025
7b562ea
feat(webtools): new web tools to retrieve html and json from the web
marc-romu Apr 26, 2025
eddf8e5
feat(core,ui,ci): web tools, UI improvements, bug fixes, and CI enhan…
marc-romu Apr 26, 2025
2d48ed4
chore: preparing release to 0.3.0-alpha
marc-romu Apr 27, 2025
172beb3
docs: update version badge for dev
actions-user Apr 27, 2025
be28a4e
docs: update version badge for dev to 0.3.0-alpha (#179)
marc-romu Apr 27, 2025
c4a5643
Update README.md
marc-romu Apr 27, 2025
1159b0b
docs(changelog)
marc-romu Apr 27, 2025
c0684aa
Update README.md
marc-romu Apr 27, 2025
30b1c75
fix(ci): ci-dotnet-test failing to sign dll
marc-romu Apr 27, 2025
7ae35e1
fix: failing ci tests
marc-romu Apr 27, 2025
611ffa9
refactor(providermanager): cleanup
marc-romu Apr 27, 2025
5efbd64
refactor(components): code cleanup
marc-romu Apr 27, 2025
81a7fab
fix(ci): fixed tests VerifySignature WIP
marc-romu Apr 27, 2025
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
13 changes: 6 additions & 7 deletions .editorconfig
Original file line number Diff line number Diff line change
Expand Up @@ -13,20 +13,19 @@ tab_width = 4

# New line preferences
end_of_line = crlf
insert_final_newline = false
insert_final_newline = true

#### .NET Coding Conventions ####

# Organize usings
dotnet_separate_import_directive_groups = false
dotnet_sort_system_directives_first = false
file_header_template = "/*\n * SmartHopper - AI-powered Grasshopper Plugin\n * Copyright (C) {year} Marc Roca Musach\n *\n * This library is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 3 of the License, or (at your option) any later version.\n */"
dotnet_sort_system_directives_first = true

# this. and Me. preferences
dotnet_style_qualification_for_event = false
dotnet_style_qualification_for_field = false
dotnet_style_qualification_for_method = false
dotnet_style_qualification_for_property = false
dotnet_style_qualification_for_event = true
dotnet_style_qualification_for_field = true
dotnet_style_qualification_for_method = true
dotnet_style_qualification_for_property = true

# Language keywords vs BCL types preferences
dotnet_style_predefined_type_for_locals_parameters_members = true
Expand Down
6 changes: 5 additions & 1 deletion .github/CODEOWNERS
Original file line number Diff line number Diff line change
Expand Up @@ -13,13 +13,17 @@
/CHANGELOG.md @marc-romu
/LICENSE @marc-romu
/CONTRIBUTING.md @marc-romu
/RELEASE_CHECKLIST.md @marc-romu

# Critical repository files
/.gitignore @marc-romu
/.gitattributes @marc-romu
/.windsurfrules @marc-romu
*.ps1 @marc-romu

# Critical solution files
/*.sln @marc-romu
/NuGet.Config @marc-romu
/Solution.props @marc-romu
/Solution.props @marc-romu
/Directory.Build.props @marc-romu
/Directory.Build.targets @marc-romu
10 changes: 8 additions & 2 deletions .github/labels.yml
Original file line number Diff line number Diff line change
Expand Up @@ -83,6 +83,9 @@
- name: "component: AI Chat Output"
color: "000"
description: "Issues related to the Chat Output component"
- name: "component: Context Parameters"
color: "000"
description: "Issues related to the Context Parameters component"
- name: "component: Deconstruct Metrics"
color: "000"
description: "Issues related to the Deconstruct Metrics component"
Expand All @@ -105,9 +108,12 @@
- name: "feature: Settings"
color: "000"
description: "Issues related to the Settings menu"
- name: "feature: AI"
- name: "feature: AI Tools"
color: "000"
description: "Issues related to the AI tools"
- name: "feature: Provider Manager"
color: "000"
description: "Issues related to the AI features"
description: "Issues related to the Provider Manager"
- name: "feature: UI"
color: "000"
description: "Issues related to the UI features"
Expand Down
58 changes: 58 additions & 0 deletions .github/workflows/ci-dotnet-tests.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,58 @@
name: 🧪 .NET CI
# Description: This workflow runs .NET tests on the SmartHopper solution to ensure that changes do not break functionality.
#
# Triggers:
# - push to main branch
# - pull_request targeting main branch
#
# Permissions:
# - contents: read - Required to read repository content
# - pull-requests: read - Required to read pull request information

on:
push:
branches: [ main ]
pull_request:
branches: [ main ]

permissions:
contents: read
pull-requests: read

jobs:
test:
runs-on: windows-latest
steps:
- name: Checkout code
uses: actions/checkout@v3

- name: Setup .NET
uses: actions/setup-dotnet@v3
with:
dotnet-version: '7.0.x'

- name: Prepare strong-name key
shell: pwsh
env:
SIGNING_SNK_BASE64: ${{ secrets.SIGNING_SNK_BASE64 }}
run: |
if (-not (Test-Path signing.snk)) {
if ($env:SIGNING_SNK_BASE64) {
Write-Host "Decoding signing.snk from Base64 secret"
./Sign-StrongNames.ps1 -Base64 $env:SIGNING_SNK_BASE64
} else {
Write-Host "Generating temporary signing.snk"
./Sign-StrongNames.ps1 -Generate
}
} else {
Write-Host "signing.snk already exists"
}

- name: Restore dependencies
run: dotnet restore SmartHopper.sln

- name: Build solution
run: dotnet build --no-restore --configuration Release SmartHopper.sln

- name: Run all tests
run: dotnet test --no-build --configuration Release --results-directory TestResults
69 changes: 30 additions & 39 deletions .github/workflows/release-build.yml
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,6 @@ permissions:
jobs:
build:
runs-on: windows-latest

steps:
- name: Checkout repository
uses: actions/checkout@8ade135a41bc03ea155e62e844d188df1ea18608 # v4
Expand Down Expand Up @@ -100,43 +99,36 @@ jobs:
Write-Host "This is a draft release. Skipping build and upload."
exit 0

- name: Setup .NET
uses: actions/setup-dotnet@3447fd6a9f9e57506b15f895c5b76d3b197dc7c2 # v4
- name: Setup .NET SDK
uses: actions/setup-dotnet@v3
with:
dotnet-version: 7.0.x
- name: Setup .NET Framework
dotnet-version: '7.0.x'

- name: Decode strong-name key via script
shell: pwsh
run: |
# .NET Framework 4.8 is pre-installed on Windows 2022 runner
# Just verify it's available
Get-ChildItem "HKLM:\SOFTWARE\Microsoft\NET Framework Setup\NDP\v4\Full\"

- name: Configure NuGet Sources
# Initialize Developer PowerShell environment for VS tools
& 'C:\Program Files (x86)\Microsoft Visual Studio\2022\Enterprise\Common7\Tools\VsDevCmd.bat'
pwsh ./Sign-StrongNames.ps1 -Base64 "${{ secrets.SIGNING_SNK_BASE64 }}"

- name: Restore dependencies
run: dotnet restore SmartHopper.sln

- name: Build solution
run: dotnet build SmartHopper.sln --configuration Release --no-restore /p:SignAssembly=true /p:AssemblyOriginatorKeyFile=signing.snk

- name: Decode Authenticode PFX from secrets
shell: pwsh
run: |
# List current sources
Write-Host "Current NuGet sources:"
dotnet nuget list source

# Add Rhino source if not already present
$sources = dotnet nuget list source
if ($sources -notmatch "https://mcneel.jfrog.io/artifactory/api/nuget/rhino-packages") {
Write-Host "Adding Rhino NuGet source..."
dotnet nuget add source "https://mcneel.jfrog.io/artifactory/api/nuget/rhino-packages" -n rhinoSource
} else {
Write-Host "Rhino NuGet source already exists."
}

# Verify final configuration
Write-Host "Final NuGet sources:"
dotnet nuget list source

- name: Restore dependencies
run: dotnet restore

- name: Build
run: dotnet build --no-restore --configuration Release
Write-Host "Decoding Authenticode PFX from secrets..."
pwsh ./Sign-Authenticode.ps1 -Base64 "${{ secrets.SIGNING_PFX_BASE64 }}" -Password "${{ secrets.SIGNING_PFX_PASSWORD }}"

- name: Authenticode-sign provider assemblies
shell: pwsh
run: |
$version = "${{ steps.determine_version.outputs.VERSION }}"
Write-Host "Auth-signing SmartHopper provider DLLs in bin\\$version\\Release"
pwsh ./Sign-Authenticode.ps1 -Sign "bin\\$version\\Release" -Password "${{ secrets.SIGNING_PFX_PASSWORD }}"

- name: Create Output Directory
shell: pwsh
Expand All @@ -160,7 +152,7 @@ jobs:
}

# Define the target platforms
$platforms = @("net48", "net7.0-windows", "net7.0")
$platforms = @("net7.0-windows", "net7.0")

# Copy only .gha and .dll files directly from each platform folder (not recursive)
foreach ($platform in $platforms) {
Expand Down Expand Up @@ -218,7 +210,7 @@ jobs:
ForEach-Object { Write-Host " - $($_.Name)" }

# Define the target platforms
$platforms = @("net48", "net7.0-windows", "net7.0")
$platforms = @("net7.0-windows", "net7.0")
$missingFiles = $false

foreach ($platform in $platforms) {
Expand Down Expand Up @@ -285,9 +277,8 @@ jobs:
run: |
$version = "${{ steps.determine_version.outputs.VERSION }}"
$platforms = @{
"net48" = "SmartHopper-$version-Rhino7-Windows.zip"
"net7.0-windows" = "SmartHopper-$version-Rhino8-Windows.zip"
"net7.0" = "SmartHopper-$version-Rhino8-Mac.zip"
"net7.0" = "SmartHopper-$version-Rhino8-Mac-not-tested.zip"
}

$zipPaths = @()
Expand Down Expand Up @@ -363,6 +354,6 @@ jobs:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
with:
upload_url: ${{ github.event_name == 'release' && github.event.release.upload_url || steps.get_release_url.outputs.UPLOAD_URL }}
asset_path: SmartHopper-${{ steps.determine_version.outputs.VERSION }}-Rhino8-Mac.zip
asset_name: SmartHopper-${{ steps.determine_version.outputs.VERSION }}-Rhino8-Mac.zip
asset_path: SmartHopper-${{ steps.determine_version.outputs.VERSION }}-Rhino8-Mac-not-tested.zip
asset_name: SmartHopper-${{ steps.determine_version.outputs.VERSION }}-Rhino8-Mac-not-tested.zip
asset_content_type: application/zip
6 changes: 5 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -52,4 +52,8 @@ _ReSharper*/

# Not licensed images
design/icons/template/*
design/icons/source/*
design/icons/source/*

# Code signing
*.snk
*.pfx
58 changes: 36 additions & 22 deletions .windsurfrules
Original file line number Diff line number Diff line change
@@ -1,23 +1,37 @@
1. This is a C# project, using .NET 7 and .NET 4.8 for both Windows and Mac.
2. The aim of the project is to create some Grasshopper components.
3. The project is structured in the following projects:
- SmartHopper.Core: Contains the core functionality
- SmartHopper.Core.Grasshopper: Contains the core functionality to interact with Grasshopper (type converters, utils, and tools)
- SmartHopper.Components: Contains the Grasshopper components. Most of the components depend on the Component Base defined in SmartHopper.Core/ComponentBase. Each component implements a tool for a specific function defined in SmartHopper.Core.Grasshopper/Tools. Tools will be callable from a component, or from the AIChatComponent, which is a chat interface with AI.
- SmartHopper.Config: Contains the configuration for the plugin and for the AI providers. It also defines the necessary models and interfaces.
- SmartHopper.Menu: Sets up the menu bar
- SmartHopper.Components.Test: Is a debugging solution, not available for production.
- SmartHopper.Providers.MistralAI: Contains the MistralAI provider
- SmartHopper.Providers.OpenAI: Contains the OpenAI provider
- SmartHopper.Providers.Template: Contains a Template project for new providers. This project is not registered in the solution.
4. Use native Grasshopper types, objects and methods where possible.
5. Use https://developer.rhino3d.com/ as the official documentation.
6. Use English language only.
7. Component Structure:
- All components should inherit from ComponentBase or a derived class.
- Components should be named with the pattern [Category][Action][Type]Component (e.g., AITextGenerateComponent).
- Consider using AIStatefulAsyncComponentBase since it already implements most of the required structure to manage AI methods, states and async operations.
8. When asked for a PR/commit title or description, follow the rules in @.github/PULL_REQUEST_TEMPLATE.md
9. Make only targeted edits to existing code.
# Project-Specific Rules

When the user asks you to add, change, deprecate, remove, fix, or security edit the code, if changes are relevant, mention them in the @CHANGELOG.md file under the "Unreleased" section. Do not modify other parts of the file. Subsections should be limited to and ordered as follows: Added, Changed, Deprecated, Removed, Fixed, Security
1. Target platforms & frameworks:
- Rhino 8 (Grasshopper 1)
- Windows: .NET 7-windows
- macOS: .NET 7
2. Solution structure:
- SmartHopper.Core: Contains the core functionality
- SmartHopper.Core.Grasshopper: Type converters, utilities & tool definitions
- SmartHopper.Components: Grasshopper components (inherit ComponentBase/AIStatefulAsyncComponentBase)
- SmartHopper.Config: Configuration models & ProviderManager
- SmartHopper.Menu: Menu bar setup
- SmartHopper.Components.Test: xUnit tests (not for production)
- SmartHopper.Providers.*: AI provider projects
3. Component conventions:
- Inherit from ComponentBase or derived class (for example AIStatefulAsyncComponentBase for AI components)
- File name: `[Category][Action][Type]Component.cs`
- Override `RegisterInputParams()`, `RegisterOutputParams()`
- Provide unique `Guid`, `ComponentName`, `Nickname`, `Description`
4. AI Tool conventions:
- Implement `IAIToolProvider` in `SmartHopper.Core.Grasshopper.Tools`
- File name: `*Tools.cs`
- Define AITool metadata (Name, Description, schema)
- Auto‑discover via `AIToolManager`
5. AI Provider conventions:
- Use `SmartHopper.Providers.Template` as a starting point
- Implement `IAIProviderFactory` & `IAIProviderSettings`
- Document settings in JSON schema or Rhino config
6. Documentation & changelog:
- Log API changes in `CHANGELOG.md` under **Unreleased**, in one of the following sections: Added, Changed, Deprecated, Removed, Fixed, Security
- Use PR template per `.github/PULL_REQUEST_TEMPLATE.md`
- Add docstrings to all public members
7. General guidelines:
- Use native Grasshopper types & methods when possible
- Use https://developer.rhino3d.com/ as the official documentation
- Use English language only
- Only change code lines directly needed to implement the request; avoid unrelated refactors
29 changes: 25 additions & 4 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -7,33 +7,54 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0

## [Unreleased]



## [0.3.0-alpha] - 2025-04-27

### Added

- Enabled the AIChat component to execute tools in Grasshopper.
- Added optional 'Filter' input to `GhGetComponents` component for filtering by errors, warnings, remarks, selected, unselected, enabled, disabled, previewon, previewoff, previewcapable, notpreviewcapable. Supports include/exclude syntax (+/-) provided as a list of tags, each tag in a separate line, comma-separated or space-separated.
- Added optional 'Type filter' input to `GhGetComponents` component to filter by component type (params, components, inputComponents, outputComponents and processingComponents).
- Added `ConnectionGraphUtils` class in `SmartHopper.Core.Graph` namespace with method `ExpandByDepth` to expand a set of component IDs by following connections up to the given depth.
- Added `GhRetrieveComponents` component and `ghretrievecomponents` AI tool for listing Grasshopper component types with descriptions, keywords, category filters, and list of inputs and outputs.
- Added `ghcategories` AI tool in `GhTools` to list Grasshopper component categories and subcategories with optional soft string filter.
- Added new `ghtogglepreview` AI tool in `GhObjTools` for toggling Grasshopper component preview by GUID.
- Added new `ghtogglelock` AI tool in `GhObjTools` for toggling Grasshopper component lock state by GUID.
- Added new `ghmoveobj` AI tool in `GhObjTools` for moving Grasshopper component pivot by GUID with absolute or relative position.
- Added `MoveInstance` method in `GHCanvasUtils` to move existing instances by GUID with absolute or relative pivot positions.
- Improved security in Providers by accepting only signed assemblies.
- Added multiple CI Tests, for example, to ensure unsigned provider assemblies are rejected by `ProviderManager.VerifySignature`, to ensure only signed assemblies are loaded by `ProviderManager.LoadProviderAssembly`, and to ensure only enabled providers are registered by `ProviderManager.RegisterProviders`.
- Added `AIToolCall.cs`, a new model for AI tool call requests.
- Added `SmartHopperInitializer.cs`, a static class for safe startup and provider initialization.
- Added `StyledMessageDialog` class in `SmartHopper.Config.Dialogs` for consistent message dialog styling with the SmartHopper logo.
- Added `WebTools` to retrieve webpages from the Internet and provide them to the AI provider.

### Changed

- Renamed the 'Branches Input' and 'Processed Branches' parameters to 'Data Count' and 'Iterations Count' in DeconstructMetricsComponents. Improved descriptions for both parameters.
- Modified FilterListAsync in ListTools to return indices instead of filtered list items, with `AIListFilter` component now handling the final list construction.
- Modified `FilterListAsync` in `ListTools` to return indices instead of filtered list items, with `AIListFilter` component now handling the final list construction.
- Renamed `GhGetSelectedComponents` (GhGetSel) to `GhGetComponents`.
- Moved `GhGet` execution logic to external tools managed by `ToolManager`.
- Improved `ghget` tool's `typeFilter` input: supports include/exclude syntax (+/-) with multiple tokens (params, components, input, output, processing) and updated schema description with definitions and examples.
- Reorganized `SmartHopper.Core.Grasshopper` files in subfolders that match the namespace.
- Isolated settings so providers access them only via `ProviderManager`, not directly via `SmartHopperSettings`.
- SmartHopper icon is now used for all dialogs within SmartHopper (about, settings, messages and ai chat)

### Removed

- `GhGetComponent` was replaced by `GhGetSelectedComponents` (GhGetSel) and renamed back to `GhGetComponents`.
- Removed support for net48. From now on, Rhino 8 or later is required.
- Removed `ToolFunction` and `ToolArgument` in `AIResponse`, in favor of the more flexible `AIToolCall`.

### Fixed

- Fixed double‐encryption of sensitive settings in `SettingsDialog.SaveSettings()` causing unreadable API keys
- Fixed mismatch between in-memory and on-disk `TrustedProviders` when prompting in `ProviderManager.LoadProviderAssembly()`
- Fixed a bug in `DataProcessor` where results were being duplicated when multiple branches were grouped together to unsuccessfully prevent unnecessary API calls [#32](https://github.com/architects-toolkit/SmartHopper/issues/32)
- Fixed inconsistent list format handling between `AIListEvaluate` and `AIListFilter` components.

### Fixed
- Fixes "Bug: Unmatching paths in list components return duplicated values" ([#32](https://github.com/architects-toolkit/SmartHopper/issues/32)).
- Fixed `MistralAI` provider not loading `AI Tools`.
- Fixed `GhGetComponent` select functionality that was accidentally omitted in the new `GhTools`.

## [0.2.0-alpha] - 2025-04-06

Expand Down
Loading
Loading