tftsr-devops_investigation/node_modules/tough-cookie/dist/utils.js
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

100 lines
3.7 KiB
JavaScript

"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.safeToString = exports.objectToString = void 0;
exports.createPromiseCallback = createPromiseCallback;
exports.inOperator = inOperator;
/** Wrapped `Object.prototype.toString`, so that you don't need to remember to use `.call()`. */
const objectToString = (obj) => Object.prototype.toString.call(obj);
exports.objectToString = objectToString;
/**
* Converts an array to string, safely handling symbols, null prototype objects, and recursive arrays.
*/
const safeArrayToString = (arr, seenArrays) => {
// See https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/toString#description
if (typeof arr.join !== 'function')
return (0, exports.objectToString)(arr);
seenArrays.add(arr);
const mapped = arr.map((val) => val === null || val === undefined || seenArrays.has(val)
? ''
: safeToStringImpl(val, seenArrays));
return mapped.join();
};
const safeToStringImpl = (val, seenArrays = new WeakSet()) => {
// Using .toString() fails for null/undefined and implicit conversion (val + "") fails for symbols
// and objects with null prototype
if (typeof val !== 'object' || val === null) {
return String(val);
}
else if (typeof val.toString === 'function') {
return Array.isArray(val)
? // Arrays have a weird custom toString that we need to replicate
safeArrayToString(val, seenArrays)
: // eslint-disable-next-line @typescript-eslint/no-base-to-string
String(val);
}
else {
// This case should just be objects with null prototype, so we can just use Object#toString
return (0, exports.objectToString)(val);
}
};
/** Safely converts any value to string, using the value's own `toString` when available. */
const safeToString = (val) => safeToStringImpl(val);
exports.safeToString = safeToString;
/** Converts a callback into a utility object where either a callback or a promise can be used. */
function createPromiseCallback(cb) {
let callback;
let resolve;
let reject;
const promise = new Promise((_resolve, _reject) => {
resolve = _resolve;
reject = _reject;
});
if (typeof cb === 'function') {
callback = (err, result) => {
try {
if (err)
cb(err);
// If `err` is null, we know `result` must be `T`
// The assertion isn't *strictly* correct, as `T` could be nullish, but, ehh, good enough...
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
else
cb(null, result);
}
catch (e) {
reject(e instanceof Error ? e : new Error());
}
};
}
else {
callback = (err, result) => {
try {
// If `err` is null, we know `result` must be `T`
// The assertion isn't *strictly* correct, as `T` could be nullish, but, ehh, good enough...
if (err)
reject(err);
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
else
resolve(result);
}
catch (e) {
reject(e instanceof Error ? e : new Error());
}
};
}
return {
promise,
callback,
resolve: (value) => {
callback(null, value);
return promise;
},
reject: (error) => {
callback(error);
return promise;
},
};
}
function inOperator(k, o) {
return k in o;
}