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>
77 lines
2.5 KiB
JavaScript
77 lines
2.5 KiB
JavaScript
var OverloadYield = require("./OverloadYield.js");
|
|
var regenerator = require("./regenerator.js");
|
|
var regeneratorAsync = require("./regeneratorAsync.js");
|
|
var regeneratorAsyncGen = require("./regeneratorAsyncGen.js");
|
|
var regeneratorAsyncIterator = require("./regeneratorAsyncIterator.js");
|
|
var regeneratorKeys = require("./regeneratorKeys.js");
|
|
var regeneratorValues = require("./regeneratorValues.js");
|
|
function _regeneratorRuntime() {
|
|
"use strict";
|
|
|
|
var r = regenerator(),
|
|
e = r.m(_regeneratorRuntime),
|
|
t = (Object.getPrototypeOf ? Object.getPrototypeOf(e) : e.__proto__).constructor;
|
|
function n(r) {
|
|
var e = "function" == typeof r && r.constructor;
|
|
return !!e && (e === t || "GeneratorFunction" === (e.displayName || e.name));
|
|
}
|
|
var o = {
|
|
"throw": 1,
|
|
"return": 2,
|
|
"break": 3,
|
|
"continue": 3
|
|
};
|
|
function a(r) {
|
|
var e, t;
|
|
return function (n) {
|
|
e || (e = {
|
|
stop: function stop() {
|
|
return t(n.a, 2);
|
|
},
|
|
"catch": function _catch() {
|
|
return n.v;
|
|
},
|
|
abrupt: function abrupt(r, e) {
|
|
return t(n.a, o[r], e);
|
|
},
|
|
delegateYield: function delegateYield(r, o, a) {
|
|
return e.resultName = o, t(n.d, regeneratorValues(r), a);
|
|
},
|
|
finish: function finish(r) {
|
|
return t(n.f, r);
|
|
}
|
|
}, t = function t(r, _t, o) {
|
|
n.p = e.prev, n.n = e.next;
|
|
try {
|
|
return r(_t, o);
|
|
} finally {
|
|
e.next = n.n;
|
|
}
|
|
}), e.resultName && (e[e.resultName] = n.v, e.resultName = void 0), e.sent = n.v, e.next = n.n;
|
|
try {
|
|
return r.call(this, e);
|
|
} finally {
|
|
n.p = e.prev, n.n = e.next;
|
|
}
|
|
};
|
|
}
|
|
return (module.exports = _regeneratorRuntime = function _regeneratorRuntime() {
|
|
return {
|
|
wrap: function wrap(e, t, n, o) {
|
|
return r.w(a(e), t, n, o && o.reverse());
|
|
},
|
|
isGeneratorFunction: n,
|
|
mark: r.m,
|
|
awrap: function awrap(r, e) {
|
|
return new OverloadYield(r, e);
|
|
},
|
|
AsyncIterator: regeneratorAsyncIterator,
|
|
async: function async(r, e, t, o, u) {
|
|
return (n(e) ? regeneratorAsyncGen : regeneratorAsync)(a(r), e, t, o, u);
|
|
},
|
|
keys: regeneratorKeys,
|
|
values: regeneratorValues
|
|
};
|
|
}, module.exports.__esModule = true, module.exports["default"] = module.exports)();
|
|
}
|
|
module.exports = _regeneratorRuntime, module.exports.__esModule = true, module.exports["default"] = module.exports; |