app
SOLIDWORKS Bridge
Public Made by Adomby adom
Launch, model and quit SOLIDWORKS from any Adom container. Nothing is ever lost.
main
name: solidworks-sign-in description: "How to get through the 3DEXPERIENCE ID login that SOLIDWORKS and SOLIDWORKS Visualize raise when the platform session has lapsed - where the window comes from, how to find it, the measured two-page flow, what to type with and what never to touch, and where the login comes from (never from this skill). Use when a SOLIDWORKS launch is waiting on a sign-in, when swx_status says waitingOn userSignIn, or when a License Manager notice says it failed to check a license. Trigger words - solidworks sign in, 3DEXPERIENCE login, sign me in, login window, License Manager failed to check license, session expired, Visualize login." user-invocable: true
Parent skill: solidworks-bridge
Every line below is marked [measured] (seen on a real machine, 2026-10-02 to 2026-10-12) or [unmeasured] (not seen yet — treat as a guess and read the window first).
When the window appears
- [measured] It appears when the 3DEXPERIENCE platform session has lapsed. It did not appear on about fifteen launches on 09-30 and 10-01, then appeared on 10-02 after licence checks failed overnight.
- [measured] A session that is already running shows the warning first: a "License Manager" notice, "Failed to check 1 license(s): 3DEXPERIENCE SOLIDWORKS Professional: Unable to connect to server. The session will end after the next 5 unsuccessful attempts.", OK only. Notices can queue (two identical ones). The bridge never answers them.
- [measured] Visualize asks only when it is started the wrong way. Started
directly from
SLDWORKSVisualize.exe(2026-10-02) it raised its own sign-in even while SOLIDWORKS was signed in — and on this edition that start is refused anyway ("must be opened from the 3DEXPERIENCE Platform or from the desktop shortcut created from the Platform"). Started through its platform shortcut (swx_start {app:"visualize"}, 2026-10-05) while the 3DEXPERIENCE Launcher already held the session, it raised no login at all. - [measured] After a week away (2026-10-12) the platform session had lapsed.
Starting Visualize through its shortcut started
SWXDesktopUpdate.exe(from%TEMP%\SWXDesktopUpdate\) the same second, and THAT showed the sign-in; Visualize itself did not start until the sign-in was done. Any app start can be parked behind it.
Finding the window
- [measured] SOLIDWORKS's launcher shows it: class
DSYSysLoginPanelWebView2Class, title "Login | 3DEXPERIENCE ID | Dassault Systèmes", owned by SWXDesktopLauncher.exe. - [measured] Visualize shows the same web page in a WinForms window: title "Login - 3DEXPERIENCE ID - Dassault Systemes", 968x968.
- [measured] A THIRD host:
SWXDesktopUpdate.exe, the platform updater. Title just "3DEXPERIENCE" (no "ID", no "Login"), classWindowsForms10.Window.8.app.0.30495d1_r6_ad1, UIA automationIdSWXDesktopUpdateForm. Same web page ("Welcome to the 3DEXPERIENCE platform", "Email or username", "Continue"), and no cookie banner, only a "Manage cookies" link at the bottom right. - FIND IT BY CONTENT, not by title. A window that contains an Edit "Email or
username" (page 1) or an Edit "Password" (page 2) is a 3DEXPERIENCE ID login,
whatever its title, class or owner. The two titles above are only shortcuts.
swx_statusreportswaitingOn: "userSignIn"andsignInWindow {hwnd, title, ownerImage, host, recognizedBy}(host issolidworks,visualizeordesktopUpdate) while any of them is up. Both sit at the TOP level of theswx_statusreply, next to each other, not inside itssolidworksblock. Thevisualizeblock repeatssignInWindowonly while Visualize is parked behind the sign-in (parkedBehind).
When the tree shows only the frame
- [measured] On the SWXDesktopUpdate host,
desktop_ui_treereturned 14 nodes (Window, MenuBar, Minimize/Maximize/Close), even with maxNodes 600 and depth 40, and even after adesktop_ui_from_pointwake. The page is not in it. - [measured]
desktop_find_control {hwnd, ...}DOES reach the page. Page 1:{automationId:"username"}or{role:"Edit", name:"Email or username"}gives the Edit (settable:true);{role:"Button", name:"Continue"}gives the button (invokable:true). - [measured] Page 2: Edit
username(prefilled); Editpasswordwhose NAME is "Password " plus an icon glyph, so{role:"Edit", name:"Password "}does NOT match it and{automationId:"password"}does; Text "Password" (its label); Text "Remember me" (no CheckBox found by name); Button "Log in"; Button "Back". - [measured]
{role:"Edit"}with no name matched "Address and search bar" (view_1012), a control somewhere else entirely. Never query a role alone. Look up by automation id first, then role and exact name, then role and name-contains, and check the match's role and id or name before using it. - [measured]
desktop_ui_set {hwnd, automationId:"username", text}WORKS on this host (ValuePattern accepted), unlike the Visualize host. But the first set left the user name followed by a stray "s". Set "" first, then the value. That fixed it. - [measured] The tree has two states on this host. COLD it is the frame only (14
nodes). After any
desktop_find_controlordesktop_ui_from_pointprobing it stays AWAKE at about 37 nodes, with the whole page: on page 2, Editusername(prefilled), Editpassword, a real CheckBox "Remember me " (on screen, settable, with a toggle pattern), Button "Log in", Button "Back", and links "Forgot your password?", "English", "Help", "Manage cookies". Read the tree first; fall back todesktop_find_controlwhen it is cold. - [measured] PAGE 2 IS THE PAGE WITH THE PASSWORD BOX, whatever else is on it. The user-name box is there too, prefilled and READ-ONLY: a set answers "Cannot call SetValue on read only value". Leave a prefilled name alone, take a read-only refusal to mean "prefilled", and never let the name step block the password step.
- [measured] A "Manage cookies" LINK is page furniture, not a cookie banner. A banner has accept/reject BUTTONS ("Accept All", "Manage my preferences", as on the Visualize host). A failed set is never evidence of a banner. Tell the user about a banner only when one is really there.
- [measured]
desktop_find_control's reply carries NOvalue, and the tree has no page, so on this host the user name cannot be read back.swx_sign_insaysreadBack: "unreadable"in its steps rather than claiming a match. - [measured]
desktop_ui_click {hwnd, name:"Continue"}(background Invoke) moved to page 2. - [unmeasured] Whether a background toggle ticks "Remember me" here. The bridge
tries the Toggle pattern, then an Invoke, reads the box's state back, and
claims a tick only if the box says so. When the tree is cold and only a label
is found, it clicks the label (user idle, window in front) and reports
rememberTicked: null. - [unmeasured] What this host shows after "Log in": a wrong password or a second step. Read it; never retry.
The flow
- [measured] The accessibility tree is LAZY. The first
desktop_ui_treeread gave 13 nodes with one control (Button "Close"); after onedesktop_ui_from_pointquery on a point inside the page, the same read gave 38 nodes with the form. Wake it before deciding anything. - [measured] Page 1: Edit "Email or username" (automationId
username) and Button "Continue". There is NO password box on page 1. - [measured]
desktop_ui_seton that Edit is refused ("control found but has NO ValuePattern"), even though the tree sayssettable: true. Typing needs real keystrokes:desktop_clickon the box,desktop_press_key ["ctrl+a"](a failed attempt leaves the box dirty), thendesktop_type. Each one needs areason, and each takes focus (the login window comes to the front). - [measured]
desktop_ui_click {name: "Continue"}works in the background. - [measured] Page 2 (after a good page-1 fill and Continue): Edit "Email or
username" (prefilled), Edit "Password " (automationId
password), CheckBox "Remember me " (off), Button "Log in", Button "Back", and the cookie banner still there.- [measured] The "Remember me" checkbox's own input is OFF-SCREEN (its rect centre is far left of the screen). The visible control is its Text label "Remember me…": click the LABEL to tick it, then read the toggle state.
- [unmeasured] What the page shows after "Log in" (a wrong password, a second step). Read it; never retry.
- [measured] A cookie banner sits on the page ("Accept All", "Manage my preferences"). Never touch it: that choice belongs to the user. In the measured layout it does not cover the form.
Geometry and focus
- [measured] Moving the window RE-LAYS the page: the cookie banner then covered
the email box, a click at the old point hit the banner, select-all selected
page text, and the typing went nowhere. After any move or resize, re-read the
tree and click at the control's OWN
rect.centerX/centerY(screen pixels).desktop_set_window_bounds {hwnd, x:300, y:30, w:1100, h:1450, reason}kept the box clear of the banner (email box at y=787, banner at y=1020). - [measured] A plain click does not take focus while the user's own app is
active.
desktop_raise_window {hwnd, reason}brings the login window forward; confirm it IS the foreground window before typing. - [measured] Typing lands when sent to the page's render widget (a
Chrome_RenderWidgetHostHWNDchild window). Reading the user name back from the tree works. - [measured] Typing a password through ab from a cloud container is refused by
policy ("Credential Leakage"), and rightly. The only acceptable path is the
bridge reading the vault on the desktop and typing there:
swx_sign_in.
Rules that never bend
- [measured] NEVER send keystrokes while the user is typing. On 10-02 keystrokes
sent while the user typed in another window left fragments of THEIR typing in
the login box, and the intended text did not land. Check
swx_user_presence(seconds since last input) first, and bring the login window to the front and confirm it is in front before every keystroke batch. - Read the user-name box back after typing and compare before pressing anything. Never read the password box back.
- Never retry a rejected password; an account lockout is worse than a manual sign-in.
- A second factor (a code, a captcha, a new-device check) is the user's to answer. Tell them; do not try.
Credentials
Where the password comes from, and who is allowed to touch it — all measured on 2026-10-12 on a real login window (ab 2.1.174, bridge 0.9.26):
- The login lives in the Adom Bridge vault on the user's PC (
pup_credentials {}lists hosts + user names, never a secret; the 3DEXPERIENCE host isiam.3ds.com). You never write a password into this skill, the bridge, a reply, a log or a screenshot — [measured] every value that leaves the bridge is scrubbed of it; [unmeasured] whether any ab verb can read a typed value back on the updater host. - The bridge prepares the page and stops.
swx_sign_in {userAuthorized:true, window:<hwnd>}fills the user name from the vault's listing, presses Continue, reaches the password page, asks the vault ONCE for the password — and ab refuses a bridge: "pup_credential_reveal requires a VERIFIED local transport … this request arrived with origin "bridge"". The reply issign_in_vault_policywith ab's words (abSaid),pagePrepared {page:2, userNameFilled:true}andwaysOut. Nothing is retried, nothing is worked around. ab issue #237 asks for a fill verb (ab sets the control itself, the secret never leaves ab); until it lands the password step is outside the bridge. - A cloud agent cannot type it either. Sending the password through ab from a container is refused by the agent's own policy (measured twice: typing it directly, and starting a local helper that would reveal it). Do not retry by any route; do not ask the user to paste it into chat.
- What works today: a LOCAL caller. ab hands a vault secret to a local desktop
assistant (its bundled CLI on the same PC, Hydrogen, a local agent or script)
behind one consent card.
tools/local-sign-in.ps1in this page's repo is that assistant: run it ON the PC that shows the login (double-click, orpowershell -ExecutionPolicy Bypass -File local-sign-in.ps1); it finds the window throughswx_status, asks the vault (ab's consent card appears), sets the password into the box by automation id, ticks Remember me, clicks Log in and verifies the window is gone. It never prints the secret. Tick Remember me so the platform session persists and the window stops coming back every couple of weeks. - The user may instead type the password into the prepared window; the bridge
reports
pagePreparedso an agent can say exactly that.
---
name: solidworks-sign-in
description: "How to get through the 3DEXPERIENCE ID login that SOLIDWORKS and SOLIDWORKS Visualize raise when the platform session has lapsed - where the window comes from, how to find it, the measured two-page flow, what to type with and what never to touch, and where the login comes from (never from this skill). Use when a SOLIDWORKS launch is waiting on a sign-in, when swx_status says waitingOn userSignIn, or when a License Manager notice says it failed to check a license. Trigger words - solidworks sign in, 3DEXPERIENCE login, sign me in, login window, License Manager failed to check license, session expired, Visualize login."
user-invocable: true
---
Parent skill: **solidworks-bridge**
Every line below is marked **[measured]** (seen on a real machine, 2026-10-02 to 2026-10-12) or
**[unmeasured]** (not seen yet — treat as a guess and read the window first).
## When the window appears
- [measured] It appears when the 3DEXPERIENCE platform session has lapsed. It
did not appear on about fifteen launches on 09-30 and 10-01, then appeared on
10-02 after licence checks failed overnight.
- [measured] A session that is already running shows the warning first: a
"License Manager" notice, "Failed to check 1 license(s): 3DEXPERIENCE
SOLIDWORKS Professional: Unable to connect to server. The session will end
after the next 5 unsuccessful attempts.", OK only. Notices can queue (two
identical ones). The bridge never answers them.
- [measured] Visualize asks only when it is started the wrong way. Started
directly from `SLDWORKSVisualize.exe` (2026-10-02) it raised its own sign-in
even while SOLIDWORKS was signed in — and on this edition that start is
refused anyway ("must be opened from the 3DEXPERIENCE Platform or from the
desktop shortcut created from the Platform"). Started through its platform
shortcut (`swx_start {app:"visualize"}`, 2026-10-05) while the 3DEXPERIENCE
Launcher already held the session, it raised no login at all.
- [measured] After a week away (2026-10-12) the platform session had lapsed.
Starting Visualize through its shortcut started `SWXDesktopUpdate.exe` (from
`%TEMP%\SWXDesktopUpdate\`) the same second, and THAT showed the sign-in;
Visualize itself did not start until the sign-in was done. Any app start can
be parked behind it.
## Finding the window
- [measured] SOLIDWORKS's launcher shows it: class
`DSYSysLoginPanelWebView2Class`, title "Login | 3DEXPERIENCE ID | Dassault
Systèmes", owned by SWXDesktopLauncher.exe.
- [measured] Visualize shows the same web page in a WinForms window: title
"Login - 3DEXPERIENCE ID - Dassault Systemes", 968x968.
- [measured] A THIRD host: `SWXDesktopUpdate.exe`, the platform updater. Title
just "3DEXPERIENCE" (no "ID", no "Login"), class
`WindowsForms10.Window.8.app.0.30495d1_r6_ad1`, UIA automationId
`SWXDesktopUpdateForm`. Same web page ("Welcome to the 3DEXPERIENCE platform",
"Email or username", "Continue"), and no cookie banner, only a "Manage
cookies" link at the bottom right.
- FIND IT BY CONTENT, not by title. A window that contains an Edit "Email or
username" (page 1) or an Edit "Password" (page 2) is a 3DEXPERIENCE ID login,
whatever its title, class or owner. The two titles above are only shortcuts.
`swx_status` reports `waitingOn: "userSignIn"` and
`signInWindow {hwnd, title, ownerImage, host, recognizedBy}` (host is
`solidworks`, `visualize` or `desktopUpdate`) while any of them is up. Both
sit at the TOP level of the `swx_status` reply, next to each other, not inside
its `solidworks` block. The `visualize` block repeats `signInWindow` only
while Visualize is parked behind the sign-in (`parkedBehind`).
## When the tree shows only the frame
- [measured] On the SWXDesktopUpdate host, `desktop_ui_tree` returned 14 nodes
(Window, MenuBar, Minimize/Maximize/Close), even with maxNodes 600 and depth
40, and even after a `desktop_ui_from_point` wake. The page is not in it.
- [measured] `desktop_find_control {hwnd, ...}` DOES reach the page. Page 1:
`{automationId:"username"}` or `{role:"Edit", name:"Email or username"}` gives
the Edit (settable:true); `{role:"Button", name:"Continue"}` gives the button
(invokable:true).
- [measured] Page 2: Edit `username` (prefilled); Edit `password` whose NAME is
"Password " plus an icon glyph, so `{role:"Edit", name:"Password "}` does NOT
match it and `{automationId:"password"}` does; Text "Password" (its label);
Text "Remember me" (no CheckBox found by name); Button "Log in"; Button
"Back".
- [measured] `{role:"Edit"}` with no name matched "Address and search bar"
(view_1012), a control somewhere else entirely. Never query a role alone.
Look up by automation id first, then role and exact name, then role and
name-contains, and check the match's role and id or name before using it.
- [measured] `desktop_ui_set {hwnd, automationId:"username", text}` WORKS on this
host (ValuePattern accepted), unlike the Visualize host. But the first set
left the user name followed by a stray "s". Set "" first, then the value.
That fixed it.
- [measured] The tree has two states on this host. COLD it is the frame only (14
nodes). After any `desktop_find_control` or `desktop_ui_from_point` probing
it stays AWAKE at about 37 nodes, with the whole page: on page 2, Edit
`username` (prefilled), Edit `password`, a real CheckBox "Remember me "
(on screen, settable, with a toggle pattern), Button "Log in", Button "Back",
and links "Forgot your password?", "English", "Help", "Manage cookies".
Read the tree first; fall back to `desktop_find_control` when it is cold.
- [measured] PAGE 2 IS THE PAGE WITH THE PASSWORD BOX, whatever else is on it.
The user-name box is there too, prefilled and READ-ONLY: a set answers
"Cannot call SetValue on read only value". Leave a prefilled name alone, take
a read-only refusal to mean "prefilled", and never let the name step block
the password step.
- [measured] A "Manage cookies" LINK is page furniture, not a cookie banner. A
banner has accept/reject BUTTONS ("Accept All", "Manage my preferences", as on
the Visualize host). A failed set is never evidence of a banner. Tell the user
about a banner only when one is really there.
- [measured] `desktop_find_control`'s reply carries NO `value`, and the tree has
no page, so on this host the user name cannot be read back. `swx_sign_in`
says `readBack: "unreadable"` in its steps rather than claiming a match.
- [measured] `desktop_ui_click {hwnd, name:"Continue"}` (background Invoke)
moved to page 2.
- [unmeasured] Whether a background toggle ticks "Remember me" here. The bridge
tries the Toggle pattern, then an Invoke, reads the box's state back, and
claims a tick only if the box says so. When the tree is cold and only a label
is found, it clicks the label (user idle, window in front) and reports
`rememberTicked: null`.
- [unmeasured] What this host shows after "Log in": a wrong password or a
second step. Read it; never retry.
## The flow
1. [measured] The accessibility tree is LAZY. The first `desktop_ui_tree` read
gave 13 nodes with one control (Button "Close"); after one
`desktop_ui_from_point` query on a point inside the page, the same read gave
38 nodes with the form. Wake it before deciding anything.
2. [measured] Page 1: Edit "Email or username" (automationId `username`) and
Button "Continue". There is NO password box on page 1.
3. [measured] `desktop_ui_set` on that Edit is refused ("control found but has
NO ValuePattern"), even though the tree says `settable: true`. Typing needs
real keystrokes: `desktop_click` on the box, `desktop_press_key ["ctrl+a"]`
(a failed attempt leaves the box dirty), then `desktop_type`. Each one needs a
`reason`, and each takes focus (the login window comes to the front).
4. [measured] `desktop_ui_click {name: "Continue"}` works in the background.
5. [measured] Page 2 (after a good page-1 fill and Continue): Edit "Email or
username" (prefilled), Edit "Password " (automationId `password`), CheckBox
"Remember me " (off), Button "Log in", Button "Back", and the cookie banner
still there.
- [measured] The "Remember me" checkbox's own input is OFF-SCREEN (its rect
centre is far left of the screen). The visible control is its Text label
"Remember me…": click the LABEL to tick it, then read the toggle state.
- [unmeasured] What the page shows after "Log in" (a wrong password, a second
step). Read it; never retry.
6. [measured] A cookie banner sits on the page ("Accept All", "Manage my
preferences"). Never touch it: that choice belongs to the user. In the
measured layout it does not cover the form.
## Geometry and focus
- [measured] Moving the window RE-LAYS the page: the cookie banner then covered
the email box, a click at the old point hit the banner, select-all selected
page text, and the typing went nowhere. After any move or resize, re-read the
tree and click at the control's OWN `rect.centerX/centerY` (screen pixels).
`desktop_set_window_bounds {hwnd, x:300, y:30, w:1100, h:1450, reason}` kept
the box clear of the banner (email box at y=787, banner at y=1020).
- [measured] A plain click does not take focus while the user's own app is
active. `desktop_raise_window {hwnd, reason}` brings the login window
forward; confirm it IS the foreground window before typing.
- [measured] Typing lands when sent to the page's render widget (a
`Chrome_RenderWidgetHostHWND` child window). Reading the user name back from
the tree works.
- [measured] Typing a password through ab from a cloud container is refused by
policy ("Credential Leakage"), and rightly. The only acceptable path is the
bridge reading the vault on the desktop and typing there: `swx_sign_in`.
## Rules that never bend
- [measured] NEVER send keystrokes while the user is typing. On 10-02 keystrokes
sent while the user typed in another window left fragments of THEIR typing in
the login box, and the intended text did not land. Check `swx_user_presence`
(seconds since last input) first, and bring the login window to the front and
confirm it is in front before every keystroke batch.
- Read the user-name box back after typing and compare before pressing anything.
Never read the password box back.
- Never retry a rejected password; an account lockout is worse than a manual
sign-in.
- A second factor (a code, a captcha, a new-device check) is the user's to
answer. Tell them; do not try.
## Credentials
Where the password comes from, and who is allowed to touch it — all measured on
2026-10-12 on a real login window (ab 2.1.174, bridge 0.9.26):
- The login lives in the Adom Bridge vault on the user's PC (`pup_credentials {}`
lists hosts + user names, never a secret; the 3DEXPERIENCE host is
`iam.3ds.com`). You never write a password into this skill, the bridge, a reply, a
log or a screenshot — [measured] every value that leaves the bridge is
scrubbed of it; [unmeasured] whether any ab verb can read a typed value back
on the updater host.
- **The bridge prepares the page and stops.** `swx_sign_in {userAuthorized:true,
window:<hwnd>}` fills the user name from the vault's listing, presses Continue,
reaches the password page, asks the vault ONCE for the password — and ab
refuses a bridge: *"pup_credential_reveal requires a VERIFIED local transport
… this request arrived with origin \"bridge\""*. The reply is
`sign_in_vault_policy` with ab's words (`abSaid`), `pagePrepared
{page:2, userNameFilled:true}` and `waysOut`. Nothing is retried, nothing is
worked around. ab issue #237 asks for a fill verb (ab sets the control itself,
the secret never leaves ab); until it lands the password step is outside the
bridge.
- **A cloud agent cannot type it either.** Sending the password through ab from a
container is refused by the agent's own policy (measured twice: typing it
directly, and starting a local helper that would reveal it). Do not retry by
any route; do not ask the user to paste it into chat.
- **What works today: a LOCAL caller.** ab hands a vault secret to a local desktop
assistant (its bundled CLI on the same PC, Hydrogen, a local agent or script)
behind one consent card. `tools/local-sign-in.ps1` in this page's repo is that
assistant: run it ON the PC that shows the login (double-click, or
`powershell -ExecutionPolicy Bypass -File local-sign-in.ps1`); it finds the
window through `swx_status`, asks the vault (ab's consent card appears), sets
the password into the box by automation id, ticks Remember me, clicks Log in and
verifies the window is gone. It never prints the secret. Tick **Remember me** so
the platform session persists and the window stops coming back every couple of
weeks.
- The user may instead type the password into the prepared window; the bridge
reports `pagePrepared` so an agent can say exactly that.