- 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
12 KiB
IPC Commands
All backend commands are typed wrappers in src/lib/tauriCommands.ts. The Rust handlers live in src-tauri/src/commands/.
Database Commands
create_issue
createIssueCmd(title: string, description: string, severity: string, category: string) → Issue
Creates a new issue. Generates UUID v7. Returns the created Issue.
get_issue
getIssueCmd(issueId: string) → IssueDetail
Returns a nested IssueDetail — use detail.issue.title, not detail.title.
interface IssueDetail {
issue: Issue;
log_files: LogFile[];
resolution_steps: ResolutionStep[];
conversations: AiConversation[];
}
list_issues
listIssuesCmd(query: IssueListQuery) → IssueSummary[]
Paginated list. Supports filter by status, severity, category; sort by created_at/updated_at.
update_issue
updateIssueCmd(issueId: string, updates: Partial<IssueUpdate>) → IssueDetail
Partial update. Only provided fields are changed.
delete_issue
deleteIssueCmd(issueId: string) → void
Cascades: deletes log_files, pii_spans, conversations, messages, resolution_steps, documents.
search_issues
searchIssuesCmd(query: string) → IssueSummary[]
Full-text search via FTS5 virtual table on title + description.
add_five_why
addFiveWhyCmd(issueId: string, whyNumber: number, question: string, answer?: string) → FiveWhyEntry
Adds a 5-Whys entry (step 1–5). whyNumber maps to step_order.
update_five_why
updateFiveWhyCmd(entryId: string, answer: string) → void
Sets or updates the answer for an existing 5-Whys entry.
add_timeline_event
addTimelineEventCmd(issueId: string, eventType: string, description: string) → TimelineEvent
Records a timestamped event in the issue timeline.
Analysis / PII Commands
upload_log_file
uploadLogFileCmd(issueId: string, filePath: string) → LogFile
Reads the file from disk, computes SHA-256, stores metadata in DB. Returns LogFile record.
detect_pii
detectPiiCmd(logFileId: string) → PiiDetectionResult
Runs 13 PII patterns on the file content. Returns non-overlapping PiiSpan[].
interface PiiDetectionResult {
log_file_id: string;
spans: PiiSpan[];
total_found: number;
}
apply_redactions
applyRedactionsCmd(logFileId: string, approvedSpanIds: string[]) → RedactedLogFile
Rewrites file content with approved redactions. Records SHA-256 in audit log. Returns redacted content path.
Image Attachment Commands
upload_image_attachment
uploadImageAttachmentCmd(issueId: string, filePath: string, piiWarningAcknowledged: boolean) → ImageAttachment
Uploads an image file. Computes SHA-256, stores metadata in DB. Returns ImageAttachment record.
list_image_attachments
listImageAttachmentsCmd(issueId: string) → ImageAttachment[]
Lists all image attachments for an issue.
delete_image_attachment
deleteImageAttachmentCmd(imageId: string) → void
Deletes an image attachment from disk and database.
upload_paste_image
uploadPasteImageCmd(issueId: string, base64Data: string, fileName: string, piiWarningAcknowledged: boolean) → ImageAttachment
Uploads an image from clipboard paste (base64). Returns ImageAttachment record.
AI Commands
analyze_logs
analyzeLogsCmd(issueId: string, logFileIds: string[], providerConfig: ProviderConfig) → AnalysisResult
Sends selected (redacted) log files to the AI provider with an analysis prompt.
chat_message
chatMessageCmd(issueId: string, message: string, providerConfig: ProviderConfig) → ChatResponse
Sends a message in the ongoing triage conversation. Domain system prompt is injected automatically on first message. AI response is parsed for why-level indicators (1–5).
list_providers
listProvidersCmd() → ProviderInfo[]
Returns the list of supported providers with their available models and configuration schema.
Document Commands
generate_rca
generateRcaCmd(issueId: string) → Document
Builds an RCA Markdown document from the issue data, 5-Whys answers, and timeline.
generate_postmortem
generatePostmortemCmd(issueId: string) → Document
Builds a blameless post-mortem Markdown document.
update_document
updateDocumentCmd(docId: string, contentMd: string) → Document
Saves edited Markdown content back to the database.
export_document
exportDocumentCmd(docId: string, format: 'md' | 'pdf', outputDir: string) → string
Exports document to file. Returns the absolute path of the written file. PDF generation uses printpdf.
System / Ollama Commands
check_ollama_installed
checkOllamaInstalledCmd() → OllamaStatus
Checks if Ollama is running on the configured URL (default: localhost:11434).
get_ollama_install_guide
getOllamaInstallGuideCmd(platform: string) → InstallGuide
Returns platform-specific install instructions for Ollama.
list_ollama_models
listOllamaModelsCmd() → OllamaModel[]
Lists all locally available Ollama models.
pull_ollama_model
pullOllamaModelCmd(modelName: string) → void
Downloads a model from the Ollama registry. Streams progress.
delete_ollama_model
deleteOllamaModelCmd(modelName: string) → void
Removes a model from local storage.
detect_hardware
detectHardwareCmd() → HardwareInfo
Probes CPU, RAM, GPU. Returns hardware specifications.
recommend_models
recommendModelsCmd() → ModelRecommendation[]
Returns model recommendations based on detected hardware.
interface ModelRecommendation {
name: string;
size: string; // e.g., "2.0 GB" — a String, not a number
reason: string;
}
get_settings
getSettingsCmd() → AppSettings
Reads app settings from the settings table.
update_settings
updateSettingsCmd(partial: Partial<AppSettings>) → AppSettings
Merges partial settings and persists to DB.
get_audit_log
getAuditLogCmd(filter: AuditLogFilter) → AuditEntry[]
Returns audit log entries. Filter by action, entity_type, date range.
Integration Commands
Status: ✅ Fully Implemented (v0.2.3+)
All integration commands are production-ready with complete OAuth2/authentication flows.
OAuth2 Commands
initiate_oauth
initiateOauthCmd(service: "confluence" | "servicenow" | "azuredevops") → OAuthInitResponse
Starts OAuth2 PKCE flow. Returns authorization URL and state key. Opens browser window for user authentication.
interface OAuthInitResponse {
auth_url: string; // URL to open in browser
state: string; // State key for callback verification
}
Flow:
- Generates PKCE challenge
- Starts local callback server on
http://localhost:8765 - Opens authorization URL in browser
- User authenticates with service
- Service redirects to callback server
- Callback server triggers
handle_oauth_callback
handle_oauth_callback
handleOauthCallbackCmd(service: string, code: string, stateKey: string) → void
Exchanges authorization code for access token. Encrypts token with AES-256-GCM and stores in database.
Confluence Commands
test_confluence_connection
testConfluenceConnectionCmd(baseUrl: string, credentials: Record<string, unknown>) → ConnectionResult
Verifies Confluence connection by calling /rest/api/user/current.
list_confluence_spaces
listConfluenceSpacesCmd(config: ConfluenceConfig) → Space[]
Lists all accessible Confluence spaces.
search_confluence_pages
searchConfluencePagesCmd(config: ConfluenceConfig, query: string, spaceKey?: string) → Page[]
Searches pages using CQL (Confluence Query Language). Optional space filter.
publish_to_confluence
publishToConfluenceCmd(config: ConfluenceConfig, spaceKey: string, title: string, contentHtml: string, parentPageId?: string) → PublishResult
Creates a new page in Confluence. Returns page ID and URL.
update_confluence_page
updateConfluencePageCmd(config: ConfluenceConfig, pageId: string, title: string, contentHtml: string, version: number) → PublishResult
Updates an existing page. Requires current version number.
ServiceNow Commands
test_servicenow_connection
testServiceNowConnectionCmd(instanceUrl: string, credentials: Record<string, unknown>) → ConnectionResult
Verifies ServiceNow connection by querying incident table.
search_servicenow_incidents
searchServiceNowIncidentsCmd(config: ServiceNowConfig, query: string) → Incident[]
Searches incidents by short description. Returns up to 10 results.
create_servicenow_incident
createServiceNowIncidentCmd(config: ServiceNowConfig, shortDesc: string, description: string, urgency: string, impact: string) → TicketResult
Creates a new incident. Returns incident number and URL.
interface TicketResult {
id: string; // sys_id (UUID)
ticket_number: string; // INC0010001
url: string; // Direct link to incident
}
get_servicenow_incident
getServiceNowIncidentCmd(config: ServiceNowConfig, incidentId: string) → Incident
Retrieves incident by sys_id or incident number (e.g., INC0010001).
update_servicenow_incident
updateServiceNowIncidentCmd(config: ServiceNowConfig, sysId: string, updates: Record<string, any>) → TicketResult
Updates incident fields. Uses JSON-PATCH format.
Azure DevOps Commands
test_azuredevops_connection
testAzureDevOpsConnectionCmd(orgUrl: string, credentials: Record<string, unknown>) → ConnectionResult
Verifies Azure DevOps connection by querying project info.
search_azuredevops_workitems
searchAzureDevOpsWorkItemsCmd(config: AzureDevOpsConfig, query: string) → WorkItem[]
Searches work items using WIQL (Work Item Query Language).
create_azuredevops_workitem
createAzureDevOpsWorkItemCmd(config: AzureDevOpsConfig, title: string, description: string, workItemType: string, severity: string) → TicketResult
Creates a work item (Bug, Task, User Story). Returns work item ID and URL.
Work Item Types:
Bug— Software defectTask— Work assignmentUser Story— Feature requestIssue— Problem or blockerIncident— Production incident
get_azuredevops_workitem
getAzureDevOpsWorkItemCmd(config: AzureDevOpsConfig, workItemId: number) → WorkItem
Retrieves work item by ID.
update_azuredevops_workitem
updateAzureDevOpsWorkItemCmd(config: AzureDevOpsConfig, workItemId: number, updates: Record<string, any>) → TicketResult
Updates work item fields. Uses JSON-PATCH format.
Common Types
ConnectionResult
interface ConnectionResult {
success: boolean;
message: string;
}
PublishResult
interface PublishResult {
id: string; // Page ID or document ID
url: string; // Direct link to published content
}
TicketResult
interface TicketResult {
id: string; // sys_id or work item ID
ticket_number: string; // Human-readable number
url: string; // Direct link
}
Authentication Storage
All integration credentials are stored in the credentials table:
CREATE TABLE credentials (
id TEXT PRIMARY KEY,
service TEXT NOT NULL CHECK(service IN ('confluence','servicenow','azuredevops')),
token_hash TEXT NOT NULL, -- SHA-256 for audit
encrypted_token TEXT NOT NULL, -- AES-256-GCM encrypted
created_at TEXT NOT NULL,
expires_at TEXT
);
Encryption:
- Algorithm: AES-256-GCM
- Key derivation: From
TFTSR_DB_KEYenvironment variable - Nonce: Random 96-bit per encryption
- Format:
base64(nonce || ciphertext || tag)
Token retrieval:
// Backend: src-tauri/src/integrations/auth.rs
pub fn decrypt_token(encrypted: &str) -> Result<String, String>