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>
87 lines
1.4 KiB
JavaScript
87 lines
1.4 KiB
JavaScript
'use strict';
|
|
/**
|
|
* @module Context
|
|
*/
|
|
/**
|
|
* Expose `Context`.
|
|
*/
|
|
|
|
module.exports = Context;
|
|
|
|
/**
|
|
* Initialize a new `Context`.
|
|
*
|
|
* @private
|
|
*/
|
|
function Context() {}
|
|
|
|
/**
|
|
* Set or get the context `Runnable` to `runnable`.
|
|
*
|
|
* @private
|
|
* @param {Runnable} runnable
|
|
* @return {Context} context
|
|
*/
|
|
Context.prototype.runnable = function (runnable) {
|
|
if (!arguments.length) {
|
|
return this._runnable;
|
|
}
|
|
this.test = this._runnable = runnable;
|
|
return this;
|
|
};
|
|
|
|
/**
|
|
* Set or get test timeout `ms`.
|
|
*
|
|
* @private
|
|
* @param {number} ms
|
|
* @return {Context} self
|
|
*/
|
|
Context.prototype.timeout = function (ms) {
|
|
if (!arguments.length) {
|
|
return this.runnable().timeout();
|
|
}
|
|
this.runnable().timeout(ms);
|
|
return this;
|
|
};
|
|
|
|
/**
|
|
* Set or get test slowness threshold `ms`.
|
|
*
|
|
* @private
|
|
* @param {number} ms
|
|
* @return {Context} self
|
|
*/
|
|
Context.prototype.slow = function (ms) {
|
|
if (!arguments.length) {
|
|
return this.runnable().slow();
|
|
}
|
|
this.runnable().slow(ms);
|
|
return this;
|
|
};
|
|
|
|
/**
|
|
* Mark a test as skipped.
|
|
*
|
|
* @private
|
|
* @throws Pending
|
|
*/
|
|
Context.prototype.skip = function () {
|
|
this.runnable().skip();
|
|
};
|
|
|
|
/**
|
|
* Set or get a number of allowed retries on failed tests
|
|
*
|
|
* @private
|
|
* @param {number} n
|
|
* @return {Context} self
|
|
*/
|
|
Context.prototype.retries = function (n) {
|
|
if (!arguments.length) {
|
|
return this.runnable().retries();
|
|
}
|
|
this.runnable().retries(n);
|
|
return this;
|
|
};
|