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>
79 lines
4.0 KiB
JavaScript
79 lines
4.0 KiB
JavaScript
'use strict';
|
|
|
|
var isClickableInput = require('./click/isClickableInput.js');
|
|
var Blob = require('./dataTransfer/Blob.js');
|
|
var DataTransfer = require('./dataTransfer/DataTransfer.js');
|
|
var FileList = require('./dataTransfer/FileList.js');
|
|
var Clipboard = require('./dataTransfer/Clipboard.js');
|
|
var timeValue = require('./edit/timeValue.js');
|
|
var isContentEditable = require('./edit/isContentEditable.js');
|
|
var isEditable = require('./edit/isEditable.js');
|
|
var maxLength = require('./edit/maxLength.js');
|
|
var setFiles = require('./edit/setFiles.js');
|
|
var cursor = require('./focus/cursor.js');
|
|
var getActiveElement = require('./focus/getActiveElement.js');
|
|
var getTabDestination = require('./focus/getTabDestination.js');
|
|
var isFocusable = require('./focus/isFocusable.js');
|
|
var selection = require('./focus/selection.js');
|
|
var selector = require('./focus/selector.js');
|
|
var readNextDescriptor = require('./keyDef/readNextDescriptor.js');
|
|
var cloneEvent = require('./misc/cloneEvent.js');
|
|
var findClosest = require('./misc/findClosest.js');
|
|
var getDocumentFromNode = require('./misc/getDocumentFromNode.js');
|
|
var getTreeDiff = require('./misc/getTreeDiff.js');
|
|
var getWindow = require('./misc/getWindow.js');
|
|
var isDescendantOrSelf = require('./misc/isDescendantOrSelf.js');
|
|
var isElementType = require('./misc/isElementType.js');
|
|
var isVisible = require('./misc/isVisible.js');
|
|
var isDisabled = require('./misc/isDisabled.js');
|
|
var level = require('./misc/level.js');
|
|
var wait = require('./misc/wait.js');
|
|
var cssPointerEvents = require('./pointer/cssPointerEvents.js');
|
|
|
|
|
|
|
|
exports.isClickableInput = isClickableInput.isClickableInput;
|
|
exports.readBlobText = Blob.readBlobText;
|
|
exports.createDataTransfer = DataTransfer.createDataTransfer;
|
|
exports.getBlobFromDataTransferItem = DataTransfer.getBlobFromDataTransferItem;
|
|
exports.createFileList = FileList.createFileList;
|
|
exports.attachClipboardStubToView = Clipboard.attachClipboardStubToView;
|
|
exports.createClipboardItem = Clipboard.createClipboardItem;
|
|
exports.detachClipboardStubFromView = Clipboard.detachClipboardStubFromView;
|
|
exports.readDataTransferFromClipboard = Clipboard.readDataTransferFromClipboard;
|
|
exports.resetClipboardStubOnView = Clipboard.resetClipboardStubOnView;
|
|
exports.writeDataTransferToClipboard = Clipboard.writeDataTransferToClipboard;
|
|
exports.buildTimeValue = timeValue.buildTimeValue;
|
|
exports.isValidDateOrTimeValue = timeValue.isValidDateOrTimeValue;
|
|
exports.getContentEditable = isContentEditable.getContentEditable;
|
|
exports.isContentEditable = isContentEditable.isContentEditable;
|
|
exports.isEditable = isEditable.isEditable;
|
|
exports.isEditableInputOrTextArea = isEditable.isEditableInputOrTextArea;
|
|
exports.getMaxLength = maxLength.getMaxLength;
|
|
exports.supportsMaxLength = maxLength.supportsMaxLength;
|
|
exports.setFiles = setFiles.setFiles;
|
|
exports.getNextCursorPosition = cursor.getNextCursorPosition;
|
|
exports.getActiveElement = getActiveElement.getActiveElement;
|
|
exports.getActiveElementOrBody = getActiveElement.getActiveElementOrBody;
|
|
exports.getTabDestination = getTabDestination.getTabDestination;
|
|
exports.isFocusable = isFocusable.isFocusable;
|
|
exports.hasNoSelection = selection.hasNoSelection;
|
|
exports.hasOwnSelection = selection.hasOwnSelection;
|
|
exports.FOCUSABLE_SELECTOR = selector.FOCUSABLE_SELECTOR;
|
|
exports.readNextDescriptor = readNextDescriptor.readNextDescriptor;
|
|
exports.cloneEvent = cloneEvent.cloneEvent;
|
|
exports.findClosest = findClosest.findClosest;
|
|
exports.getDocumentFromNode = getDocumentFromNode.getDocumentFromNode;
|
|
exports.getTreeDiff = getTreeDiff.getTreeDiff;
|
|
exports.getWindow = getWindow.getWindow;
|
|
exports.isDescendantOrSelf = isDescendantOrSelf.isDescendantOrSelf;
|
|
exports.isElementType = isElementType.isElementType;
|
|
exports.isVisible = isVisible.isVisible;
|
|
exports.isDisabled = isDisabled.isDisabled;
|
|
exports.ApiLevel = level.ApiLevel;
|
|
exports.getLevelRef = level.getLevelRef;
|
|
exports.setLevelRef = level.setLevelRef;
|
|
exports.wait = wait.wait;
|
|
exports.assertPointerEvents = cssPointerEvents.assertPointerEvents;
|
|
exports.hasPointerEvents = cssPointerEvents.hasPointerEvents;
|