Skip to content

Commit a959aa1

Browse files
Merge remote-tracking branch 'upstream/development' into development
2 parents 5760322 + 9dc2fa5 commit a959aa1

12 files changed

Lines changed: 126 additions & 79 deletions

File tree

.claude/hooks/audit-log.sh

100755100644
Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,9 +13,9 @@ set -uo pipefail
1313
# ---------------------------------------------------------------------------
1414
INPUT="$(cat)"
1515

16-
TOOL_NAME="$(printf '%s' "$INPUT" | python3 -c "import sys,json; print(json.load(sys.stdin).get('tool_name','unknown'))" 2>/dev/null || echo "unknown")"
16+
TOOL_NAME="$(printf '%s' "$INPUT" | jq -r '.tool_name // "unknown"' 2>/dev/null || echo "unknown")"
1717

18-
COMMAND="$(printf '%s' "$INPUT" | python3 -c "import sys,json; print(json.load(sys.stdin).get('tool_input',{}).get('command',''))" 2>/dev/null || echo "")"
18+
COMMAND="$(printf '%s' "$INPUT" | jq -r '.tool_input.command // ""' 2>/dev/null || echo "")"
1919

2020
# ---------------------------------------------------------------------------
2121
# 2. Determine log file path (relative to project root)

.claude/hooks/validate-bash-command.sh

100755100644
Lines changed: 17 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -14,14 +14,15 @@ set -euo pipefail
1414
# ---------------------------------------------------------------------------
1515
INPUT="$(cat)"
1616

17-
TOOL_NAME="$(printf '%s' "$INPUT" | python3 -c "import sys,json; print(json.load(sys.stdin).get('tool_name',''))" 2>/dev/null || true)"
17+
TOOL_NAME="$(printf '%s' "$INPUT" | jq -r '.tool_name // ""' 2>/dev/null || true)"
1818

19-
# Only validate Bash commands — allow everything else through
20-
if [[ "$TOOL_NAME" != "Bash" ]]; then
19+
# Only validate Bash commands — allow everything else through.
20+
# If TOOL_NAME is empty (parse failure), fall through to check the command anyway (fail closed).
21+
if [[ -n "$TOOL_NAME" && "$TOOL_NAME" != "Bash" ]]; then
2122
exit 0
2223
fi
2324

24-
COMMAND="$(printf '%s' "$INPUT" | python3 -c "import sys,json; print(json.load(sys.stdin).get('tool_input',{}).get('command',''))" 2>/dev/null || true)"
25+
COMMAND="$(printf '%s' "$INPUT" | jq -r '.tool_input.command // ""' 2>/dev/null || true)"
2526

