Commit Graph

20 Commits

Author SHA1 Message Date
Shaun Arman
9f6cab2436 fix: OpenWebUI provider connection and missing command registrations
- Add debug logging to OpenAI provider for troubleshooting
- Trim trailing periods from model names
- Fix HTTP error handling to capture response details
- Register missing AI provider commands (save/load/delete)
- Fix authenticateWithWebviewCmd to accept optional projectName parameter
2026-04-08 20:44:51 -05:00
Shaun Arman
19cc78a05f feat: add image attachment support with PII detection
Some checks failed
Test / frontend-tests (pull_request) Successful in 1m4s
Test / frontend-typecheck (pull_request) Failing after 1m6s
Test / rust-fmt-check (pull_request) Successful in 2m42s
Test / rust-clippy (pull_request) Successful in 19m1s
Test / rust-tests (pull_request) Failing after 20m7s
- Add image_attachments table to database schema (migration 013)
- Implement image upload, list, delete, and clipboard paste commands
- Add image file PII detection with user approval workflow
- Register image attachment commands in Tauri IPC
- Update TypeScript types and frontend components
- Add unit tests for image attachment functionality
- Update README and wiki documentation
2026-04-08 20:03:34 -05:00
Shaun Arman
1de50f1c87 chore: remove all proprietary vendor references for public release
- Delete internal vendor API documentation and handoff docs
- Remove vendor-specific AI gateway URLs from CSP whitelist
- Replace vendor-specific log prefixes and comments with generic 'Custom REST'
- Remove vendor-specific default auth header from custom REST implementation
- Remove vendor-specific client header from HTTP requests
- Remove backward-compat vendor format identifier from is_custom_rest_format()
- Remove LEGACY_API_FORMAT constant and normalizeApiFormat() helper
- Update test to not reference legacy format identifier
- Update wiki docs to use generic enterprise gateway configuration
- Update architecture diagrams and ADR-003 to remove vendor references
- Add Buy Me A Coffee link to README
- Update .gitignore to exclude internal user guide and ticket files

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-07 09:46:25 -05:00
Shaun Arman
9e8db9dc81 feat(ai): add tool-calling and integration search as AI data source
This commit implements two major features:

1. Integration Search as Primary AI Data Source
   - Confluence, ServiceNow, and Azure DevOps searches execute before AI queries
   - Search results injected as system context for AI providers
   - Parallel search execution for performance
   - Webview-based fetch for HttpOnly cookie support
   - Persistent browser windows maintain authenticated sessions

2. AI Tool-Calling (Function Calling)
   - Allows AI to automatically execute functions during conversation
   - Implemented for OpenAI-compatible providers and Custom REST provider
   - Created add_ado_comment tool for updating Azure DevOps tickets
   - Iterative tool-calling loop supports multi-step workflows
   - Extensible architecture for adding new tools

