- Add isLikelyWorkflowTabClickTarget to distinguish workflow tab clicks
from generic document clicks, preventing false 'workflow-change'
triggers and unnecessary refresh cycles.
- Add getWorkflowSignatureData to produce a stable, normalized signature
for workflow data (sorted nodes/links, top-level signature included).
- Update document-click handler to use a new 'workflow-tab-click' reason
via the click-target heuristic.
- Simplify refreshForActiveWorkflowChange retry logic by removing the
pending-graph-switch special case, since click origin is now explicit.
- Patch app.loadGraphData to dispatch custom event after loading,
ensuring workflow handlers fire when switching active workflow
- Add document-click handler to catch workflow changes initiated by clicks
- Pass event options through removeEventListener for proper cleanup
- Detect possible pending graph switch on document-click and reduce
max refresh attempts from 8 to 3 to avoid stale graph timers
The previous commit introduced server-side persistence for API keys and
preferences via a model_resolver_settings.json file and POST/GET routes.
This change reverts that behavior, returning to localStorage-only storage
for settings, which is simpler and avoids persisting sensitive credentials
to disk. Also removes the now-unnecessary .gitignore entry.
Replace all link dialog terminology with resolver terminology
throughout the codebase, including module names, CSS classes,
IDs, JS variables, SVG gradient IDs, and log module names.
Remove the old web/linker/ tree and introduce the new web/resolver/
tree with parallel structure. Also replace core/linker.py with
core/resolver.py.