2627
if [[ -z "$COMMAND" ]]; then
2728
exit 0
@@ -136,20 +137,19 @@ BLOCKED_PATTERNS=(
136137
# ---------------------------------------------------------------------------
137138
check_command() {
138139
local cmd="$1"
139-
# Trim leading/trailing whitespace
140-
cmd="$(echo "$cmd" | sed 's/^[[:space:]]*//;s/[[:space:]]*$//')"
140+
# Trim leading/trailing whitespace using parameter expansion
141+
cmd="${cmd#"${cmd%%[![:space:]]*}"}"
142+
cmd="${cmd%"${cmd##*[![:space:]]}"}"
141143

142144
if [[ -z "$cmd" ]]; then
143145
return 0
144146
fi
145147

146-
# Convert to lowercase for case-insensitive matching
147-
local cmd_lower
148-
cmd_lower="$(echo "$cmd" | tr '[:upper:]' '[:lower:]')"
148+
# Convert to lowercase using parameter expansion
149+
local cmd_lower="${cmd,,}"
149150

150151
for pattern in "${BLOCKED_PATTERNS[@]}"; do
151-
local pattern_lower
152-
pattern_lower="$(echo "$pattern" | tr '[:upper:]' '[:lower:]')"
152+
local pattern_lower="${pattern,,}"
153153

154154
# shellcheck disable=SC2254
155155
if [[ "$cmd_lower" == $pattern_lower ]]; then
@@ -164,8 +164,12 @@ check_command() {
164164
# ---------------------------------------------------------------------------
165165
# 4. Split on pipes and command chains, then check each sub-command
166166
# ---------------------------------------------------------------------------
167-
# Replace common chain operators with a delimiter
168-
NORMALIZED="$(echo "$COMMAND" | sed 's/&&/\n/g; s/||/\n/g; s/;/\n/g; s/|/\n/g')"
167+
# Replace common chain operators with newlines using parameter expansion
168+
# Order matters: replace && and || before | to avoid double-splitting ||
169+
NORMALIZED="${COMMAND//&&/$'\n'}"
170+
NORMALIZED="${NORMALIZED//||/$'\n'}"
171+
NORMALIZED="${NORMALIZED//;/$'\n'}"
172+
NORMALIZED="${NORMALIZED//|/$'\n'}"
169173

170174
while IFS= read -r subcmd; do
171175
check_command "$subcmd"

content/en/docs/deployment/on-premises-design/ms-windows/_index.md

Lines changed: 14 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,7 @@ Before starting this how-to, make sure you have the following prerequisites:
4545

4646
* Suitable database servers are MariaDB, MS SQL Server, MySQL, Oracle Database and PostgreSQL. See [System Requirements](/refguide/system-requirements/#databases) for more information
4747

48-
* A local or domain user with the *“log on as a service”* local security policy set
48+
* A local user, domain user or group managed service account (gMSA) with the *“log on as a service”* local security policy set
4949

5050
## Installing the Mendix Service Console {#service-console}
5151

@@ -88,32 +88,36 @@ To deploy a Mendix app using the Mendix Service Console, follow these steps:
8888
* **Display name** – the description of the app which is visible as a tooltip for the app in the left bar of the Mendix Service Console or as a column in the list of Windows services
8989
* **Description** – a description of the application that will be visible in the Mendix Service Console
9090
* **Startup type** – select whether you want the app to be started automatically when the server starts, started with a delay, started manually, or disabled altogether
91-
* **User name** and **Password** – the app will always run under the user account given here, and the service will be installed with this user account configured (for more information, see [Prerequisites](#Prerequisites))
91+
* **User name** and **Password** – the app will run under the user account given here, and the service will be installed with this user account configured (for more information, see [Prerequisites](#Prerequisites))
92+
* **Install service with LocalSystem account** – optionally, select the checkbox if you want to use a gMSA account for a Mendix app instead of the user account given under **User name** and **Password**.
93+
94+
4. Click **Next >**.
9295

93-
4. Click **Next >**.
96+
5. Optionally, if you selected the **Install service with LocalSystem account** checkbox while creating the app, install the service once your app is created. The service will be installed with the LocalSystem account. (You can verify the service account type in the Services app of Windows.) Execute the following command in the administrator command prompt to change the account type to your gMSA: `sc.exe config MyServiceName obj= "YOURDOMAIN\MyGMSAAccount$"`.
97+
Configure folder access permissions for gMSA account on the directory selected in the **Preferences** setting. For more information, refer to the [Installing the Mendix Service Console](/developerportal/deploy/deploy-mendix-on-microsoft-windows/#service-console) section above.
9498

95-
{{< figure src="/attachments/deployment/on-premises-design/ms-windows/18580728.png" >}}
99+
{{< figure src="/attachments/deployment/on-premises-design/ms-windows/gmsa.png" >}}
96100

97-
5. On the **Project Files** screen, click **Select app…**.
101+
6. On the **Project Files** screen, click **Select app…**.
98102

99103
{{< figure src="/attachments/deployment/on-premises-design/ms-windows/service_console_selectapp.png" >}}
100104

101-
6. Now select the **MDA** file that was [created in Mendix Studio Pro](/refguide/create-deployment-package-dialog/) and contains your application logic. After the installation of your MDA file, you will see which Mendix server (Mendix Runtime) version is needed.
105+
7. Now select the **MDA** file that was [created in Mendix Studio Pro](/refguide/create-deployment-package-dialog/) and contains your application logic. After the installation of your MDA file, you will see which Mendix server (Mendix Runtime) version is needed.
102106

103-
7. Configure the **Database Settings**:
107+
8. Configure the **Database Settings**:
104108

105109
* **Type** – the database server type
106110
* **Host** – the IP address or host name of the database server
107111
* **Name** – the database name
108112
* **User name** and **Password** – the database user name and password
109113

110-
8. Click **Next >**.
114+
9. Click **Next >**.
111115

112116
{{< figure src="/attachments/deployment/on-premises-design/ms-windows/18580726.png" >}}
113117

114-
9. On the **Common Configuration** screen, keep the default settings. These settings should only be changed if this is needed for your application setup.
118+
10. On the **Common Configuration** screen, keep the default settings. These settings should only be changed if this is needed for your application setup.
115119

116-
10. Click **Finish** and start the application.
120+
11. Click **Finish** and start the application.
117121

118122
## Configuring the Microsoft Internet Information Services Server{#configure-msiis}
119123

content/en/docs/deployment/on-premises-design/ms-windows/automate-mendix-deployment-on-microsoft-windows.md

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -180,6 +180,48 @@ $appName = 'Name of Mendix app'
180180
Install-MxService $appName
181181
```
182182

183+
### Sample Script - Set App Runtime Settings
184+
185+
The following script example demonstrates how to set runtime settings for your app. It applies custom runtime configuration settings to your application using a hashtable of key-value pairs.
186+
187+
```text
188+
$appName = 'Name of Mendix app'
189+
$settings = @{
190+
'MaxJavaHeapSize' = '2048'
191+
'DatabaseHost' = 'localhost'
192+
}
193+
194+
# Set runtime settings
195+
Set-MxAppRuntimeSettings $appName -Settings $settings
196+
```
197+
198+
### Sample Script - Set App Constant
199+
200+
The following script example demonstrates how to set an application constant for your app. It updates a specific constant value in your Mendix app configuration.
201+
202+
```text
203+
$appName = '{Name of your app}'
204+
$constants = @{
205+
'constantName' = 'constantValue'
206+
'constantName2' = 'constantValue2'
207+
}
208+
209+
# Set application constant
210+
Set-MxAppConstants $appName -Constants $constants
211+
```
212+
213+
### Sample Script - Get Server Id
214+
215+
The `Start-MxApp` cmdlet automatically retrieves the Server ID (License ID) when starting a Mendix app. You can use this unique identifier for license tracking and application monitoring. The following script example demonstrates the process required to retrieve Server Id.
216+
217+
```text
218+
# Start the Mendix app and get Server ID
219+
$app = Start-MxApp "MyAppName" -NoService -SynchronizeDatabase
220+
221+
# Display the Server ID
222+
Write-Host "Server ID: $($app.ServerId)"
223+
```
224+
183225
## Troubleshooting
184226

185227
If you encounter any issues while automating Mendix deployment on Windows using cmdlets, use the following troubleshooting tips to help you solve them.

content/en/docs/marketplace/platform-supported-content/modules/nanoflow-commons.md

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,21 @@ The [Nanoflow Commons](https://marketplace.mendix.com/link/component/109515/) mo
4848
| | Get platform |
4949
| | Wait |
5050

51+
### Limitations of Get/Set Storage Item Actions {#limitations}
52+
53+
The **Get storage item** and **Set storage item** actions use the device's native encrypted async storage mechanism (key-value storage). This storage is completely separate from the Mendix offline database and does not have any relationship with Mendix's entity model, entity access rules, or association capabilities.
54+
55+
Below is a list of the key limitations:
56+
57+
* No association support – When you store entities using **Set storage item object** or **Set storage item object list**, only the entity data itself is serialized and stored. Entity associations are not preserved. The storage mechanism has no concept of Mendix associations, referenced entities, or relational data structures.
58+
* No entity access rules – Security and entity access rules defined in your domain model do not apply to data stored in device storage. The storage actions bypass the Mendix data layer entirely.
59+
* Page state dependency – Mendix internally maintains a "page state" that tracks associated entities when objects are loaded into memory. This page state is session-scoped and is cleared when the user signs out or switches accounts on a native device. Any associations that depend on this page state are lost when the session ends.
60+
* Manual association reconstruction required – If your application needs to work with associated entities after retrieving objects from local storage, you must explicitly retrieve and reconstruct those associations in your nanoflow logic. For example, if Entity A references Entity B, you must separately retrieve Entity B after loading Entity A from storage.
61+
62+
{{% alert color="warning" %}}
63+
The local storage actions are intended for simple key-value storage use cases such as caching user preferences, temporary state, or serialized data that does not rely on associations. For complex relational data or entities that require association traversal, use Mendix's offline database capabilities instead of the storage item actions.
64+
{{% /alert %}}
65+
5166
## Read More
5267

5368
* [How to Build JavaScript Actions: Part 1 (Basic)](/howto/extensibility/write-javascript-actions/)

content/en/docs/private-platform/pmp-maia.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@ Generators:
3838

3939
## Changing the LLM Provider for Maia
4040

41-
Starting in Private Mendix Platform 2.6, instead of usign the default Large Language Model, you can connect Maia to several different models of your choice. Currently this includes the following LLMs:
41+
Starting in Private Mendix Platform 2.6, instead of usign the default Large Language Model, you can connect Maia to several different models of your choice. The quality of results has been verified on Claude Sonnet 4.5 and may vary for other providers and models. The following models have been tested for connectivity:
4242

4343
* Anthropic
4444
* Small text model - Claude Haiku 4.5

content/en/docs/refguide/modeling/application-logic/workflows/workflow-elements/ai-agent-task.md

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -21,10 +21,6 @@ With **AI agent task**, you can select a [microflow](#microflow) that calls any
2121

2222
If you do not yet have any agents configured, you can get started by following the guide on [creating your first agent](/appstore/modules/genai/how-to/howto-single-agent/).
2323

24-
{{% alert color="info" %}}
25-
Support for configuring AI agents using an Agent Editor in Studio Pro is coming soon.
26-
{{% /alert %}}
27-
2824
## Properties
2925

3026
AI agent task properties consist of the following sections:

0 commit comments

Comments
 (0)