Key Files:
- src-tauri/src/ai/tools.rs (NEW) - Tool definitions
- src-tauri/src/integrations/*_search.rs (NEW) - Integration search modules
- src-tauri/src/integrations/webview_fetch.rs (NEW) - HttpOnly cookie workaround
- src-tauri/src/commands/ai.rs - Tool execution and integration search
- src-tauri/src/ai/openai.rs - Tool-calling for OpenAI and Custom REST provider
- All providers updated with tools parameter support

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2026-04-07 09:35:34 -05:00
Shaun Arman
9175faf0b4 refactor(ollama): remove download/install buttons — show plain install instructions only 2026-04-05 20:53:57 -05:00
Shaun Arman
215c0ae218 feat(ui): fix model dropdown, auth prefill, PII persistence, theme toggle, and Ollama bundle
- AIProviders: hide top model row when custom_rest active (dropdown lower in form handles it);
  clear auth header prefill on format switch; rename User ID / CORE ID → Email Address
- Dashboard + Ollama: add border-border/bg-card classes to Refresh buttons for dark-bg contrast
- Security + settingsStore: wire PII toggle state to persisted Zustand store so pattern
  selections survive app restarts
- App: add Sun/Moon theme toggle button to sidebar footer (always visible when collapsed)
- system.rs: add install_ollama_from_bundle command (copies bundled binary to /usr/local/bin)
- auto-tag.yml: add Download Ollama step to all 4 platform build jobs with SHA256 verification
- tauri.conf.json: add resources/ollama/* to bundle resources
- docs: add install_ollama_from_bundle to IPC-Commands wiki

Security: CI download steps verify SHA256 against Ollama's published sha256sums.txt before bundling.
2026-04-05 19:30:41 -05:00
Shaun Arman
a7903db904 fix: persist integration settings and implement persistent browser windows
Some checks failed
Release / build-macos-arm64 (push) Successful in 4m52s
Release / build-linux-amd64 (push) Has been cancelled
Release / build-linux-arm64 (push) Has been cancelled
Release / build-windows-amd64 (push) Has been cancelled
## Integration Settings Persistence
- Add database commands to save/load integration configs (base_url, username, project_name, space_key)
- Frontend now loads configs from DB on mount and saves changes automatically
- Fixes issue where settings were lost on app restart

## Persistent Browser Window Architecture
- Integration browser windows now stay open for user browsing and authentication
- Extract fresh cookies before each API call to handle token rotation
- Track open windows in app state (integration_webviews HashMap)
- Windows titled as "{Service} Browser (TFTSR)" for clarity
- Support easy navigation between app and browser windows (Cmd+Tab/Alt+Tab)
- Gracefully handle closed windows with automatic cleanup

## Bug Fixes
- Fix Rust formatting issues across 8 files
- Fix clippy warnings:
  - Use is_some_and() instead of map_or() in openai.rs
  - Use .to_string() instead of format!() in integrations.rs
- Add missing OptionalExtension import for .optional() method

## Tests
- Add test_integration_config_serialization
- Add test_webview_tracking
- Add test_token_auth_request_serialization
- All 6 integration tests passing

## Files Modified
- src-tauri/src/state.rs: Add integration_webviews tracking
- src-tauri/src/lib.rs: Register 3 new commands, initialize webviews HashMap
- src-tauri/src/commands/integrations.rs: Config persistence, fresh cookie extraction (+151 lines)
- src-tauri/src/integrations/webview_auth.rs: Persistent window behavior
- src/lib/tauriCommands.ts: TypeScript wrappers for new commands
- src/pages/Settings/Integrations.tsx: Load/save configs from DB

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2026-04-04 09:57:22 -05:00
Shaun Arman
32d83df3cf feat: add multi-mode authentication for integrations (v0.2.10)
Some checks failed
Release / build-windows-amd64 (push) Has been cancelled
Release / build-linux-amd64 (push) Has been cancelled
Release / build-macos-arm64 (push) Has been cancelled
Release / build-linux-arm64 (push) Has been cancelled
Implement three authentication methods for Confluence, ServiceNow, and Azure DevOps:

1. **OAuth2** - Traditional OAuth flow for enterprise SSO environments
2. **Embedded Browser** - Webview-based login that captures session cookies/tokens
   - Solves VPN constraints: users authenticate off-VPN via web UI
   - Extracted credentials work on-VPN for API calls
   - Based on confluence-publisher agent pattern
3. **Manual Token** - Direct API token/PAT input as fallback

**Changes:**
- Add webview_auth.rs module for embedded browser authentication
- Implement authenticate_with_webview and extract_cookies_from_webview commands
- Implement save_manual_token command with validation
- Add AuthMethod enum to support all three modes
- Add RadioGroup UI component for mode selection
- Complete rewrite of Integrations settings page with mode-specific UI
- Add secondary button variant for UI consistency

**VPN-friendly design:**
Users can authenticate via webview when off-VPN (web UI accessible), then use extracted cookies for API calls when on-VPN (API requires VPN). Addresses enterprise SSO limitations where OAuth app registration is blocked.

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2026-04-03 17:26:09 -05:00
Shaun Arman
a42745b791 fix: add user_id support and OAuth shell permission (v0.2.6)
Some checks failed
Release / build-linux-arm64 (push) Has been cancelled
Release / build-linux-amd64 (push) Has been cancelled
Release / build-macos-arm64 (push) Has been cancelled
Release / build-windows-amd64 (push) Has been cancelled
Fixes:
- Added shell:allow-open permission to fix OAuth integration flows
- Added user_id field to ProviderConfig for Custom REST provider CORE ID
- Added UI field for user_id when api_format is custom_rest
- Made userId optional in Custom REST provider requests (only sent if provided)
- Added X-msi-genai-client header to Custom REST provider requests
- Updated CSP to include Custom REST provider domains
- Bumped version to 0.2.6

This fixes:
- OAuth error: 'Command plugin:shell|open not allowed by ACL'
- Missing User ID field in Custom REST provider configuration UI
2026-04-03 16:34:00 -05:00
Shaun Arman
190084888c feat: add Custom REST provider support
- Extended ProviderConfig with optional custom fields for non-OpenAI APIs
- Added custom_endpoint_path, custom_auth_header, custom_auth_prefix fields
- Added api_format field to distinguish between OpenAI and Custom REST provider formats
- Added session_id field for stateful conversation APIs
- Implemented chat_custom_rest() method in OpenAI provider
- Custom REST provider uses different request format (prompt+sessionId) and response (msg field)
- Updated TypeScript types to match Rust schema
- Added UI controls in Settings/AIProviders for custom provider configuration
- API format selector auto-populates appropriate defaults (OpenAI vs Custom REST provider)
- Backward compatible: existing providers default to OpenAI format
2026-04-03 15:45:42 -05:00
Shaun Arman
1e8ef41e64 feat: add OAuth2 frontend UI and complete integration flow
Some checks failed
Auto Tag / auto-tag (push) Successful in 4s
Test / rust-fmt-check (push) Successful in 2m5s
Release / build-macos-arm64 (push) Successful in 10m29s
Test / rust-clippy (push) Failing after 18m4s
Release / build-linux-arm64 (push) Failing after 22m1s
Test / rust-tests (push) Successful in 12m44s
Test / frontend-typecheck (push) Successful in 1m29s
Test / frontend-tests (push) Has been cancelled
Release / build-windows-amd64 (push) Has been cancelled
Release / build-linux-amd64 (push) Has been cancelled
Phase 2.2: OAuth2 flow - FRONTEND COMPLETE 

Implemented:
- TypeScript command wrappers in tauriCommands.ts
  * initiateOauthCmd(service) -> OAuthInitResponse
  * handleOauthCallbackCmd(service, code, stateKey)
  * test*ConnectionCmd() for all services
  * OAuthInitResponse and ConnectionResult types

- Complete Settings/Integrations UI
  * Three integration cards: Confluence, ServiceNow, ADO
  * Connect with OAuth2 buttons (Confluence, ADO)
  * Basic auth note for ServiceNow
  * Configuration inputs: baseUrl, username, projectName, spaceKey
  * Test connection buttons with loading states
  * Success/error feedback with color-coded messages
  * OAuth2 flow instructions for users

- OAuth2 flow in browser
  * Opens auth URL in default browser via shell plugin
  * User authenticates with service
  * Redirected to localhost:8765/callback
  * Callback server handles token exchange automatically
  * Success message shown to user

- CSP updates in tauri.conf.json
  * Added http://localhost:8765 (callback server)
  * Added https://auth.atlassian.com (Confluence OAuth)
  * Added https://*.atlassian.net (Confluence API)
  * Added https://login.microsoftonline.com (ADO OAuth)
  * Added https://dev.azure.com (ADO API)

- UI improvements
  * Fixed Cancel button variant (ghost instead of secondary)
  * Loading spinners with Loader2 icon
  * Check/X icons for success/error states
  * Disabled states when not configured
  * Optimistic UI updates on connect

Frontend + Backend = COMPLETE END-TO-END OAUTH2 FLOW:
1. User goes to Settings → Integrations
2. Enters base URL and config
3. Clicks 'Connect with OAuth2'
4. Browser opens with service auth page
5. User logs in and authorizes
6. Redirected to localhost:8765/callback
7. Token exchanged and encrypted automatically
8. Stored in SQLite credentials table
9. Ready for API calls to external services 

TypeScript: All types checked, no errors
Frontend build:  Built in 2.26s
Total lines: ~400 lines of new UI code

Next: Phase 2.3 - Integration API clients (Confluence REST, ServiceNow REST, ADO REST)
2026-04-03 15:04:12 -05:00
Shaun Arman
4c4ca40146 fix: UI contrast issues and ARM64 build failure
**UI Fixes (TDD approach - tests first, then implementation):**
- Resolution steps: improved text contrast (text-foreground vs muted)
- DocEditor preview: added text-foreground class for readability
- History page: fixed domain display (category field) with better contrast
- Audit Log: added expandable rows with View/Hide buttons to show transmitted data
- Dashboard & buttons: already had proper contrast with outline variant
- Export document: fixed missing title/content parameters in command signature

**Tests Added (13 new tests, all passing):**
- tests/unit/resolution.test.tsx - resolution steps contrast
- tests/unit/docEditor.test.tsx - preview mode and export buttons
- tests/unit/exportDocument.test.ts - export parameters validation
- tests/unit/history.test.tsx - domain display and filtering
- tests/unit/dashboard.test.tsx - refresh button visibility
- tests/unit/auditLog.test.tsx - data visibility and expandable rows
- tests/unit/setup.ts - added @testing-library/jest-dom matchers

**CI Fix:**
- Removed platform label from ARM64 build step (native agent, old Docker)

**Test Results:**
- Frontend: 38/38 passing 
- Backend: 64/64 passing 
- TypeScript: no errors 

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2026-04-03 08:05:58 -05:00
Shaun Arman
03cc9914ad fix: domainPrompts closing brace too early; arm64 use native platform image
Some checks failed
Auto Tag / auto-tag (push) Successful in 4s
Release / build-linux-arm64 (push) Failing after 0s
Test / rust-fmt-check (push) Successful in 1m4s
Release / build-macos-arm64 (push) Successful in 5m26s
Test / rust-clippy (push) Successful in 7m41s
Test / rust-tests (push) Successful in 8m13s
Test / frontend-typecheck (push) Successful in 1m28s
Test / frontend-tests (push) Successful in 1m12s
Release / build-linux-amd64 (push) Successful in 16m13s
Release / build-windows-amd64 (push) Successful in 13m30s
- domainPrompts.ts: closing }; was inside the Record object after 'automation',
  leaving hpe_infra/dell_hardware/identity orphaned outside the object — caused
  3 TS1005/TS1109 errors and broke the macOS and all frontend builds
- release.yml: replace multiarch cross-compilation (broken due to WebKit arm64
  package conflicts) with --platform linux/arm64 container option so QEMU runs
  a native ARM64 image directly — no cross-compilation, no package conflicts
2026-03-31 19:36:07 -05:00
Shaun Arman
3d3f877eb3 feat: add HPE, Dell, Identity domains + expand k8s/security/observability/VESTA NXT
Some checks failed
Auto Tag / auto-tag (push) Successful in 4s
Release / build-macos-arm64 (push) Failing after 37s
Test / rust-fmt-check (push) Successful in 1m4s
Release / build-linux-arm64 (push) Failing after 1m13s
Test / rust-clippy (push) Successful in 7m32s
Test / rust-tests (push) Successful in 8m19s
Test / frontend-typecheck (push) Failing after 1m22s
Test / frontend-tests (push) Successful in 1m20s
Release / build-linux-amd64 (push) Failing after 9m19s
Release / build-windows-amd64 (push) Failing after 6m45s
New domains:
- HPE Infrastructure: OneView v8.5, iLO, Synergy 12000/480 Gen10/11, DL360/320/20,
  Image Streamer, SSP, Smart Update Manager, RACADM equivalents
- Dell Hardware: iDRAC 8/9/10, RACADM, Lifecycle Controller, PERC/StorCLI,
  OpenManage, R-series PowerEdge servers
- Identity & Access: Keycloak realm/SSO/LDAP federation, HashiCorp Boundary,
  SSSD/AD integration, Kerberos

Expanded domains:
- Kubernetes: add RKE2, OpenShift/KubeVirt (OCP operators, must-gather, CDI)
- Security: add Cortex XDR, Trellix, Rapid7, CIS hardening, fapolicyd, AIDE
- Observability: add Beats agents (Filebeat/Metricbeat/Packetbeat), Zabbix Proxy,
  OpenTelemetry collector pipeline troubleshooting
- Public Safety: add full VESTA NXT microservices (Skipper, CTC, i3 services,
  Analytics/PEIDB, Management Console, Porter/Helm deployment context)
2026-03-31 18:32:40 -05:00
Shaun Arman
99ec66c77b feat: expand domains to 13 — add Telephony, Security/Vault, Public Safety, Application, Automation/CI-CD
Some checks failed
Auto Tag / auto-tag (push) Successful in 3s
Release / build-linux-arm64 (push) Failing after 1m7s
Test / rust-fmt-check (push) Successful in 1m7s
Release / build-macos-arm64 (push) Successful in 4m55s
Test / rust-clippy (push) Successful in 7m21s
Test / rust-tests (push) Successful in 8m19s
Test / frontend-typecheck (push) Successful in 1m25s
Test / frontend-tests (push) Has been cancelled
Release / build-windows-amd64 (push) Has been cancelled
Release / build-linux-amd64 (push) Has been cancelled
New domains: Telephony (Asterisk, AudioCodes SBC, SIP/RTP), Security/Vault
(HashiCorp Vault, PKI, mTLS), Public Safety (NENA i3, NG911, CAD, PSAP),
Application (Java/JVM, Spring Boot, Tomcat), Automation/CI-CD (Ansible,
Jenkins, Porter, Helm).

Existing domains expanded: Linux adds RHEL 8/9 + OEL 6/7/8/9 + Debian specifics;
Windows adds 10/11 + Server 2019/2022; Network adds Fortigate/Cisco/Aruba/Nokia;
Kubernetes adds k3s/Rancher/ECK; Databases adds MS SQL/RabbitMQ/Patroni;
Virtualization adds Proxmox; Observability adds Grafana/Kibana specifics.
2026-03-31 18:13:30 -05:00
Shaun Arman
47af97b68e feat: close issues, restore history, auto-save resolution steps
Some checks failed
Test / frontend-typecheck (push) Waiting to run
Test / frontend-tests (push) Waiting to run
Auto Tag / auto-tag (push) Successful in 4s
Test / rust-fmt-check (push) Successful in 1m2s
Release / build-linux-arm64 (push) Failing after 1m11s
Release / build-macos-arm64 (push) Successful in 4m31s
Test / rust-clippy (push) Successful in 7m44s
Test / rust-tests (push) Has been cancelled
Release / build-linux-amd64 (push) Successful in 16m6s
Release / build-windows-amd64 (push) Successful in 12m38s
- db.rs: add get_issue_messages command (joins ai_conversations + ai_messages)
- tauriCommands.ts: fix updateIssueCmd to pass updates as nested object
  (was spreading inline — Rust expects {issueId, updates}); fix addFiveWhyCmd
  parameter names to match Rust (stepOrder, whyQuestion, answer, evidence);
  add getIssueMessagesCmd and IssueMessage interface
- Dashboard: X button on each open issue row to close (mark resolved) inline
- Triage: restore conversation history from DB when revisiting existing issues;
  detect close intent patterns and mark issue resolved + navigate home;
  auto-save resolution step via addFiveWhyCmd when AI advances why level
- tests: add issueActions.test.ts covering IPC arg structure and close intent
2026-03-31 12:50:39 -05:00
Shaun Arman
5b37bd3435 fix: listIssuesCmd was sending {query} but Rust expects {filter} — caused dashboard to always show 0 open issues
Some checks failed
Auto Tag / auto-tag (push) Successful in 4s
Release / build-macos-arm64 (push) Successful in 3m45s
Test / rust-fmt-check (push) Failing after 10m37s
Release / build-linux-arm64 (push) Failing after 10m6s
Test / rust-clippy (push) Successful in 7m12s
Test / rust-tests (push) Successful in 7m56s
Test / frontend-typecheck (push) Successful in 1m28s
Test / frontend-tests (push) Successful in 1m12s
Release / build-linux-amd64 (push) Successful in 16m17s
Release / build-windows-amd64 (push) Successful in 13m11s
2026-03-31 09:09:57 -05:00
Shaun Arman
652418017c fix: provider test FK error, model pull white screen, RECOMMENDED badge
Some checks failed
Auto Tag / auto-tag (push) Successful in 4s
Test / rust-fmt-check (push) Failing after 1m1s
Release / build-macos-arm64 (push) Successful in 3m2s
Test / rust-clippy (push) Successful in 7m16s
Test / frontend-typecheck (push) Has been cancelled
Test / frontend-tests (push) Has been cancelled
Test / rust-tests (push) Has been cancelled
Release / build-linux-amd64 (push) Has been cancelled
Release / build-windows-amd64 (push) Has been cancelled
Release / build-linux-arm64 (push) Has been cancelled
2026-03-31 07:46:36 -05:00
Shaun Arman
16d537c4af fix: button text visibility, toggle contrast, create_issue IPC, ad-hoc codesign
Some checks failed
Test / rust-fmt-check (push) Successful in 1m5s
Test / rust-tests (push) Has been cancelled
Test / frontend-typecheck (push) Has been cancelled
Test / frontend-tests (push) Has been cancelled
Test / rust-clippy (push) Has been cancelled
Test / rust-fmt-check (pull_request) Successful in 1m4s
Test / rust-clippy (pull_request) Successful in 7m8s
Test / rust-tests (pull_request) Successful in 8m21s
Test / frontend-typecheck (pull_request) Successful in 1m29s
Test / frontend-tests (pull_request) Successful in 1m15s
- globals.css: remove button from WebKit -webkit-text-fill-color override that
  was causing button text to be invisible (text color matched background in dark mode)
- Security.tsx: toggle enabled state uses bg-blue-500 instead of bg-primary;
  in dark mode --primary is near-white making the white knob invisible
- tauriCommands.ts: fix createIssueCmd to pass flat args (not wrapped in newIssue),
  map domain->category, and return Issue instead of IssueDetail
- NewIssue/index.tsx: update call site to use Issue return type directly
- release.yml: add ad-hoc codesign step for macOS .app so Gatekeeper shows
  "unidentified developer" instead of "damaged" error
2026-03-30 15:52:43 -05:00
Shaun Arman
8839075805 feat: initial implementation of TFTSR IT Triage & RCA application
Implements Phases 1-8 of the TFTSR implementation plan.

Rust backend (Tauri 2.x, src-tauri/):
- Multi-provider AI: OpenAI-compatible, Anthropic, Gemini, Mistral, Ollama
- PII detection engine: 11 regex patterns with overlap resolution
- SQLCipher AES-256 encrypted database with 10 versioned migrations
- 28 Tauri IPC commands for triage, analysis, document, and system ops
- Ollama: hardware probe, model recommendations, pull/delete with events
- RCA and blameless post-mortem Markdown document generators
- PDF export via printpdf
- Audit log: SHA-256 hash of every external data send
- Integration stubs for Confluence, ServiceNow, Azure DevOps (v0.2)

Frontend (React 18 + TypeScript + Vite, src/):
- 9 pages: full triage workflow NewIssue→LogUpload→Triage→Resolution→RCA→Postmortem→History+Settings
- 7 components: ChatWindow, TriageProgress, PiiDiffViewer, DocEditor, HardwareReport, ModelSelector, UI primitives
- 3 Zustand stores: session, settings (persisted), history
- Type-safe tauriCommands.ts matching Rust backend types exactly
- 8 IT domain system prompts (Linux, Windows, Network, K8s, DB, Virt, HW, Obs)

DevOps:
- .woodpecker/test.yml: rustfmt, clippy, cargo test, tsc, vitest on every push
- .woodpecker/release.yml: linux/amd64 + linux/arm64 builds, Gogs release upload

Verified:
- cargo check: zero errors
- tsc --noEmit: zero errors
- vitest run: 13/13 unit tests passing

Co-Authored-By: Claude Sonnet 4.6 (1M context) <noreply@anthropic.com>
2026-03-14 22:36:25 -05:00