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>
85 lines
1.9 KiB
JavaScript
85 lines
1.9 KiB
JavaScript
/**
|
|
* @import {Extension} from 'micromark-util-types'
|
|
*/
|
|
|
|
import { attention, autolink, blockQuote, characterEscape, characterReference, codeFenced, codeIndented, codeText, definition, hardBreakEscape, headingAtx, htmlFlow, htmlText, labelEnd, labelStartImage, labelStartLink, lineEnding, list, setextUnderline, thematicBreak } from 'micromark-core-commonmark';
|
|
import { resolver as resolveText } from './initialize/text.js';
|
|
|
|
/** @satisfies {Extension['document']} */
|
|
export const document = {
|
|
[42]: list,
|
|
[43]: list,
|
|
[45]: list,
|
|
[48]: list,
|
|
[49]: list,
|
|
[50]: list,
|
|
[51]: list,
|
|
[52]: list,
|
|
[53]: list,
|
|
[54]: list,
|
|
[55]: list,
|
|
[56]: list,
|
|
[57]: list,
|
|
[62]: blockQuote
|
|
};
|
|
|
|
/** @satisfies {Extension['contentInitial']} */
|
|
export const contentInitial = {
|
|
[91]: definition
|
|
};
|
|
|
|
/** @satisfies {Extension['flowInitial']} */
|
|
export const flowInitial = {
|
|
[-2]: codeIndented,
|
|
[-1]: codeIndented,
|
|
[32]: codeIndented
|
|
};
|
|
|
|
/** @satisfies {Extension['flow']} */
|
|
export const flow = {
|
|
[35]: headingAtx,
|
|
[42]: thematicBreak,
|
|
[45]: [setextUnderline, thematicBreak],
|
|
[60]: htmlFlow,
|
|
[61]: setextUnderline,
|
|
[95]: thematicBreak,
|
|
[96]: codeFenced,
|
|
[126]: codeFenced
|
|
};
|
|
|
|
/** @satisfies {Extension['string']} */
|
|
export const string = {
|
|
[38]: characterReference,
|
|
[92]: characterEscape
|
|
};
|
|
|
|
/** @satisfies {Extension['text']} */
|
|
export const text = {
|
|
[-5]: lineEnding,
|
|
[-4]: lineEnding,
|
|
[-3]: lineEnding,
|
|
[33]: labelStartImage,
|
|
[38]: characterReference,
|
|
[42]: attention,
|
|
[60]: [autolink, htmlText],
|
|
[91]: labelStartLink,
|
|
[92]: [hardBreakEscape, characterEscape],
|
|
[93]: labelEnd,
|
|
[95]: attention,
|
|
[96]: codeText
|
|
};
|
|
|
|
/** @satisfies {Extension['insideSpan']} */
|
|
export const insideSpan = {
|
|
null: [attention, resolveText]
|
|
};
|
|
|
|
/** @satisfies {Extension['attentionMarkers']} */
|
|
export const attentionMarkers = {
|
|
null: [42, 95]
|
|
};
|
|
|
|
/** @satisfies {Extension['disable']} */
|
|
export const disable = {
|
|
null: []
|
|
}; |