From e3ba7ff7e0d11e8d7475c5d7900dc5bf97fcf03e Mon Sep 17 00:00:00 2001 From: BigMarc Date: Thu, 18 Jun 2026 06:42:55 +0200 Subject: [PATCH 1/9] Fix Accessibility text capture failing system-wide AXUIElementCreateSystemWide() returns kAXErrorCannotComplete (-25204) for a background/menu-bar app on recent macOS, so the focused-element read returned nil and GrammaGem recognised no text or text areas in any app. Add AX.focusedElement(), which falls back to the frontmost app's PID-based AX element (reliable from an accessory process), and route TextCapture's selected-text and focused-field reads through it. Co-Authored-By: Claude Opus 4.8 (1M context) --- Sources/GrammaGem/System/AXSupport.swift | 26 ++++++++++++++++++++++ Sources/GrammaGem/System/TextCapture.swift | 7 ++---- 2 files changed, 28 insertions(+), 5 deletions(-) diff --git a/Sources/GrammaGem/System/AXSupport.swift b/Sources/GrammaGem/System/AXSupport.swift index 7dd5567..a80141c 100644 --- a/Sources/GrammaGem/System/AXSupport.swift +++ b/Sources/GrammaGem/System/AXSupport.swift @@ -1,4 +1,5 @@ import Foundation +import AppKit import ApplicationServices /// Safe Accessibility helpers shared across the System layer. @@ -36,4 +37,29 @@ enum AX { static func setMessagingTimeout(_ element: AXUIElement, _ seconds: Float) { AXUIElementSetMessagingTimeout(element, seconds) } + + /// The currently-focused UI element across the system — robust to the + /// system-wide element failing. + /// + /// On recent macOS, `AXUIElementCreateSystemWide()` returns + /// `kAXErrorCannotComplete` (-25204) for *every* query made by a background / + /// accessory process (which is exactly what a menu-bar app like GrammaGem is). + /// When that happens the system-wide focused-element read yields nil and the + /// app "sees" no text or text fields at all. Resolving the focused element + /// through the **frontmost application's** own AX element works reliably in + /// that context, so we prefer the system-wide read (one IPC hop, correct on + /// OSes where it works) and transparently fall back to the per-app read. + static func focusedElement() -> AXUIElement? { + let systemWide = AXUIElementCreateSystemWide() + setMessagingTimeout(systemWide, 0.5) + if let element = copyElement(systemWide, kAXFocusedUIElementAttribute as String) { + return element + } + guard let pid = NSWorkspace.shared.frontmostApplication?.processIdentifier else { + return nil + } + let axApp = AXUIElementCreateApplication(pid) + setMessagingTimeout(axApp, 0.5) + return copyElement(axApp, kAXFocusedUIElementAttribute as String) + } } diff --git a/Sources/GrammaGem/System/TextCapture.swift b/Sources/GrammaGem/System/TextCapture.swift index 8c1a090..e9df9a2 100644 --- a/Sources/GrammaGem/System/TextCapture.swift +++ b/Sources/GrammaGem/System/TextCapture.swift @@ -53,9 +53,7 @@ final class TextCapture { private func captureViaAccessibility() -> Capture? { guard AXIsProcessTrusted() else { return nil } - let systemWide = AXUIElementCreateSystemWide() - - guard let focused = AX.copyElement(systemWide, kAXFocusedUIElementAttribute) else { return nil } + guard let focused = AX.focusedElement() else { return nil } var valueRef: CFTypeRef? guard AXUIElementCopyAttributeValue( @@ -93,8 +91,7 @@ final class TextCapture { /// The full text value of the focused element (not just the selection). func focusedFieldText() -> (text: String, element: AXUIElement)? { guard AXIsProcessTrusted() else { return nil } - let systemWide = AXUIElementCreateSystemWide() - guard let focused = AX.copyElement(systemWide, kAXFocusedUIElementAttribute) else { return nil } + guard let focused = AX.focusedElement() else { return nil } // Only treat genuine editable text roles as fixable, so we don't report // "nothing selected" failures on sliders/steppers/custom controls. From 3ea090ae4bc874ff876afd5d4abc0ba62ab7dc45 Mon Sep 17 00:00:00 2001 From: BigMarc Date: Thu, 18 Jun 2026 06:43:11 +0200 Subject: [PATCH 2/9] Embed the real Harper grammar core via Rust C-FFI Replace the NSSpellChecker + regex-stub engine with harper-core 2.5.0: real subject-verb agreement, verb forms, punctuation, repetition and spelling. New harper-ffi crate (staticlib) exposes harper_check over a C ABI; the CHarper module bridges it to Swift; HarperEngine maps Harper's char spans onto UTF-16 ranges and de-dups overlapping lints. NSSpellChecker stays only as a case-preserving spelling supplement, which fixes the problemm->Problem mis-casing. Bulk apply now skips no-op suggestions. build.sh / scripts/build.sh build the universal static lib; target/ and lib/ are gitignored (regenerate via harper-ffi/build.sh). Co-Authored-By: Claude Opus 4.8 (1M context) --- .gitignore | 5 + Package.swift | 32 +- Sources/CHarper/include/harper.h | 37 + Sources/CHarper/include/module.modulemap | 4 + Sources/CHarper/shim.c | 4 + Sources/GrammaGem/Grammar/GrammarEngine.swift | 6 + Sources/GrammaGem/Grammar/HarperEngine.swift | 130 +- .../Grammar/SystemGrammarEngine.swift | 123 +- harper-ffi/Cargo.lock | 5617 +++++++++++++++++ harper-ffi/Cargo.toml | 21 + harper-ffi/build.sh | 26 + harper-ffi/include/harper.h | 56 + harper-ffi/src/lib.rs | 170 + scripts/build.sh | 4 + 14 files changed, 6098 insertions(+), 137 deletions(-) create mode 100644 Sources/CHarper/include/harper.h create mode 100644 Sources/CHarper/include/module.modulemap create mode 100644 Sources/CHarper/shim.c create mode 100644 harper-ffi/Cargo.lock create mode 100644 harper-ffi/Cargo.toml create mode 100755 harper-ffi/build.sh create mode 100644 harper-ffi/include/harper.h create mode 100644 harper-ffi/src/lib.rs diff --git a/.gitignore b/.gitignore index 90cc509..9c5b0be 100644 --- a/.gitignore +++ b/.gitignore @@ -3,3 +3,8 @@ dist/ *.xcodeproj/xcuserdata/ .DS_Store .swiftpm/ + +# Rust / Harper FFI build artifacts (regenerate with harper-ffi/build.sh). +# Cargo.lock IS committed (binary crate) for reproducible builds. +harper-ffi/target/ +harper-ffi/lib/ diff --git a/Package.swift b/Package.swift index f472874..f5a8e5a 100644 --- a/Package.swift +++ b/Package.swift @@ -1,13 +1,19 @@ // swift-tools-version:5.10 import PackageDescription +import Foundation // GrammaGem — native macOS menu-bar writing assistant. // -// This package builds with ONLY Apple frameworks so it compiles cleanly out of -// the box (`swift build`). The heavyweight third-party pieces from the spec — -// Harper (Rust grammar core), MLX (local LLM), KeyboardShortcuts, Sparkle — are -// abstracted behind protocols with working stub implementations and clearly -// marked `TODO(real-integration)` seams. See README.md for wiring the real deps. +// Layer-1 grammar is the real **Harper** core (Apache-2.0), embedded as a Rust +// C-FFI static library (see `harper-ffi/`). Build the lib first with +// `harper-ffi/build.sh` (universal arm64+x86_64 -> harper-ffi/lib/libharper_ffi.a); +// `scripts/build.sh` does this automatically. The remaining heavyweight pieces +// (MLX local LLM, Sparkle, KeyboardShortcuts) are still behind protocol seams. + +// Absolute path to the prebuilt Harper static lib, independent of build cwd. +let packageRoot = URL(fileURLWithPath: #filePath).deletingLastPathComponent().path +let harperLibDir = packageRoot + "/harper-ffi/lib" + let package = Package( name: "GrammaGem", platforms: [ @@ -16,17 +22,17 @@ let package = Package( products: [ .executable(name: "GrammaGem", targets: ["GrammaGem"]) ], - dependencies: [ - // TODO(real-integration): add when wiring real engines / distribution. - // .package(url: "https://github.com/sindresorhus/KeyboardShortcuts", from: "2.0.0"), - // .package(url: "https://github.com/sparkle-project/Sparkle", from: "2.6.0"), - // .package(url: "https://github.com/ml-explore/mlx-swift", from: "0.18.0"), - // The Harper grammar core is bundled via a Rust static lib + C-FFI; see harper-ffi/. - ], targets: [ + // C shim exposing libharper_ffi's C ABI (harper-ffi/include/harper.h) to Swift. + .target(name: "CHarper", path: "Sources/CHarper"), .executableTarget( name: "GrammaGem", - path: "Sources/GrammaGem" + dependencies: ["CHarper"], + path: "Sources/GrammaGem", + linkerSettings: [ + // Link the prebuilt universal Harper static library. + .unsafeFlags(["-L\(harperLibDir)", "-lharper_ffi"]) + ] ), .testTarget( name: "GrammaGemTests", diff --git a/Sources/CHarper/include/harper.h b/Sources/CHarper/include/harper.h new file mode 100644 index 0000000..45d5111 --- /dev/null +++ b/Sources/CHarper/include/harper.h @@ -0,0 +1,37 @@ +/* + * harper.h — C ABI for the harper-ffi static library (harper-core 2.5.0). + * + * Symbols are provided by libharper_ffi.a (linked via -lharper_ffi). All + * strings are UTF-8. See harper-ffi/ for the Rust source. + */ +#ifndef HARPER_FFI_H +#define HARPER_FFI_H + +#ifdef __cplusplus +extern "C" { +#endif + +/* + * Check `text` for grammar/spelling issues using harper-core. + * + * Returns a malloc'd, NUL-terminated UTF-8 JSON C string the caller MUST free + * with harper_free(). The JSON is an array of objects: + * [{ "start": , "len": , + * "replacement": "", "message": "", "kind": "" }] + * + * - "start"/"len" are CHAR (Unicode scalar) offsets, NOT bytes/UTF-16. + * - "kind" is one of: spelling, grammar, punctuation, repetition, + * capitalization, phrasing. + * + * On null/invalid input or any internal error, returns "[]". Thread-safe. + */ +char *harper_check(const char *text); + +/* Free a string previously returned by harper_check(). NULL is a no-op. */ +void harper_free(char *ptr); + +#ifdef __cplusplus +} +#endif + +#endif /* HARPER_FFI_H */ diff --git a/Sources/CHarper/include/module.modulemap b/Sources/CHarper/include/module.modulemap new file mode 100644 index 0000000..67118c8 --- /dev/null +++ b/Sources/CHarper/include/module.modulemap @@ -0,0 +1,4 @@ +module CHarper { + header "harper.h" + export * +} diff --git a/Sources/CHarper/shim.c b/Sources/CHarper/shim.c new file mode 100644 index 0000000..5089f89 --- /dev/null +++ b/Sources/CHarper/shim.c @@ -0,0 +1,4 @@ +// CHarper is a header-only shim that exposes libharper_ffi's C ABI (declared in +// include/harper.h) to Swift as the `CHarper` module. The actual symbols are +// provided by libharper_ffi.a, linked via the GrammaGem target's linkerSettings. +// This translation unit exists only so SwiftPM treats CHarper as a C target. diff --git a/Sources/GrammaGem/Grammar/GrammarEngine.swift b/Sources/GrammaGem/Grammar/GrammarEngine.swift index 38282a7..d559fc3 100644 --- a/Sources/GrammaGem/Grammar/GrammarEngine.swift +++ b/Sources/GrammaGem/Grammar/GrammarEngine.swift @@ -19,9 +19,15 @@ protocol GrammarEngine: AnyObject { extension GrammarEngine { /// Default correction: apply suggestions right-to-left so offsets stay valid. + /// + /// No-op flags (where the replacement equals the original — e.g. a grammar + /// issue Harper can describe but not auto-fix) are skipped, so "Fix all" / + /// the in-place hotkey only ever apply real, text-changing corrections and + /// never silently rewrite a span to itself. func correct(_ text: String) -> String { let ns = NSMutableString(string: text) for s in check(text).sorted(by: { $0.location > $1.location }) { + guard s.replacement != s.original else { continue } guard s.location + s.length <= ns.length else { continue } ns.replaceCharacters(in: s.range, with: s.replacement) } diff --git a/Sources/GrammaGem/Grammar/HarperEngine.swift b/Sources/GrammaGem/Grammar/HarperEngine.swift index a87af38..139060e 100644 --- a/Sources/GrammaGem/Grammar/HarperEngine.swift +++ b/Sources/GrammaGem/Grammar/HarperEngine.swift @@ -1,75 +1,83 @@ import Foundation +import CHarper -/// STUB standing in for the real Harper core. +/// Layer 1 — the real **Harper** grammar core (Apache-2.0), embedded via a Rust +/// C-FFI static lib (`harper-ffi/`, harper-core 2.5.0). Fully offline, +/// deterministic, and fast — real subject-verb agreement, verb forms, +/// punctuation, repetition, capitalization and spelling, not just a spell check. /// -/// TODO(real-integration): replace the rule set below with calls into the Harper -/// Rust crate over C-FFI (`harper_check(text) -> spans`). This stub implements a -/// handful of Harper-style deterministic rules so the system loop, live -/// underlines, and tests have something real to exercise. It runs in well under -/// 10ms and is fully offline — matching Harper's performance profile. +/// `harper_check` returns a JSON array of spans with **char (Unicode scalar)** +/// offsets; we map those onto UTF-16 `NSRange` offsets so they compose with the +/// rest of the app (AX ranges, `NSMutableString`). final class HarperEngine: GrammarEngine { var ignoreList: Set = [] func check(_ text: String) -> [Suggestion] { - var out: [Suggestion] = [] - let ns = text as NSString + guard !text.isEmpty else { return [] } - // Rule 1 — repeated word ("the the" -> "the"). - out += matches(in: text, pattern: #"\b(\w+)\s+\1\b"#) { match in - let full = ns.substring(with: match.range) - let firstWord = ns.substring(with: match.range(at: 1)) - guard !ignoreList.contains(firstWord.lowercased()) else { return nil } - return Suggestion( - location: match.range.location, length: match.range.length, - original: full, replacement: firstWord, - kind: .repetition, message: "Repeated word") + // Call into Rust. The returned C string is heap-allocated by Harper and + // must be freed with harper_free (it outlives the withCString buffer). + guard let raw = text.withCString({ harper_check($0) }) else { return [] } + defer { harper_free(raw) } + + let json = String(cString: raw) + guard let data = json.data(using: .utf8), + let lints = try? JSONDecoder().decode([HarperLint].self, from: data) + else { return [] } + + // Harper can emit several lints over the SAME span (e.g. two phrasings of + // "checkin" -> "check in"). Keep the first (highest-priority) per span so + // the right-to-left bulk apply in `correct()` never double-writes a range. + var kept: [Suggestion] = [] + for lint in lints { + guard lint.len > 0 || !lint.replacement.isEmpty else { continue } + guard let range = Self.utf16Range(scalarStart: lint.start, scalarLen: lint.len, in: text) + else { continue } + let original = (text as NSString).substring(with: range) + if !original.isEmpty, ignoreList.contains(original.lowercased()) { continue } + if kept.contains(where: { NSIntersectionRange($0.range, range).length > 0 }) { continue } + kept.append(Suggestion( + location: range.location, length: range.length, + original: original, replacement: lint.replacement, + kind: GrammarKind(harperKind: lint.kind), message: lint.message)) } - - // Rule 2 — lowercase standalone "i" -> "I". - out += matches(in: text, pattern: #"(?<=\s|^)i(?=\s|$|')"#) { match in - Suggestion( - location: match.range.location, length: match.range.length, - original: "i", replacement: "I", - kind: .capitalization, message: "Capitalize the pronoun “I”") - } - - // Rule 3 — a few common confusions / typos. - let confusions: [(String, String, GrammarKind, String)] = [ - (#"\btheir\b(?=\s+(any|are|is|was|were)\b)"#, "there", .grammar, "Did you mean “there”?"), - (#"\bteh\b"#, "the", .spelling, "Spelling"), - (#"\brecieve\b"#, "receive", .spelling, "Spelling (i before e)"), - (#"\bcheckin\b"#, "check in", .phrasing, "“check in” is two words"), - (#"\blmk\b"#, "let me know", .phrasing, "Expand abbreviation"), - (#"(?<=\s|^)u(?=\s|$)"#, "you", .phrasing, "Expand “u”"), - ] - for (pattern, replacement, kind, message) in confusions { - out += matches(in: text, pattern: pattern) { match in - let original = ns.substring(with: match.range) - guard !ignoreList.contains(original.lowercased()) else { return nil } - return Suggestion( - location: match.range.location, length: match.range.length, - original: original, replacement: replacement, - kind: kind, message: message) - } - } - - // Rule 4 — sentence should start uppercase (very light heuristic). - // (Left to the real Harper integration; intentionally omitted to avoid - // false positives in this stub.) - - return out.sorted { $0.location < $1.location } + return kept.sorted { $0.location < $1.location } } - // MARK: - Regex helper + // MARK: - FFI decoding - private func matches( - in text: String, pattern: String, - _ make: (NSTextCheckingResult) -> Suggestion? - ) -> [Suggestion] { - guard let re = try? NSRegularExpression(pattern: pattern, options: [.caseInsensitive]) else { - return [] - } - let full = NSRange(text.startIndex..., in: text) - return re.matches(in: text, range: full).compactMap(make) + private struct HarperLint: Decodable { + let start: Int + let len: Int + let replacement: String + let message: String + let kind: String + } + + /// Map a Harper char-span (Unicode scalar offsets, end-exclusive) onto a + /// UTF-16 `NSRange`. Scalar boundaries are always UTF-16 boundaries, so the + /// conversion is exact. + static func utf16Range(scalarStart: Int, scalarLen: Int, in text: String) -> NSRange? { + let scalars = text.unicodeScalars + guard let s = scalars.index(scalars.startIndex, offsetBy: scalarStart, limitedBy: scalars.endIndex), + let e = scalars.index(s, offsetBy: scalarLen, limitedBy: scalars.endIndex) + else { return nil } + let location = text.utf16.distance(from: text.utf16.startIndex, to: s) + let length = text.utf16.distance(from: s, to: e) + return NSRange(location: location, length: length) + } +} + +extension GrammarKind { + /// Map Harper's `kind` string (see harper.h) onto our category enum. + init(harperKind kind: String) { + switch kind { + case "spelling": self = .spelling + case "punctuation": self = .punctuation + case "repetition": self = .repetition + case "capitalization": self = .capitalization + case "phrasing": self = .phrasing + default: self = .grammar + } } } diff --git a/Sources/GrammaGem/Grammar/SystemGrammarEngine.swift b/Sources/GrammaGem/Grammar/SystemGrammarEngine.swift index 2854b78..7bd85b5 100644 --- a/Sources/GrammaGem/Grammar/SystemGrammarEngine.swift +++ b/Sources/GrammaGem/Grammar/SystemGrammarEngine.swift @@ -1,86 +1,83 @@ import Foundation import AppKit -/// Real, on-device grammar + spelling using macOS's built-in `NSSpellChecker` -/// (the same engine TextEdit/Mail use). No network, no model — fully local, -/// matching the privacy promise. Augmented with a few deterministic Harper-style -/// rules (repeated words, lowercase "i", common expansions) the system checker -/// doesn't surface. +/// Layer 1 orchestrator. The real **Harper** core is the primary engine +/// (grammar, punctuation, repetition, capitalization, spelling); macOS's +/// `NSSpellChecker` is layered on top purely for *extra spelling coverage* from +/// its large system dictionary. +/// +/// Two correctness rules make the combination trustworthy: +/// 1. **Harper wins on overlap** — a system spelling guess is dropped if Harper +/// already flagged the same span (Harper's fixes carry correct casing + a +/// real explanation). +/// 2. **Case-preserving** — a system spelling replacement is matched to the +/// original token's casing, so a mid-sentence word is never spuriously +/// capitalized (the historical `problemm` -> `Problem` bug). Genuine +/// sentence-start capitalization is surfaced separately by Harper. final class SystemGrammarEngine: GrammarEngine { - var ignoreList: Set = [] + var ignoreList: Set = [] { + didSet { harper.ignoreList = ignoreList } + } private let checker = NSSpellChecker.shared private let tag = NSSpellChecker.uniqueSpellDocumentTag() - private let extras = HarperEngine() + private let harper = HarperEngine() func check(_ text: String) -> [Suggestion] { guard text.count >= 2 else { return [] } - return onMain { self.checkOnMain(text) } + var out = harper.check(text) + + // Supplement with NSSpellChecker spelling only (Harper owns grammar), + // de-duped against Harper spans and case-matched to the original token. + let spelling = onMain { self.spellingSupplement(text) } + for s in spelling where !out.contains(where: { overlaps($0.range, s.range) }) { + out.append(s) + } + return out.sorted { $0.location < $1.location } } - private func checkOnMain(_ text: String) -> [Suggestion] { + private func spellingSupplement(_ text: String) -> [Suggestion] { let ns = text as NSString let full = NSRange(location: 0, length: ns.length) let language = checker.language() - var out: [Suggestion] = [] - - let types = NSTextCheckingResult.CheckingType([.spelling, .grammar]).rawValue let results = checker.check( - text, range: full, types: types, options: nil, - inSpellDocumentWithTag: tag, orthography: nil, wordCount: nil) + text, range: full, types: NSTextCheckingResult.CheckingType.spelling.rawValue, + options: nil, inSpellDocumentWithTag: tag, orthography: nil, wordCount: nil) - for r in results { - switch r.resultType { - case .spelling: - let word = ns.substring(with: r.range) - if ignoreList.contains(word.lowercased()) { continue } - let fix = checker.correction( - forWordRange: r.range, in: text, language: language, inSpellDocumentWithTag: tag) - ?? checker.guesses( - forWordRange: r.range, in: text, language: language, - inSpellDocumentWithTag: tag)?.first - out.append(Suggestion( - location: r.range.location, length: r.range.length, - original: word, replacement: fix ?? word, - kind: .spelling, message: "Possible spelling mistake")) - - case .grammar: - let details = r.grammarDetails ?? [] - if details.isEmpty { - let phrase = ns.substring(with: r.range) - out.append(Suggestion( - location: r.range.location, length: r.range.length, - original: phrase, replacement: phrase, - kind: .grammar, message: "Grammar issue")) - } else { - for d in details { - var loc = r.range.location, len = r.range.length - if let rv = d[NSGrammarRange] as? NSValue { - let sub = rv.rangeValue - loc = r.range.location + sub.location - len = sub.length - } - guard len > 0, loc + len <= ns.length else { continue } - let phrase = ns.substring(with: NSRange(location: loc, length: len)) - let message = (d[NSGrammarUserDescription] as? String) ?? "Grammar issue" - let corrections = (d[NSGrammarCorrections] as? [String]) ?? [] - out.append(Suggestion( - location: loc, length: len, - original: phrase, replacement: corrections.first ?? phrase, - kind: .grammar, message: message)) - } - } - default: - break - } + var out: [Suggestion] = [] + for r in results where r.resultType == .spelling { + let word = ns.substring(with: r.range) + if ignoreList.contains(word.lowercased()) { continue } + guard let raw = checker.correction( + forWordRange: r.range, in: text, language: language, inSpellDocumentWithTag: tag) + ?? checker.guesses( + forWordRange: r.range, in: text, language: language, + inSpellDocumentWithTag: tag)?.first + else { continue } + let fix = Self.matchingCase(of: word, in: raw) + guard fix != word else { continue } // never emit a no-op + out.append(Suggestion( + location: r.range.location, length: r.range.length, + original: word, replacement: fix, + kind: .spelling, message: "Possible spelling mistake")) } + return out + } - // Deterministic extras, skipping anything overlapping a system result. - extras.ignoreList = ignoreList - for h in extras.check(text) where !out.contains(where: { overlaps($0.range, h.range) }) { - out.append(h) + /// Re-case `replacement` to follow `original`'s casing. + static func matchingCase(of original: String, in replacement: String) -> String { + guard let o = original.first, let r = replacement.first else { return replacement } + // ALL-CAPS original (with at least one cased letter) -> upper the whole thing. + if original.count > 1, original == original.uppercased(), original != original.lowercased() { + return replacement.uppercased() } - return out.sorted { $0.location < $1.location } + if o.isLowercase, r.isUppercase { + return r.lowercased() + replacement.dropFirst() + } + if o.isUppercase, r.isLowercase { + return r.uppercased() + replacement.dropFirst() + } + return replacement } private func overlaps(_ a: NSRange, _ b: NSRange) -> Bool { diff --git a/harper-ffi/Cargo.lock b/harper-ffi/Cargo.lock new file mode 100644 index 0000000..0d8ebd8 --- /dev/null +++ b/harper-ffi/Cargo.lock @@ -0,0 +1,5617 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 4 + +[[package]] +name = "adler2" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "320119579fcad9c21884f5c4861d16174d0e06250625266f50fe6898340abefa" + +[[package]] +name = "ahash" +version = "0.8.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5a15f179cd60c4584b8a8c596927aadc462e27f2ca70c04e0071964a73ba7a75" +dependencies = [ + "cfg-if", + "once_cell", + "version_check", + "zerocopy", +] + +[[package]] +name = "aho-corasick" +version = "1.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ddd31a130427c27518df266943a5308ed92d4b226cc639f5a8f1002816174301" +dependencies = [ + "memchr", +] + +[[package]] +name = "allocator-api2" +version = "0.2.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "683d7910e743518b0e34f1186f92494becacb047c7b6bf616c96772180fef923" + +[[package]] +name = "ammonia" +version = "4.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "17e913097e1a2124b46746c980134e8c954bc17a6a59bb3fde96f088d126dde6" +dependencies = [ + "cssparser", + "html5ever", + "maplit", + "tendril", + "url", +] + +[[package]] +name = "android_system_properties" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "819e7219dbd41043ac279b19830f2efc897156490d7fd6ea916720117ee66311" +dependencies = [ + "libc", +] + +[[package]] +name = "anstream" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "824a212faf96e9acacdbd09febd34438f8f711fb84e09a8916013cd7815ca28d" +dependencies = [ + "anstyle", + "anstyle-parse", + "anstyle-query", + "anstyle-wincon", + "colorchoice", + "is_terminal_polyfill", + "utf8parse", +] + +[[package]] +name = "anstyle" +version = "1.0.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "940b3a0ca603d1eade50a4846a2afffd5ef57a9feac2c0e2ec2e14f9ead76000" + +[[package]] +name = "anstyle-parse" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "52ce7f38b242319f7cabaa6813055467063ecdc9d355bbb4ce0c68908cd8130e" +dependencies = [ + "utf8parse", +] + +[[package]] +name = "anstyle-query" +version = "1.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "40c48f72fd53cd289104fc64099abca73db4166ad86ea0b4341abe65af83dadc" +dependencies = [ + "windows-sys 0.61.2", +] + +[[package]] +name = "anstyle-wincon" +version = "3.0.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "291e6a250ff86cd4a820112fb8898808a366d8f9f58ce16d1f538353ad55747d" +dependencies = [ + "anstyle", + "once_cell_polyfill", + "windows-sys 0.61.2", +] + +[[package]] +name = "anyhow" +version = "1.0.102" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f202df86484c868dbad7eaa557ef785d5c66295e41b460ef922eca0723b842c" + +[[package]] +name = "arrayvec" +version = "0.7.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7c02d123df017efcdfbd739ef81735b36c5ba83ec3c59c80a9d7ecc718f92e50" + +[[package]] +name = "ash" +version = "0.38.0+1.3.281" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0bb44936d800fea8f016d7f2311c6a4f97aebd5dc86f09906139ec848cf3a46f" +dependencies = [ + "libloading", +] + +[[package]] +name = "async-channel" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "924ed96dd52d1b75e9c1a3e6275715fd320f5f9439fb5a4a11fa51f4221158d2" +dependencies = [ + "concurrent-queue", + "event-listener-strategy", + "futures-core", + "pin-project-lite", +] + +[[package]] +name = "atomic-waker" +version = "1.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1505bd5d3d116872e7271a6d4e16d81d0c8570876c8de68093a09ac269d8aac0" + +[[package]] +name = "atomic_float" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "628d228f918ac3b82fe590352cc719d30664a0c13ca3a60266fe02c7132d480a" + +[[package]] +name = "autocfg" +version = "1.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f2032f911046de80f0a198e0901378627c33f59ea0ac00e363d481118bd70a53" + +[[package]] +name = "base64" +version = "0.22.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" + +[[package]] +name = "bincode" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "36eaf5d7b090263e8150820482d5d93cd964a81e4019913c972f4edcc6edb740" +dependencies = [ + "serde", + "unty", +] + +[[package]] +name = "bindgen" +version = "0.71.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5f58bf3d7db68cfbac37cfc485a8d711e87e064c3d0fe0435b92f7a407f9d6b3" +dependencies = [ + "bitflags", + "cexpr", + "clang-sys", + "itertools 0.13.0", + "log", + "prettyplease", + "proc-macro2", + "quote", + "regex", + "rustc-hash 2.1.2", + "shlex 1.3.0", + "syn", +] + +[[package]] +name = "bit-set" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "08807e080ed7f9d5433fa9b275196cfc35414f66a0c79d864dc51a0d825231a3" +dependencies = [ + "bit-vec", +] + +[[package]] +name = "bit-vec" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5e764a1d40d510daf35e07be9eb06e75770908c27d411ee6c92109c9840eaaf7" + +[[package]] +name = "bitflags" +version = "2.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b4388bee8683e3d04af747c73422af53102d2bd24d9eadb6cbc100baef4b43f8" +dependencies = [ + "serde_core", +] + +[[package]] +name = "blanket" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "56791e4bd64c99fc361e01008f45c984baa93f12a0957d1b3c51dd2c6baab453" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "block" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0d8c1fef690941d3e7788d328517591fecc684c084084702d6ff1641e993699a" + +[[package]] +name = "block-buffer" +version = "0.10.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71" +dependencies = [ + "generic-array", +] + +[[package]] +name = "bumpalo" +version = "3.20.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72f5acc6cb2ba439de613abc23857ec3d78374d8ed5ac84e9d11336e87da8649" + +[[package]] +name = "burn" +version = "0.19.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0291ea5c68786545e239a02f63331cfe39da7485164ae05197d5be6f148d0557" +dependencies = [ + "burn-autodiff", + "burn-candle", + "burn-core", + "burn-cuda", + "burn-ndarray", + "burn-nn", + "burn-optim", + "burn-rocm", + "burn-router", + "burn-store", + "burn-wgpu", +] + +[[package]] +name = "burn-autodiff" +version = "0.19.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "917423a74bf4d39f17a6799089869648e3d2b6ac89d93901aab4aeb9a7f82138" +dependencies = [ + "burn-common", + "burn-tensor", + "derive-new", + "hashbrown 0.15.5", + "log", + "num-traits", + "portable-atomic", + "spin", +] + +[[package]] +name = "burn-candle" +version = "0.19.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2891811d41ae30b5f1f660e7615b757b2cb4128af5e311b213656de3875e4acb" +dependencies = [ + "burn-common", + "burn-tensor", + "candle-core", + "derive-new", + "half", +] + +[[package]] +name = "burn-common" +version = "0.19.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5eb445304e4f91f8633d23c9a5258cd93639d13ce2ee47d4821fd519b683bf02" +dependencies = [ + "cubecl-common", + "rayon", + "serde", +] + +[[package]] +name = "burn-core" +version = "0.19.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "20c93e754864080a8c27b9a47e3b6f7d79013cf82c9ce00ed57c9ba51a3e34c5" +dependencies = [ + "ahash", + "bincode", + "burn-common", + "burn-derive", + "burn-tensor", + "data-encoding", + "derive-new", + "flate2", + "half", + "hashbrown 0.15.5", + "log", + "num-traits", + "portable-atomic", + "portable-atomic-util", + "rand 0.9.4", + "regex", + "rmp-serde", + "serde", + "serde_json", + "spin", + "uuid", +] + +[[package]] +name = "burn-cubecl" +version = "0.19.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0dd16308b7b0291c77f2d7acf428bc8254ec3db88a430a26cf3d3b0b63ae2d46" +dependencies = [ + "burn-common", + "burn-cubecl-fusion", + "burn-fusion", + "burn-ir", + "burn-tensor", + "bytemuck", + "cubecl", + "cubecl-quant", + "derive-new", + "futures-lite", + "half", + "hashbrown 0.15.5", + "log", + "num-traits", + "rand 0.9.4", + "serde", + "spin", + "text_placeholder", +] + +[[package]] +name = "burn-cubecl-fusion" +version = "0.19.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cc21cf88201dfbf242cadb638a0cc924010727fc37d6a719f7e10548b339c63a" +dependencies = [ + "burn-common", + "burn-fusion", + "burn-ir", + "burn-tensor", + "cubecl", + "cubecl-quant", + "derive-new", + "half", + "serde", +] + +[[package]] +name = "burn-cuda" +version = "0.19.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e104dcf07eac70c7b5864b51d792df3360b11b00febb60543b4283bb414bb61" +dependencies = [ + "burn-cubecl", + "burn-tensor", + "bytemuck", + "cubecl", + "derive-new", + "half", + "log", +] + +[[package]] +name = "burn-derive" +version = "0.19.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3bcf49261de086b8206de6c8962d2adf23feb476119a18e384f5b2c9af07c0cf" +dependencies = [ + "derive-new", + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "burn-fusion" +version = "0.19.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "662bf2679c04be34a0c3f1b11f77f6ff49456af1620d1eca311bc2562bbb56c9" +dependencies = [ + "burn-common", + "burn-ir", + "burn-tensor", + "derive-new", + "half", + "hashbrown 0.15.5", + "log", + "serde", + "spin", +] + +[[package]] +name = "burn-ir" +version = "0.19.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9161239d5691c4ab6f470f2c65aaec5c0a7c1f0b0da390700bcd59f5a77d1d7b" +dependencies = [ + "burn-tensor", + "hashbrown 0.15.5", + "portable-atomic-util", + "serde", +] + +[[package]] +name = "burn-ndarray" +version = "0.19.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b78bcf4a3508043342f918e796dc79108b5f3252398403eb73952847e7683374" +dependencies = [ + "atomic_float", + "burn-autodiff", + "burn-common", + "burn-ir", + "burn-tensor", + "const-random", + "derive-new", + "libm", + "macerator", + "matrixmultiply", + "ndarray", + "num-traits", + "paste", + "portable-atomic-util", + "rand 0.9.4", + "spin", +] + +[[package]] +name = "burn-nn" +version = "0.19.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc7829c87c4dd6c7929b50fd981e7e8d1b77414323da30ce2067a3e8b7ea422b" +dependencies = [ + "burn-core", + "num-traits", +] + +[[package]] +name = "burn-optim" +version = "0.19.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "31758c02e50247f12457fca1905ed8684ac1b1c5292e10cbbfffb9fa0048d4bd" +dependencies = [ + "burn-core", + "derive-new", + "hashbrown 0.15.5", + "log", + "num-traits", + "serde", +] + +[[package]] +name = "burn-rocm" +version = "0.19.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5e1ceb87b6e7349b42d7995477c9a69d0e6c458c64eafa10af3b8b9070f260aa" +dependencies = [ + "burn-cubecl", + "burn-tensor", + "bytemuck", + "cubecl", + "derive-new", + "half", + "log", +] + +[[package]] +name = "burn-router" +version = "0.19.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "45f40403c500b5df380bee47aa0f23032350bdfde5402812d6fcec4d6ff6fbad" +dependencies = [ + "burn-common", + "burn-ir", + "burn-tensor", + "hashbrown 0.15.5", + "log", + "spin", +] + +[[package]] +name = "burn-store" +version = "0.19.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0a2a163486242fcb0c6e2cb89c5a803ab8588673652bb46ecd7af6378d06152f" +dependencies = [ + "burn-core", + "burn-nn", + "burn-tensor", + "byteorder", + "half", + "hashbrown 0.15.5", + "memmap2", + "regex", + "safetensors 0.6.2", +] + +[[package]] +name = "burn-tensor" +version = "0.19.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df8861f7c21d3b07a2b19d028f6eb8903990949708b2ec825559b5200786877c" +dependencies = [ + "burn-common", + "bytemuck", + "colored", + "cubecl", + "cubecl-quant", + "derive-new", + "half", + "hashbrown 0.15.5", + "num-traits", + "rand 0.9.4", + "rand_distr", + "serde", + "serde_bytes", +] + +[[package]] +name = "burn-wgpu" +version = "0.19.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c17aeaa2eadaa4831a64672b99f62ffcdf4874fe4757080633d8a6c4452e2b38" +dependencies = [ + "burn-cubecl", + "burn-tensor", + "cubecl", +] + +[[package]] +name = "bytemuck" +version = "1.25.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c8efb64bd706a16a1bdde310ae86b351e4d21550d98d056f22f8a7f7a2183fec" +dependencies = [ + "bytemuck_derive", +] + +[[package]] +name = "bytemuck_derive" +version = "1.10.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f9abbd1bc6865053c427f7198e6af43bfdedc55ab791faed4fbd361d789575ff" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "byteorder" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" + +[[package]] +name = "bytes" +version = "1.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e748733b7cbc798e1434b6ac524f0c1ff2ab456fe201501e6497c8417a4fc33" + +[[package]] +name = "cached" +version = "0.59.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "53b6f5d101f0f6322c8646a45b7c581a673e476329040d97565815c2461dd0c4" +dependencies = [ + "ahash", + "cached_proc_macro", + "cached_proc_macro_types", + "hashbrown 0.16.1", + "once_cell", + "parking_lot", + "thiserror 2.0.18", + "web-time", +] + +[[package]] +name = "cached_proc_macro" +version = "0.27.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ebcf9c75f17a17d55d11afc98e46167d4790a263f428891b8705ab2f793eca3" +dependencies = [ + "darling 0.20.11", + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "cached_proc_macro_types" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ade8366b8bd5ba243f0a58f036cc0ca8a2f069cff1a2351ef1cac6b083e16fc0" + +[[package]] +name = "candle-core" +version = "0.9.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c15b675b80d994b2eadb20a4bbe434eabeb454eac3ee5e2b4cf6f147ee9be091" +dependencies = [ + "byteorder", + "float8 0.6.1", + "gemm", + "half", + "libm", + "memmap2", + "num-traits", + "num_cpus", + "rand 0.9.4", + "rand_distr", + "rayon", + "safetensors 0.7.0", + "thiserror 2.0.18", + "yoke", + "zip 7.2.0", +] + +[[package]] +name = "caseless" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b6fd507454086c8edfd769ca6ada439193cdb209c7681712ef6275cccbfe5d8" +dependencies = [ + "unicode-normalization", +] + +[[package]] +name = "cc" +version = "1.2.64" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dad887fd958be91b5098c0248def011f4523ab786cd411be668777e55063501f" +dependencies = [ + "find-msvc-tools", + "jobserver", + "libc", + "shlex 2.0.1", +] + +[[package]] +name = "cexpr" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6fac387a98bb7c37292057cffc56d62ecb629900026402633ae9160df93a8766" +dependencies = [ + "nom", +] + +[[package]] +name = "cfg-if" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9330f8b2ff13f34540b44e946ef35111825727b38d33286ef986142615121801" + +[[package]] +name = "cfg_aliases" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "613afe47fcd5fac7ccf1db93babcb082c5994d996f20b8b159f2ad1658eb5724" + +[[package]] +name = "clang-sys" +version = "1.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b023947811758c97c59bf9d1c188fd619ad4718dcaa767947df1cadb14f39f4" +dependencies = [ + "glob", + "libc", + "libloading", +] + +[[package]] +name = "clap" +version = "4.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1ddb117e43bbf7dacf0a4190fef4d345b9bad68dfc649cb349e7d17d28428e51" +dependencies = [ + "clap_builder", + "clap_derive", +] + +[[package]] +name = "clap_builder" +version = "4.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "714a53001bf66416adb0e2ef5ac857140e7dc3a0c48fb28b2f10762fc4b5069f" +dependencies = [ + "anstream", + "anstyle", + "clap_lex", + "strsim", +] + +[[package]] +name = "clap_derive" +version = "4.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f2ce8604710f6733aa641a2b3731eaa1e8b3d9973d5e3565da11800813f997a9" +dependencies = [ + "heck", + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "clap_lex" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c8d4a3bb8b1e0c1050499d1815f5ab16d04f0959b233085fb31653fbfc9d98f9" + +[[package]] +name = "codespan-reporting" +version = "0.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fe6d2e5af09e8c8ad56c969f2157a3d4238cebc7c55f0a517728c38f7b200f81" +dependencies = [ + "serde", + "termcolor", + "unicode-width", +] + +[[package]] +name = "colorchoice" +version = "1.0.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d07550c9036bf2ae0c684c4297d503f838287c83c53686d05370d0e139ae570" + +[[package]] +name = "colored" +version = "3.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "faf9468729b8cbcea668e36183cb69d317348c2e08e994829fb56ebfdfbaac34" +dependencies = [ + "windows-sys 0.61.2", +] + +[[package]] +name = "comrak" +version = "0.39.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2fefab951771fc3beeed0773ce66a4f7b706273fc6c4c95b08dd1615744abcf5" +dependencies = [ + "caseless", + "entities", + "memchr", + "slug", + "typed-arena", + "unicode_categories", +] + +[[package]] +name = "concurrent-queue" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4ca0197aee26d1ae37445ee532fefce43251d24cc7c166799f4d46817f1d3973" +dependencies = [ + "crossbeam-utils", +] + +[[package]] +name = "const-random" +version = "0.1.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "87e00182fe74b066627d63b85fd550ac2998d4b0bd86bfed477a0ae4c7c71359" +dependencies = [ + "const-random-macro", +] + +[[package]] +name = "const-random-macro" +version = "0.1.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f9d839f2a20b0aee515dc581a6172f2321f96cab76c1a38a4c584a194955390e" +dependencies = [ + "getrandom 0.2.17", + "once_cell", + "tiny-keccak", +] + +[[package]] +name = "constcat" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "136d3e02915a2cea4d74caa8681e2d44b1c3254bdbf17d11d41d587ff858832c" + +[[package]] +name = "convert_case" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "baaaa0ecca5b51987b9423ccdc971514dd8b0bb7b4060b983d3664dad3f1f89f" +dependencies = [ + "unicode-segmentation", +] + +[[package]] +name = "convert_case" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "633458d4ef8c78b72454de2d54fd6ab2e60f9e02be22f3c6104cdc8a4e0fceb9" +dependencies = [ + "unicode-segmentation", +] + +[[package]] +name = "core-foundation" +version = "0.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b2a6cd9ae233e7f62ba4e9353e81a88df7fc8a5987b8d445b4d90c879bd156f6" +dependencies = [ + "core-foundation-sys", + "libc", +] + +[[package]] +name = "core-foundation-sys" +version = "0.8.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b" + +[[package]] +name = "core-graphics-types" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3d44a101f213f6c4cdc1853d4b78aef6db6bdfa3468798cc1d9912f4735013eb" +dependencies = [ + "bitflags", + "core-foundation", + "libc", +] + +[[package]] +name = "cpufeatures" +version = "0.2.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "59ed5838eebb26a2bb2e58f6d5b5316989ae9d08bab10e0e6d103e656d1b0280" +dependencies = [ + "libc", +] + +[[package]] +name = "crc32fast" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9481c1c90cbf2ac953f07c8d4a58aa3945c425b7185c9154d67a65e4230da511" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "critical-section" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "790eea4361631c5e7d22598ecd5723ff611904e3344ce8720784c93e3d83d40b" + +[[package]] +name = "crossbeam-deque" +version = "0.8.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9dd111b7b7f7d55b72c0a6ae361660ee5853c9af73f70c3c2ef6858b950e2e51" +dependencies = [ + "crossbeam-epoch", + "crossbeam-utils", +] + +[[package]] +name = "crossbeam-epoch" +version = "0.9.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5b82ac4a3c2ca9c3460964f020e1402edd5753411d7737aa39c3714ad1b5420e" +dependencies = [ + "crossbeam-utils", +] + +[[package]] +name = "crossbeam-utils" +version = "0.8.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d0a5c400df2834b80a4c3327b3aad3a4c4cd4de0629063962b03235697506a28" + +[[package]] +name = "crunchy" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "460fbee9c2c2f33933d720630a6a0bac33ba7053db5344fac858d4b8952d77d5" + +[[package]] +name = "crypto-common" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "78c8292055d1c1df0cce5d180393dc8cce0abec0a7102adb6c7b1eef6016d60a" +dependencies = [ + "generic-array", + "typenum", +] + +[[package]] +name = "cssparser" +version = "0.35.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4e901edd733a1472f944a45116df3f846f54d37e67e68640ac8bb69689aca2aa" +dependencies = [ + "cssparser-macros", + "dtoa-short", + "itoa", + "phf", + "smallvec", +] + +[[package]] +name = "cssparser-macros" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "13b588ba4ac1a99f7f2964d24b3d896ddc6bf847ee3855dbd4366f058cfcd331" +dependencies = [ + "quote", + "syn", +] + +[[package]] +name = "cubecl" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b8b7c74ecaca9356c9ae79d0ebf1db04f02bd98be09eea61f51d73373dffe758" +dependencies = [ + "cubecl-convolution", + "cubecl-core", + "cubecl-cpu", + "cubecl-cuda", + "cubecl-hip", + "cubecl-matmul", + "cubecl-random", + "cubecl-reduce", + "cubecl-runtime", + "cubecl-std", + "cubecl-wgpu", + "half", +] + +[[package]] +name = "cubecl-common" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4556981155bffc057a8effcd4549b52b51df3e9edec43af6ccae2dd03fc8fbff" +dependencies = [ + "bytemuck", + "cfg-if", + "cfg_aliases", + "derive-new", + "derive_more 2.1.1", + "dirs", + "embassy-futures", + "embassy-time", + "float4", + "float8 0.4.2", + "futures-lite", + "half", + "hashbrown 0.15.5", + "log", + "num-traits", + "parking_lot", + "portable-atomic", + "portable-atomic-util", + "rand 0.9.4", + "sanitize-filename", + "serde", + "serde_bytes", + "serde_json", + "spin", + "wasm-bindgen-futures", + "web-time", +] + +[[package]] +name = "cubecl-convolution" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "27c624ec400b7203673bf2db86d7ff30d1384839d497d2dd029c19b1b7371e0d" +dependencies = [ + "bytemuck", + "cubecl-common", + "cubecl-core", + "cubecl-matmul", + "cubecl-random", + "cubecl-reduce", + "cubecl-runtime", + "cubecl-std", + "half", + "pretty_assertions", + "serde", +] + +[[package]] +name = "cubecl-core" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ffc10af538ee74535cda260e581f5a177c243803dd30b698934a515f0114b55" +dependencies = [ + "bitflags", + "bytemuck", + "cubecl-common", + "cubecl-ir", + "cubecl-macros", + "cubecl-runtime", + "derive-new", + "derive_more 2.1.1", + "enumset", + "half", + "hashbrown 0.15.5", + "log", + "num-traits", + "paste", + "serde", + "serde_json", + "variadics_please", +] + +[[package]] +name = "cubecl-cpp" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d630e4d10cdd3af268ac753914ca79b48f01d1e36c5b5039970a817acc925fea" +dependencies = [ + "bytemuck", + "cubecl-common", + "cubecl-core", + "cubecl-opt", + "cubecl-runtime", + "derive-new", + "half", + "itertools 0.14.0", + "log", +] + +[[package]] +name = "cubecl-cpu" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ac1693555277d74152afb61a23e30d1f17d72cebd317a648faf50a8e69380f08" +dependencies = [ + "bytemuck", + "cubecl-common", + "cubecl-convolution", + "cubecl-core", + "cubecl-matmul", + "cubecl-opt", + "cubecl-reduce", + "cubecl-runtime", + "cubecl-std", + "derive-new", + "half", + "log", + "serde", + "sysinfo", + "tracel-llvm", + "tracel-llvm-bundler", +] + +[[package]] +name = "cubecl-cuda" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "67215fcd552a9e8bc68494a71cf2979f2e2bbcbda60f0695f56f86705b89ed5f" +dependencies = [ + "bytemuck", + "cubecl-common", + "cubecl-core", + "cubecl-cpp", + "cubecl-runtime", + "cudarc", + "derive-new", + "half", + "log", + "serde", +] + +[[package]] +name = "cubecl-hip" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d5e2e6a257f702fb2eb6f24e640e228a94695e4a4c73a4c549578cbb02ad4ec5" +dependencies = [ + "bytemuck", + "cubecl-common", + "cubecl-core", + "cubecl-cpp", + "cubecl-hip-sys", + "cubecl-quant", + "cubecl-runtime", + "derive-new", + "half", + "log", + "paste", + "serde", +] + +[[package]] +name = "cubecl-hip-sys" +version = "7.2.5321100" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "58887c6d217859c2261a868a3a6b66aa8f44ea2f4bfa51d0dbe4dcb0d1f5768d" +dependencies = [ + "libc", + "regex", +] + +[[package]] +name = "cubecl-ir" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bf5d3aa7857e6aee1622aef128d6ad8d9289ed57362b4e65d10cc182aafc585f" +dependencies = [ + "cubecl-common", + "cubecl-macros-internal", + "derive-new", + "derive_more 2.1.1", + "float-ord", + "fnv", + "half", + "hashbrown 0.15.5", + "num-traits", + "portable-atomic", + "serde", + "variadics_please", +] + +[[package]] +name = "cubecl-macros" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5200fb619be424749901e3c6e8e66ae71146c8f83636a74f171bd980cba379d7" +dependencies = [ + "cubecl-common", + "darling 0.21.3", + "derive-new", + "ident_case", + "prettyplease", + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "cubecl-macros-internal" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8a1b673f303396fba18df83368aa4eced474584f1bca34852dccc42bd4ff050c" +dependencies = [ + "darling 0.21.3", + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "cubecl-matmul" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d1cf0a00609a249d5357c27cafea477f35218579db2ab00582d8d5800be4a5a3" +dependencies = [ + "bytemuck", + "cubecl-common", + "cubecl-core", + "cubecl-random", + "cubecl-reduce", + "cubecl-runtime", + "cubecl-std", + "half", + "pretty_assertions", + "serde", +] + +[[package]] +name = "cubecl-opt" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "870ca4b52f9eebd358c9b360b89cdc9f82bde05682db63f0e90c666b3c85a04d" +dependencies = [ + "cubecl-common", + "cubecl-core", + "cubecl-ir", + "float-ord", + "log", + "num", + "petgraph", + "smallvec", + "stable-vec", + "type-map", +] + +[[package]] +name = "cubecl-quant" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9be3e1202c219078d85dbad7f30d1195fe4f9d42cbfad2c94ab0ea1a6d9f01f6" +dependencies = [ + "cubecl-common", + "cubecl-core", + "cubecl-runtime", + "cubecl-std", + "half", + "serde", +] + +[[package]] +name = "cubecl-random" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9a293a05caa68663675823bab66205bca094a21a2c0f6686ad9f20b392516179" +dependencies = [ + "cubecl-common", + "cubecl-core", + "cubecl-runtime", + "cubecl-std", + "half", + "num-traits", + "rand 0.9.4", + "serde", +] + +[[package]] +name = "cubecl-reduce" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "53306ace81f6262f7ae794370f47e6b5019842b27e8800240e5b039386b3ac3a" +dependencies = [ + "cubecl-core", + "cubecl-runtime", + "cubecl-std", + "half", + "num-traits", + "pretty_assertions", + "rand 0.9.4", + "serde", +] + +[[package]] +name = "cubecl-runtime" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "91b823bb5899a6fa8809bf7aa36f93f72ced6de58ab9d6edea2c730b235eeda3" +dependencies = [ + "async-channel", + "bytemuck", + "cfg-if", + "cfg_aliases", + "cubecl-common", + "cubecl-ir", + "derive-new", + "dirs", + "enumset", + "foldhash 0.1.5", + "hashbrown 0.15.5", + "log", + "md5", + "serde", + "serde_json", + "spin", + "thiserror 2.0.18", + "toml", + "variadics_please", + "wasm-bindgen-futures", +] + +[[package]] +name = "cubecl-std" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "24536998f9fff84f9a1dd2a90f981d5aa4d15eb35cddec5021c4fcf977d2e75e" +dependencies = [ + "cubecl-common", + "cubecl-core", + "cubecl-runtime", + "foldhash 0.1.5", + "half", + "paste", + "serde", + "spin", + "variadics_please", +] + +[[package]] +name = "cubecl-wgpu" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d59a7d737259a784247595e2f0cc5a97d3e50f45cdaefbd4cc7d7fd2126f7a58" +dependencies = [ + "async-channel", + "bytemuck", + "cfg-if", + "cfg_aliases", + "cubecl-common", + "cubecl-core", + "cubecl-runtime", + "derive-new", + "derive_more 2.1.1", + "half", + "hashbrown 0.15.5", + "log", + "sanitize-filename", + "wgpu", +] + +[[package]] +name = "cudarc" +version = "0.17.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0bf99ab37ee7072d64d906aa2dada9a3422f1d975cdf8c8055a573bc84897ed8" +dependencies = [ + "libloading", +] + +[[package]] +name = "darling" +version = "0.20.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fc7f46116c46ff9ab3eb1597a45688b6715c6e628b5c133e288e709a29bcb4ee" +dependencies = [ + "darling_core 0.20.11", + "darling_macro 0.20.11", +] + +[[package]] +name = "darling" +version = "0.21.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9cdf337090841a411e2a7f3deb9187445851f91b309c0c0a29e05f74a00a48c0" +dependencies = [ + "darling_core 0.21.3", + "darling_macro 0.21.3", +] + +[[package]] +name = "darling_core" +version = "0.20.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0d00b9596d185e565c2207a0b01f8bd1a135483d02d9b7b0a54b11da8d53412e" +dependencies = [ + "fnv", + "ident_case", + "proc-macro2", + "quote", + "strsim", + "syn", +] + +[[package]] +name = "darling_core" +version = "0.21.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1247195ecd7e3c85f83c8d2a366e4210d588e802133e1e355180a9870b517ea4" +dependencies = [ + "fnv", + "ident_case", + "proc-macro2", + "quote", + "strsim", + "syn", +] + +[[package]] +name = "darling_macro" +version = "0.20.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fc34b93ccb385b40dc71c6fceac4b2ad23662c7eeb248cf10d529b7e055b6ead" +dependencies = [ + "darling_core 0.20.11", + "quote", + "syn", +] + +[[package]] +name = "darling_macro" +version = "0.21.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d38308df82d1080de0afee5d069fa14b0326a88c14f15c5ccda35b4a6c414c81" +dependencies = [ + "darling_core 0.21.3", + "quote", + "syn", +] + +[[package]] +name = "data-encoding" +version = "2.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a4ae5f15dda3c708c0ade84bfee31ccab44a3da4f88015ed22f63732abe300c8" + +[[package]] +name = "derive-new" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2cdc8d50f426189eef89dac62fabfa0abb27d5cc008f25bf4156a0203325becc" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "derive_more" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4a9b99b9cbbe49445b21764dc0625032a89b145a2642e67603e1c936f5458d05" +dependencies = [ + "derive_more-impl 1.0.0", +] + +[[package]] +name = "derive_more" +version = "2.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d751e9e49156b02b44f9c1815bcb94b984cdcc4396ecc32521c739452808b134" +dependencies = [ + "derive_more-impl 2.1.1", +] + +[[package]] +name = "derive_more-impl" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cb7330aeadfbe296029522e6c40f315320aba36fc43a5b3632f3795348f3bd22" +dependencies = [ + "proc-macro2", + "quote", + "syn", + "unicode-xid", +] + +[[package]] +name = "derive_more-impl" +version = "2.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "799a97264921d8623a957f6c3b9011f3b5492f557bbb7a5a19b7fa6d06ba8dcb" +dependencies = [ + "convert_case 0.10.0", + "proc-macro2", + "quote", + "rustc_version", + "syn", + "unicode-xid", +] + +[[package]] +name = "deunicode" +version = "1.6.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "abd57806937c9cc163efc8ea3910e00a62e2aeb0b8119f1793a978088f8f6b04" + +[[package]] +name = "diff" +version = "0.1.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "56254986775e3233ffa9c4d7d3faaf6d36a2c09d30b20687e9f88bc8bafc16c8" + +[[package]] +name = "digest" +version = "0.10.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" +dependencies = [ + "block-buffer", + "crypto-common", +] + +[[package]] +name = "dirs" +version = "6.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c3e8aa94d75141228480295a7d0e7feb620b1a5ad9f12bc40be62411e38cce4e" +dependencies = [ + "dirs-sys", +] + +[[package]] +name = "dirs-sys" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e01a3366d27ee9890022452ee61b2b63a67e6f13f58900b651ff5665f0bb1fab" +dependencies = [ + "libc", + "option-ext", + "redox_users", + "windows-sys 0.61.2", +] + +[[package]] +name = "displaydoc" +version = "0.2.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1ac70aa55017e108007fbaf5aa0f54b021c98f92ff8af59d42eda9da96e3dd4f" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "document-features" +version = "0.2.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d4b8a88685455ed29a21542a33abd9cb6510b6b129abadabdcef0f4c55bc8f61" +dependencies = [ + "litrs", +] + +[[package]] +name = "dtoa" +version = "1.0.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4c3cf4824e2d5f025c7b531afcb2325364084a16806f6d47fbc1f5fbd9960590" + +[[package]] +name = "dtoa-short" +version = "0.3.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cd1511a7b6a56299bd043a9c167a6d2bfb37bf84a6dfceaba651168adfb43c87" +dependencies = [ + "dtoa", +] + +[[package]] +name = "dyn-stack" +version = "0.13.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1c4713e43e2886ba72b8271aa66c93d722116acf7a75555cce11dcde84388fe8" +dependencies = [ + "bytemuck", + "dyn-stack-macros", +] + +[[package]] +name = "dyn-stack-macros" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e1d926b4d407d372f141f93bb444696142c29d32962ccbd3531117cf3aa0bfa9" + +[[package]] +name = "either" +version = "1.16.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "91622ff5e7162018101f2fea40d6ebf4a78bbe5a49736a2020649edf9693679e" + +[[package]] +name = "embassy-futures" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc2d050bdc5c21e0862a89256ed8029ae6c290a93aecefc73084b3002cdebb01" + +[[package]] +name = "embassy-time" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f820157f198ada183ad62e0a66f554c610cdcd1a9f27d4b316358103ced7a1f8" +dependencies = [ + "cfg-if", + "critical-section", + "document-features", + "embassy-time-driver", + "embedded-hal 0.2.7", + "embedded-hal 1.0.0", + "embedded-hal-async", + "futures-util", +] + +[[package]] +name = "embassy-time-driver" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6ee71af1b3a0deaa53eaf2d39252f83504c853646e472400b763060389b9fcc9" +dependencies = [ + "document-features", +] + +[[package]] +name = "embedded-hal" +version = "0.2.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "35949884794ad573cf46071e41c9b60efb0cb311e3ca01f7af807af1debc66ff" +dependencies = [ + "nb 0.1.3", + "void", +] + +[[package]] +name = "embedded-hal" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "361a90feb7004eca4019fb28352a9465666b24f840f5c3cddf0ff13920590b89" + +[[package]] +name = "embedded-hal-async" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0c4c685bbef7fe13c3c6dd4da26841ed3980ef33e841cddfa15ce8a8fb3f1884" +dependencies = [ + "embedded-hal 1.0.0", +] + +[[package]] +name = "entities" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b5320ae4c3782150d900b79807611a59a99fc9a1d61d686faafc24b93fc8d7ca" + +[[package]] +name = "enum-as-inner" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a1e6a265c649f3f5979b601d26f1d05ada116434c87741c9493cb56218f76cbc" +dependencies = [ + "heck", + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "enumset" +version = "1.1.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "839c4174b41e75c8f7306110b2c51996a293b8d1d850edd529011841d9fede7d" +dependencies = [ + "enumset_derive", +] + +[[package]] +name = "enumset_derive" +version = "0.15.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4bd536557b58c682b217b8fb199afdff47cd3eff260623f19e77074eb073d63a" +dependencies = [ + "darling 0.21.3", + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "equivalent" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f" + +[[package]] +name = "errno" +version = "0.3.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "39cab71617ae0d63f51a36d69f866391735b51691dbda63cf6f96d042b63efeb" +dependencies = [ + "libc", + "windows-sys 0.61.2", +] + +[[package]] +name = "event-listener" +version = "5.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e13b66accf52311f30a0db42147dadea9850cb48cd070028831ae5f5d4b856ab" +dependencies = [ + "concurrent-queue", + "parking", + "pin-project-lite", +] + +[[package]] +name = "event-listener-strategy" +version = "0.5.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8be9f3dfaaffdae2972880079a491a1a8bb7cbed0b8dd7a347f668b4150a3b93" +dependencies = [ + "event-listener", + "pin-project-lite", +] + +[[package]] +name = "fastrand" +version = "2.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9f1f227452a390804cdb637b74a86990f2a7d7ba4b7d5693aac9b4dd6defd8d6" + +[[package]] +name = "fid-rs" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a6956a1e60e2d1412b44b4169d44a03dae518f8583d3e10090c912c105e48447" +dependencies = [ + "rayon", +] + +[[package]] +name = "filetime" +version = "0.2.29" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c287a33c7f0a620c38e641e7f60827713987b3c0f26e8ddc9462cc69cf75759" +dependencies = [ + "cfg-if", + "libc", +] + +[[package]] +name = "find-msvc-tools" +version = "0.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5baebc0774151f905a1a2cc41989300b1e6fbb29aff0ceffa1064fdd3088d582" + +[[package]] +name = "fixedbitset" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ce7134b9999ecaf8bcd65542e436736ef32ddca1b3e06094cb6ec5755203b80" + +[[package]] +name = "flate2" +version = "1.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "843fba2746e448b37e26a819579957415c8cef339bf08564fe8b7ddbd959573c" +dependencies = [ + "crc32fast", + "miniz_oxide", + "zlib-rs", +] + +[[package]] +name = "float-ord" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ce81f49ae8a0482e4c55ea62ebbd7e5a686af544c00b9d090bba3ff9be97b3d" + +[[package]] +name = "float4" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5939bac0ef2ad7c83a53e4fb889c1d81f007b07061d648cd271071984d86f257" + +[[package]] +name = "float8" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4203231de188ebbdfb85c11f3c20ca2b063945710de04e7b59268731e728b462" +dependencies = [ + "half", +] + +[[package]] +name = "float8" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "719a903cc23e4a89e87962c2a80fdb45cdaad0983a89bd150bb57b4c8571a7d5" +dependencies = [ + "half", + "num-traits", + "rand 0.9.4", + "rand_distr", +] + +[[package]] +name = "fnv" +version = "1.0.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" + +[[package]] +name = "foldhash" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d9c4f5dac5e15c24eb999c26181a6ca40b39fe946cbe4c263c7209467bc83af2" + +[[package]] +name = "foldhash" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77ce24cb58228fbb8aa041425bb1050850ac19177686ea6e0f41a70416f56fdb" + +[[package]] +name = "foreign-types" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d737d9aa519fb7b749cbc3b962edcf310a8dd1f4b67c91c4f83975dbdd17d965" +dependencies = [ + "foreign-types-macros", + "foreign-types-shared", +] + +[[package]] +name = "foreign-types-macros" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1a5c6c585bc94aaf2c7b51dd4c2ba22680844aba4c687be581871a6f518c5742" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "foreign-types-shared" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aa9a19cbb55df58761df49b23516a86d432839add4af60fc256da840f66ed35b" + +[[package]] +name = "form_urlencoded" +version = "1.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cb4cb245038516f5f85277875cdaa4f7d2c9a0fa0468de06ed190163b1581fcf" +dependencies = [ + "percent-encoding", +] + +[[package]] +name = "fst" +version = "0.4.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7ab85b9b05e3978cc9a9cf8fea7f01b494e1a09ed3037e16ba39edc7a29eb61a" + +[[package]] +name = "futf" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df420e2e84819663797d1ec6544b13c5be84629e7bb00dc960d6917db2987843" +dependencies = [ + "mac", + "new_debug_unreachable", +] + +[[package]] +name = "futures-channel" +version = "0.3.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "07bbe89c50d7a535e539b8c17bc0b49bdb77747034daa8087407d655f3f7cc1d" +dependencies = [ + "futures-core", + "futures-sink", +] + +[[package]] +name = "futures-core" +version = "0.3.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7e3450815272ef58cec6d564423f6e755e25379b217b0bc688e295ba24df6b1d" + +[[package]] +name = "futures-io" +version = "0.3.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cecba35d7ad927e23624b22ad55235f2239cfa44fd10428eecbeba6d6a717718" + +[[package]] +name = "futures-lite" +version = "2.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f78e10609fe0e0b3f4157ffab1876319b5b0db102a2c60dc4626306dc46b44ad" +dependencies = [ + "fastrand", + "futures-core", + "futures-io", + "parking", + "pin-project-lite", +] + +[[package]] +name = "futures-sink" +version = "0.3.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c39754e157331b013978ec91992bde1ac089843443c49cbc7f46150b0fad0893" + +[[package]] +name = "futures-task" +version = "0.3.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "037711b3d59c33004d3856fbdc83b99d4ff37a24768fa1be9ce3538a1cde4393" + +[[package]] +name = "futures-util" +version = "0.3.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "389ca41296e6190b48053de0321d02a77f32f8a5d2461dd38762c0593805c6d6" +dependencies = [ + "futures-core", + "futures-io", + "futures-sink", + "futures-task", + "memchr", + "pin-project-lite", + "slab", +] + +[[package]] +name = "gemm" +version = "0.19.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aa0673db364b12263d103b68337a68fbecc541d6f6b61ba72fe438654709eacb" +dependencies = [ + "dyn-stack", + "gemm-c32", + "gemm-c64", + "gemm-common", + "gemm-f16", + "gemm-f32", + "gemm-f64", + "num-complex", + "num-traits", + "paste", + "raw-cpuid", + "seq-macro", +] + +[[package]] +name = "gemm-c32" +version = "0.19.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "086936dbdcb99e37aad81d320f98f670e53c1e55a98bee70573e83f95beb128c" +dependencies = [ + "dyn-stack", + "gemm-common", + "num-complex", + "num-traits", + "paste", + "raw-cpuid", + "seq-macro", +] + +[[package]] +name = "gemm-c64" +version = "0.19.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "20c8aeeeec425959bda4d9827664029ba1501a90a0d1e6228e48bef741db3a3f" +dependencies = [ + "dyn-stack", + "gemm-common", + "num-complex", + "num-traits", + "paste", + "raw-cpuid", + "seq-macro", +] + +[[package]] +name = "gemm-common" +version = "0.19.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "88027625910cc9b1085aaaa1c4bc46bb3a36aad323452b33c25b5e4e7c8e2a3e" +dependencies = [ + "bytemuck", + "dyn-stack", + "half", + "libm", + "num-complex", + "num-traits", + "once_cell", + "paste", + "pulp", + "raw-cpuid", + "rayon", + "seq-macro", + "sysctl", +] + +[[package]] +name = "gemm-f16" +version = "0.19.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3df7a55202e6cd6739d82ae3399c8e0c7e1402859b30e4cb780e61525d9486e" +dependencies = [ + "dyn-stack", + "gemm-common", + "gemm-f32", + "half", + "num-complex", + "num-traits", + "paste", + "raw-cpuid", + "rayon", + "seq-macro", +] + +[[package]] +name = "gemm-f32" +version = "0.19.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "02e0b8c9da1fbec6e3e3ab2ce6bc259ef18eb5f6f0d3e4edf54b75f9fd41a81c" +dependencies = [ + "dyn-stack", + "gemm-common", + "num-complex", + "num-traits", + "paste", + "raw-cpuid", + "seq-macro", +] + +[[package]] +name = "gemm-f64" +version = "0.19.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "056131e8f2a521bfab322f804ccd652520c79700d81209e9d9275bbdecaadc6a" +dependencies = [ + "dyn-stack", + "gemm-common", + "num-complex", + "num-traits", + "paste", + "raw-cpuid", + "seq-macro", +] + +[[package]] +name = "generic-array" +version = "0.14.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" +dependencies = [ + "typenum", + "version_check", +] + +[[package]] +name = "getopts" +version = "0.2.24" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cfe4fbac503b8d1f88e6676011885f34b7174f46e59956bba534ba83abded4df" +dependencies = [ + "unicode-width", +] + +[[package]] +name = "getrandom" +version = "0.2.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ff2abc00be7fca6ebc474524697ae276ad847ad0a6b3faa4bcb027e9a4614ad0" +dependencies = [ + "cfg-if", + "js-sys", + "libc", + "wasi", + "wasm-bindgen", +] + +[[package]] +name = "getrandom" +version = "0.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "899def5c37c4fd7b2664648c28120ecec138e4d395b459e5ca34f9cce2dd77fd" +dependencies = [ + "cfg-if", + "js-sys", + "libc", + "r-efi", + "wasip2", + "wasm-bindgen", +] + +[[package]] +name = "gl_generator" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1a95dfc23a2b4a9a2f5ab41d194f8bfda3cabec42af4e39f08c339eb2a0c124d" +dependencies = [ + "khronos_api", + "log", + "xml-rs", +] + +[[package]] +name = "glob" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0cc23270f6e1808e30a928bdc84dea0b9b4136a8bc82338574f23baf47bbd280" + +[[package]] +name = "glow" +version = "0.16.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c5e5ea60d70410161c8bf5da3fdfeaa1c72ed2c15f8bbb9d19fe3a4fad085f08" +dependencies = [ + "js-sys", + "slotmap", + "wasm-bindgen", + "web-sys", +] + +[[package]] +name = "glutin_wgl_sys" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2c4ee00b289aba7a9e5306d57c2d05499b2e5dc427f84ac708bd2c090212cf3e" +dependencies = [ + "gl_generator", +] + +[[package]] +name = "gpu-alloc" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fbcd2dba93594b227a1f57ee09b8b9da8892c34d55aa332e034a228d0fe6a171" +dependencies = [ + "bitflags", + "gpu-alloc-types", +] + +[[package]] +name = "gpu-alloc-types" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "98ff03b468aa837d70984d55f5d3f846f6ec31fe34bbb97c4f85219caeee1ca4" +dependencies = [ + "bitflags", +] + +[[package]] +name = "gpu-allocator" +version = "0.27.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c151a2a5ef800297b4e79efa4f4bec035c5f51d5ae587287c9b952bdf734cacd" +dependencies = [ + "log", + "presser", + "thiserror 1.0.69", + "windows 0.58.0", +] + +[[package]] +name = "gpu-descriptor" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b89c83349105e3732062a895becfc71a8f921bb71ecbbdd8ff99263e3b53a0ca" +dependencies = [ + "bitflags", + "gpu-descriptor-types", + "hashbrown 0.15.5", +] + +[[package]] +name = "gpu-descriptor-types" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fdf242682df893b86f33a73828fb09ca4b2d3bb6cc95249707fc684d27484b91" +dependencies = [ + "bitflags", +] + +[[package]] +name = "h2" +version = "0.4.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6cb093c84e8bd9b188d4c4a8cb6579fc016968d14c99882163cd3ff402a4f155" +dependencies = [ + "atomic-waker", + "bytes", + "fnv", + "futures-core", + "futures-sink", + "http", + "indexmap", + "slab", + "tokio", + "tokio-util", + "tracing", +] + +[[package]] +name = "half" +version = "2.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6ea2d84b969582b4b1864a92dc5d27cd2b77b622a8d79306834f1be5ba20d84b" +dependencies = [ + "bytemuck", + "cfg-if", + "crunchy", + "num-traits", + "rand 0.9.4", + "rand_distr", + "serde", + "zerocopy", +] + +[[package]] +name = "harper-brill" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "78176be681477890eea55780e3323e134d4efb937c65c17f7bd9c59e457c86f3" +dependencies = [ + "harper-pos-utils", + "serde_json", +] + +[[package]] +name = "harper-core" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "acab57352d953e0ab227d4a0a7a8f990e28053f47b8d633711677a83180f51fb" +dependencies = [ + "ammonia", + "bitflags", + "blanket", + "cached", + "foldhash 0.2.0", + "fst", + "harper-brill", + "harper-thesaurus", + "hashbrown 0.16.1", + "is-macro", + "itertools 0.14.0", + "levenshtein_automata", + "lru", + "ordered-float 5.3.0", + "paste", + "pulldown-cmark", + "regex", + "serde", + "serde_json", + "smallvec", + "strum", + "strum_macros", + "thiserror 2.0.18", + "trie-rs", + "unicode-blocks", + "unicode-script", + "unicode-width", + "zip 8.6.0", +] + +[[package]] +name = "harper-ffi" +version = "0.1.0" +dependencies = [ + "harper-core", + "serde_json", +] + +[[package]] +name = "harper-pos-utils" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a191fccad8ba62230a64a36a33a16635e2f60e08aec5580cc79262fbb8c837dd" +dependencies = [ + "burn", + "burn-ndarray", + "hashbrown 0.16.1", + "is-macro", + "lru", + "rs-conllu", + "serde", + "serde_json", + "strum", + "strum_macros", +] + +[[package]] +name = "harper-thesaurus" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0e4e193a731f1cdf7496aa8d1900b88cdd1f99a46f725d186feccac5cbe55ad8" +dependencies = [ + "hashbrown 0.16.1", + "indexmap", + "itertools 0.14.0", + "ruzstd", + "zstd", +] + +[[package]] +name = "hashbrown" +version = "0.13.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "43a3c133739dddd0d2990f9a4bdf8eb4b21ef50e4851ca85ab661199821d510e" +dependencies = [ + "ahash", +] + +[[package]] +name = "hashbrown" +version = "0.15.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9229cfe53dfd69f0609a49f65461bd93001ea1ef889cd5529dd176593f5338a1" +dependencies = [ + "allocator-api2", + "equivalent", + "foldhash 0.1.5", + "serde", +] + +[[package]] +name = "hashbrown" +version = "0.16.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "841d1cc9bed7f9236f321df977030373f4a4163ae1a7dbfe1a51a2c1a51d9100" +dependencies = [ + "allocator-api2", + "equivalent", + "foldhash 0.2.0", + "serde", + "serde_core", +] + +[[package]] +name = "hashbrown" +version = "0.17.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed5909b6e89a2db4456e54cd5f673791d7eca6732202bbf2a9cc504fe2f9b84a" +dependencies = [ + "allocator-api2", + "equivalent", + "foldhash 0.2.0", +] + +[[package]] +name = "heck" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" + +[[package]] +name = "hermit-abi" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fc0fef456e4baa96da950455cd02c081ca953b141298e41db3fc7e36b1da849c" + +[[package]] +name = "hexf-parse" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dfa686283ad6dd069f105e5ab091b04c62850d3e4cf5d67debad1933f55023df" + +[[package]] +name = "html5ever" +version = "0.35.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "55d958c2f74b664487a2035fe1dadb032c48718a03b63f3ab0b8537db8549ed4" +dependencies = [ + "log", + "markup5ever", + "match_token", +] + +[[package]] +name = "http" +version = "1.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6970f50e31d6fc17d3fa27329444bfa74e196cf62e95052a3f6fee181dba6425" +dependencies = [ + "bytes", + "itoa", +] + +[[package]] +name = "http-body" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1efedce1fb8e6913f23e0c92de8e62cd5b772a67e7b3946df930a62566c93184" +dependencies = [ + "bytes", + "http", +] + +[[package]] +name = "http-body-util" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b021d93e26becf5dc7e1b75b1bed1fd93124b374ceb73f43d4d4eafec896a64a" +dependencies = [ + "bytes", + "futures-core", + "http", + "http-body", + "pin-project-lite", +] + +[[package]] +name = "httparse" +version = "1.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6dbf3de79e51f3d586ab4cb9d5c3e2c14aa28ed23d180cf89b4df0454a69cc87" + +[[package]] +name = "hyper" +version = "1.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "55281c53a1894c864990125767da440a4e630446785086f52523b20033b74498" +dependencies = [ + "atomic-waker", + "bytes", + "futures-channel", + "futures-core", + "h2", + "http", + "http-body", + "httparse", + "itoa", + "pin-project-lite", + "smallvec", + "tokio", + "want", +] + +[[package]] +name = "hyper-rustls" +version = "0.27.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "33ca68d021ef39cf6463ab54c1d0f5daf03377b70561305bb89a8f83aab66e0f" +dependencies = [ + "http", + "hyper", + "hyper-util", + "rustls", + "tokio", + "tokio-rustls", + "tower-service", + "webpki-roots", +] + +[[package]] +name = "hyper-util" +version = "0.1.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "96547c2556ec9d12fb1578c4eaf448b04993e7fb79cbaad930a656880a6bdfa0" +dependencies = [ + "base64", + "bytes", + "futures-channel", + "futures-util", + "http", + "http-body", + "hyper", + "ipnet", + "libc", + "percent-encoding", + "pin-project-lite", + "socket2", + "tokio", + "tower-service", + "tracing", +] + +[[package]] +name = "icu_collections" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2984d1cd16c883d7935b9e07e44071dca8d917fd52ecc02c04d5fa0b5a3f191c" +dependencies = [ + "displaydoc", + "potential_utf", + "utf8_iter", + "yoke", + "zerofrom", + "zerovec", +] + +[[package]] +name = "icu_locale_core" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "92219b62b3e2b4d88ac5119f8904c10f8f61bf7e95b640d25ba3075e6cac2c29" +dependencies = [ + "displaydoc", + "litemap", + "tinystr", + "writeable", + "zerovec", +] + +[[package]] +name = "icu_normalizer" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c56e5ee99d6e3d33bd91c5d85458b6005a22140021cc324cea84dd0e72cff3b4" +dependencies = [ + "icu_collections", + "icu_normalizer_data", + "icu_properties", + "icu_provider", + "smallvec", + "zerovec", +] + +[[package]] +name = "icu_normalizer_data" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "da3be0ae77ea334f4da67c12f149704f19f81d1adf7c51cf482943e84a2bad38" + +[[package]] +name = "icu_properties" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bee3b67d0ea5c2cca5003417989af8996f8604e34fb9ddf96208a033901e70de" +dependencies = [ + "icu_collections", + "icu_locale_core", + "icu_properties_data", + "icu_provider", + "zerotrie", + "zerovec", +] + +[[package]] +name = "icu_properties_data" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e2bbb201e0c04f7b4b3e14382af113e17ba4f63e2c9d2ee626b720cbce54a14" + +[[package]] +name = "icu_provider" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "139c4cf31c8b5f33d7e199446eff9c1e02decfc2f0eec2c8d71f65befa45b421" +dependencies = [ + "displaydoc", + "icu_locale_core", + "writeable", + "yoke", + "zerofrom", + "zerotrie", + "zerovec", +] + +[[package]] +name = "ident_case" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39" + +[[package]] +name = "idna" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3b0875f23caa03898994f6ddc501886a45c7d3d62d04d2d90788d47be1b1e4de" +dependencies = [ + "idna_adapter", + "smallvec", + "utf8_iter", +] + +[[package]] +name = "idna_adapter" +version = "1.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cb68373c0d6620ef8105e855e7745e18b0d00d3bdb07fb532e434244cdb9a714" +dependencies = [ + "icu_normalizer", + "icu_properties", +] + +[[package]] +name = "indexmap" +version = "2.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d466e9454f08e4a911e14806c24e16fba1b4c121d1ea474396f396069cf949d9" +dependencies = [ + "equivalent", + "hashbrown 0.17.1", +] + +[[package]] +name = "ipnet" +version = "2.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d98f6fed1fde3f8c21bc40a1abb88dd75e67924f9cffc3ef95607bad8017f8e2" + +[[package]] +name = "is-macro" +version = "0.3.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d57a3e447e24c22647738e4607f1df1e0ec6f72e16182c4cd199f647cdfb0e4" +dependencies = [ + "heck", + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "is_terminal_polyfill" +version = "1.70.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a6cb138bb79a146c1bd460005623e142ef0181e3d0219cb493e02f7d08a35695" + +[[package]] +name = "itertools" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "413ee7dfc52ee1a4949ceeb7dbc8a33f2d6c088194d9f922fb8318faf1f01186" +dependencies = [ + "either", +] + +[[package]] +name = "itertools" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2b192c782037fadd9cfa75548310488aabdbf3d2da73885b31bd0abd03351285" +dependencies = [ + "either", +] + +[[package]] +name = "itoa" +version = "1.0.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f42a60cbdf9a97f5d2305f08a87dc4e09308d1276d28c869c684d7777685682" + +[[package]] +name = "jni-sys" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "41a652e1f9b6e0275df1f15b32661cf0d4b78d4d87ddec5e0c3c20f097433258" +dependencies = [ + "jni-sys 0.4.1", +] + +[[package]] +name = "jni-sys" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c6377a88cb3910bee9b0fa88d4f42e1d2da8e79915598f65fb0c7ee14c878af2" +dependencies = [ + "jni-sys-macros", +] + +[[package]] +name = "jni-sys-macros" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "38c0b942f458fe50cdac086d2f946512305e5631e720728f2a61aabcd47a6264" +dependencies = [ + "quote", + "syn", +] + +[[package]] +name = "jobserver" +version = "0.1.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9afb3de4395d6b3e67a780b6de64b51c978ecf11cb9a462c66be7d4ca9039d33" +dependencies = [ + "getrandom 0.3.4", + "libc", +] + +[[package]] +name = "js-sys" +version = "0.3.102" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "03d04c30968dffe80775bd4d7fb676131cd04a1fb46d2686dbffbaec2d9dfd31" +dependencies = [ + "cfg-if", + "futures-util", + "wasm-bindgen", +] + +[[package]] +name = "khronos-egl" +version = "6.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6aae1df220ece3c0ada96b8153459b67eebe9ae9212258bb0134ae60416fdf76" +dependencies = [ + "libc", + "libloading", + "pkg-config", +] + +[[package]] +name = "khronos_api" +version = "3.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e2db585e1d738fc771bf08a151420d3ed193d9d895a36df7f6f8a9456b911ddc" + +[[package]] +name = "levenshtein_automata" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0c2cdeb66e45e9f36bfad5bbdb4d2384e70936afbee843c6f6543f0c551ebb25" +dependencies = [ + "fst", +] + +[[package]] +name = "libc" +version = "0.2.186" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "68ab91017fe16c622486840e4c83c9a37afeff978bd239b5293d61ece587de66" + +[[package]] +name = "libloading" +version = "0.8.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d7c4b02199fee7c5d21a5ae7d8cfa79a6ef5bb2fc834d6e9058e89c825efdc55" +dependencies = [ + "cfg-if", + "windows-link 0.2.1", +] + +[[package]] +name = "liblzma" +version = "0.4.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6033b77c21d1f56deeae8014eb9fbe7bdf1765185a6c508b5ca82eeaed7f899" +dependencies = [ + "liblzma-sys", + "num_cpus", +] + +[[package]] +name = "liblzma-sys" +version = "0.4.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1a60851d15cd8c5346eca4ab8babff585be2ae4bc8097c067291d3ffe2add3b6" +dependencies = [ + "cc", + "libc", + "pkg-config", +] + +[[package]] +name = "libm" +version = "0.2.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6d2cec3eae94f9f509c767b45932f1ada8350c4bdb85af2fcab4a3c14807981" + +[[package]] +name = "libredox" +version = "0.1.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f02ab6bace2054fb888a3c16f990117b579d14a3088e472d63c6011fa185c9d3" +dependencies = [ + "libc", +] + +[[package]] +name = "linux-raw-sys" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32a66949e030da00e8c7d4434b251670a91556f4144941d37452769c25d58a53" + +[[package]] +name = "litemap" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "92daf443525c4cce67b150400bc2316076100ce0b3686209eb8cf3c31612e6f0" + +[[package]] +name = "litrs" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "11d3d7f243d5c5a8b9bb5d6dd2b1602c0cb0b9db1621bafc7ed66e35ff9fe092" + +[[package]] +name = "lock_api" +version = "0.4.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "224399e74b87b5f3557511d98dff8b14089b3dadafcab6bb93eab67d3aace965" +dependencies = [ + "scopeguard", +] + +[[package]] +name = "log" +version = "0.4.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "953f07c43838f8e6f9758cab68bf5bed85465e7587ebe0b823f1bcd81978ad3a" + +[[package]] +name = "louds-rs" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "936de6c22f08e7135a921f8ada907acd0d88880c4f42b5591f634b9f1dd8e07f" +dependencies = [ + "fid-rs", +] + +[[package]] +name = "lru" +version = "0.18.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8a860605968fce16869fd239cf4237a82f3ac470723415db603b0e8b6c8d4fb9" +dependencies = [ + "hashbrown 0.17.1", +] + +[[package]] +name = "lru-slab" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "112b39cec0b298b6c1999fee3e31427f74f676e4cb9879ed1a121b43661a4154" + +[[package]] +name = "mac" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c41e0c4fef86961ac6d6f8a82609f55f31b05e4fce149ac5710e439df7619ba4" + +[[package]] +name = "macerator" +version = "0.2.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "84b0b2dbe8b22f9e96ba12e29964889010117f92e6bd006010887320ae58e2f0" +dependencies = [ + "bytemuck", + "cfg_aliases", + "half", + "macerator-macros", + "moddef", + "num-traits", + "paste", + "rustc_version", +] + +[[package]] +name = "macerator-macros" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed5ce85961d618ce9794bdf822bfe96fe9dd341aa5b033b454f7a8d96e79b9b1" +dependencies = [ + "darling 0.20.11", + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "malloc_buf" +version = "0.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "62bb907fe88d54d8d9ce32a3cceab4218ed2f6b7d35617cafe9adf84e43919cb" +dependencies = [ + "libc", +] + +[[package]] +name = "maplit" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3e2e65a1a2e43cfcb47a895c4c8b10d1f4a61097f9f254f183aee60cad9c651d" + +[[package]] +name = "markup5ever" +version = "0.35.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "311fe69c934650f8f19652b3946075f0fc41ad8757dbb68f1ca14e7900ecc1c3" +dependencies = [ + "log", + "tendril", + "web_atoms", +] + +[[package]] +name = "match_token" +version = "0.35.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ac84fd3f360fcc43dc5f5d186f02a94192761a080e8bc58621ad4d12296a58cf" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "matrixmultiply" +version = "0.3.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a06de3016e9fae57a36fd14dba131fccf49f74b40b7fbdb472f96e361ec71a08" +dependencies = [ + "autocfg", + "rawpointer", +] + +[[package]] +name = "md5" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ae960838283323069879657ca3de837e9f7bbb4c7bf6ea7f1b290d5e9476d2e0" + +[[package]] +name = "memchr" +version = "2.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "88904434abc2901f197fe8cc55f0445e7ded921dba5911dad2e2b39b48e663c4" + +[[package]] +name = "memmap2" +version = "0.9.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "714098028fe011992e1c3962653c96b2d578c4b4bce9036e15ff220319b1e0e3" +dependencies = [ + "libc", + "stable_deref_trait", +] + +[[package]] +name = "metal" +version = "0.32.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "00c15a6f673ff72ddcc22394663290f870fb224c1bfce55734a75c414150e605" +dependencies = [ + "bitflags", + "block", + "core-graphics-types", + "foreign-types", + "log", + "objc", + "paste", +] + +[[package]] +name = "minimal-lexical" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a" + +[[package]] +name = "miniz_oxide" +version = "0.8.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fa76a2c86f704bdb222d66965fb3d63269ce38518b83cb0575fca855ebb6316" +dependencies = [ + "adler2", + "simd-adler32", +] + +[[package]] +name = "mio" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "02bd0af71c67b473010cbbc60715ee815645a4dc942899111f494b4b737d6fda" +dependencies = [ + "libc", + "wasi", + "windows-sys 0.61.2", +] + +[[package]] +name = "moddef" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4a0b3262dc837d2513fe2ef31ff8461352ef932dcca31ba0c0abe33547cf6b9b" + +[[package]] +name = "naga" +version = "26.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "916cbc7cb27db60be930a4e2da243cf4bc39569195f22fd8ee419cd31d5b662c" +dependencies = [ + "arrayvec", + "bit-set", + "bitflags", + "cfg-if", + "cfg_aliases", + "codespan-reporting", + "half", + "hashbrown 0.15.5", + "hexf-parse", + "indexmap", + "libm", + "log", + "num-traits", + "once_cell", + "rustc-hash 1.1.0", + "spirv", + "thiserror 2.0.18", + "unicode-ident", +] + +[[package]] +name = "nb" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "801d31da0513b6ec5214e9bf433a77966320625a37860f910be265be6e18d06f" +dependencies = [ + "nb 1.1.0", +] + +[[package]] +name = "nb" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8d5439c4ad607c3c23abf66de8c8bf57ba8adcd1f129e699851a6e43935d339d" + +[[package]] +name = "ndarray" +version = "0.16.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "882ed72dce9365842bf196bdeedf5055305f11fc8c03dee7bb0194a6cad34841" +dependencies = [ + "matrixmultiply", + "num-complex", + "num-integer", + "num-traits", + "portable-atomic", + "portable-atomic-util", + "rawpointer", +] + +[[package]] +name = "ndk-sys" +version = "0.6.0+11769913" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ee6cda3051665f1fb8d9e08fc35c96d5a244fb1be711a03b71118828afc9a873" +dependencies = [ + "jni-sys 0.3.1", +] + +[[package]] +name = "new_debug_unreachable" +version = "1.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "650eef8c711430f1a879fdd01d4745a7deea475becfb90269c06775983bbf086" + +[[package]] +name = "nom" +version = "7.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d273983c5a657a70a3e8f2a01329822f3b8c8172b73826411a55751e404a0a4a" +dependencies = [ + "memchr", + "minimal-lexical", +] + +[[package]] +name = "ntapi" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c3b335231dfd352ffb0f8017f3b6027a4917f7df785ea2143d8af2adc66980ae" +dependencies = [ + "winapi", +] + +[[package]] +name = "num" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "35bd024e8b2ff75562e5f34e7f4905839deb4b22955ef5e73d2fea1b9813cb23" +dependencies = [ + "num-bigint", + "num-complex", + "num-integer", + "num-iter", + "num-rational", + "num-traits", +] + +[[package]] +name = "num-bigint" +version = "0.4.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a5e44f723f1133c9deac646763579fdb3ac745e418f2a7af9cd0c431da1f20b9" +dependencies = [ + "num-integer", + "num-traits", +] + +[[package]] +name = "num-complex" +version = "0.4.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "73f88a1307638156682bada9d7604135552957b7818057dcef22705b4d509495" +dependencies = [ + "bytemuck", + "num-traits", +] + +[[package]] +name = "num-integer" +version = "0.1.46" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7969661fd2958a5cb096e56c8e1ad0444ac2bbcd0061bd28660485a44879858f" +dependencies = [ + "num-traits", +] + +[[package]] +name = "num-iter" +version = "0.1.45" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1429034a0490724d0075ebb2bc9e875d6503c3cf69e235a8941aa757d83ef5bf" +dependencies = [ + "autocfg", + "num-integer", + "num-traits", +] + +[[package]] +name = "num-rational" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f83d14da390562dca69fc84082e73e548e1ad308d24accdedd2720017cb37824" +dependencies = [ + "num-bigint", + "num-integer", + "num-traits", +] + +[[package]] +name = "num-traits" +version = "0.2.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841" +dependencies = [ + "autocfg", + "libm", +] + +[[package]] +name = "num_cpus" +version = "1.17.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "91df4bbde75afed763b708b7eee1e8e7651e02d97f6d5dd763e89367e957b23b" +dependencies = [ + "hermit-abi", + "libc", +] + +[[package]] +name = "objc" +version = "0.2.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "915b1b472bc21c53464d6c8461c9d3af805ba1ef837e1cac254428f4a77177b1" +dependencies = [ + "malloc_buf", +] + +[[package]] +name = "objc2-core-foundation" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2a180dd8642fa45cdb7dd721cd4c11b1cadd4929ce112ebd8b9f5803cc79d536" +dependencies = [ + "bitflags", +] + +[[package]] +name = "objc2-io-kit" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "33fafba39597d6dc1fb709123dfa8289d39406734be322956a69f0931c73bb15" +dependencies = [ + "libc", + "objc2-core-foundation", +] + +[[package]] +name = "once_cell" +version = "1.21.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9f7c3e4beb33f85d45ae3e3a1792185706c8e16d043238c593331cc7cd313b50" + +[[package]] +name = "once_cell_polyfill" +version = "1.70.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "384b8ab6d37215f3c5301a95a4accb5d64aa607f1fcb26a11b5303878451b4fe" + +[[package]] +name = "option-ext" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "04744f49eae99ab78e0d5c0b603ab218f515ea8cfe5a456d7629ad883a3b6e7d" + +[[package]] +name = "ordered-float" +version = "4.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7bb71e1b3fa6ca1c61f383464aaf2bb0e2f8e772a1f01d486832464de363b951" +dependencies = [ + "num-traits", +] + +[[package]] +name = "ordered-float" +version = "5.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b7d950ca161dc355eaf28f82b11345ed76c6e1f6eb1f4f4479e0323b9e2fbd0e" +dependencies = [ + "num-traits", + "rand 0.8.6", + "serde", +] + +[[package]] +name = "parking" +version = "2.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f38d5652c16fde515bb1ecef450ab0f6a219d619a7274976324d5e377f7dceba" + +[[package]] +name = "parking_lot" +version = "0.12.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "93857453250e3077bd71ff98b6a65ea6621a19bb0f559a85248955ac12c45a1a" +dependencies = [ + "lock_api", + "parking_lot_core", +] + +[[package]] +name = "parking_lot_core" +version = "0.9.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2621685985a2ebf1c516881c026032ac7deafcda1a2c9b7850dc81e3dfcb64c1" +dependencies = [ + "cfg-if", + "libc", + "redox_syscall", + "smallvec", + "windows-link 0.2.1", +] + +[[package]] +name = "paste" +version = "1.0.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "57c0d7b74b563b49d38dae00a0c37d4d6de9b432382b2892f0574ddcae73fd0a" + +[[package]] +name = "percent-encoding" +version = "2.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b4f627cb1b25917193a259e49bdad08f671f8d9708acfd5fe0a8c1455d87220" + +[[package]] +name = "petgraph" +version = "0.6.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b4c5cc86750666a3ed20bdaf5ca2a0344f9c67674cae0515bec2da16fbaa47db" +dependencies = [ + "fixedbitset", + "indexmap", +] + +[[package]] +name = "phf" +version = "0.11.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fd6780a80ae0c52cc120a26a1a42c1ae51b247a253e4e06113d23d2c2edd078" +dependencies = [ + "phf_macros", + "phf_shared", +] + +[[package]] +name = "phf_codegen" +version = "0.11.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aef8048c789fa5e851558d709946d6d79a8ff88c0440c587967f8e94bfb1216a" +dependencies = [ + "phf_generator", + "phf_shared", +] + +[[package]] +name = "phf_generator" +version = "0.11.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3c80231409c20246a13fddb31776fb942c38553c51e871f8cbd687a4cfb5843d" +dependencies = [ + "phf_shared", + "rand 0.8.6", +] + +[[package]] +name = "phf_macros" +version = "0.11.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f84ac04429c13a7ff43785d75ad27569f2951ce0ffd30a3321230db2fc727216" +dependencies = [ + "phf_generator", + "phf_shared", + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "phf_shared" +version = "0.11.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "67eabc2ef2a60eb7faa00097bd1ffdb5bd28e62bf39990626a582201b7a754e5" +dependencies = [ + "siphasher", +] + +[[package]] +name = "pin-project-lite" +version = "0.2.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a89322df9ebe1c1578d689c92318e070967d1042b512afbe49518723f4e6d5cd" + +[[package]] +name = "pkg-config" +version = "0.3.33" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "19f132c84eca552bf34cab8ec81f1c1dcc229b811638f9d283dceabe58c5569e" + +[[package]] +name = "portable-atomic" +version = "1.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c33a9471896f1c69cecef8d20cbe2f7accd12527ce60845ff44c153bb2a21b49" +dependencies = [ + "serde", +] + +[[package]] +name = "portable-atomic-util" +version = "0.2.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c2a106d1259c23fac8e543272398ae0e3c0b8d33c88ed73d0cc71b0f1d902618" +dependencies = [ + "portable-atomic", +] + +[[package]] +name = "potential_utf" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0103b1cef7ec0cf76490e969665504990193874ea05c85ff9bab8b911d0a0564" +dependencies = [ + "zerovec", +] + +[[package]] +name = "ppv-lite86" +version = "0.2.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85eae3c4ed2f50dcfe72643da4befc30deadb458a9b590d720cde2f2b1e97da9" +dependencies = [ + "zerocopy", +] + +[[package]] +name = "precomputed-hash" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "925383efa346730478fb4838dbe9137d2a47675ad789c546d150a6e1dd4ab31c" + +[[package]] +name = "presser" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e8cf8e6a8aa66ce33f63993ffc4ea4271eb5b0530a9002db8455ea6050c77bfa" + +[[package]] +name = "pretty_assertions" +version = "1.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3ae130e2f271fbc2ac3a40fb1d07180839cdbbe443c7a27e1e3c13c5cac0116d" +dependencies = [ + "diff", + "yansi", +] + +[[package]] +name = "prettyplease" +version = "0.2.37" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "479ca8adacdd7ce8f1fb39ce9ecccbfe93a3f1344b3d0d97f20bc0196208f62b" +dependencies = [ + "proc-macro2", + "syn", +] + +[[package]] +name = "proc-macro2" +version = "1.0.106" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8fd00f0bb2e90d81d1044c2b32617f68fcb9fa3bb7640c23e9c748e53fb30934" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "profiling" +version = "1.0.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3d595e54a326bc53c1c197b32d295e14b169e3cfeaa8dc82b529f947fba6bcf5" + +[[package]] +name = "pulldown-cmark" +version = "0.13.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e9f068eba8e7071c5f9511831b44f32c740d5adf574e990f946ddb53db2f314e" +dependencies = [ + "bitflags", + "getopts", + "memchr", + "pulldown-cmark-escape", + "unicase", +] + +[[package]] +name = "pulldown-cmark-escape" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "007d8adb5ddab6f8e3f491ac63566a7d5002cc7ed73901f72057943fa71ae1ae" + +[[package]] +name = "pulp" +version = "0.22.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2e205bb30d5b916c55e584c22201771bcf2bad9aabd5d4127f38387140c38632" +dependencies = [ + "bytemuck", + "cfg-if", + "libm", + "num-complex", + "paste", + "pulp-wasm-simd-flag", + "raw-cpuid", + "reborrow", + "version_check", +] + +[[package]] +name = "pulp-wasm-simd-flag" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "40e24eee682d89fb193496edf918a7f407d30175b2e785fe057e4392dfd182e0" + +[[package]] +name = "quinn" +version = "0.11.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b9e20a958963c291dc322d98411f541009df2ced7b5a4f2bd52337638cfccf20" +dependencies = [ + "bytes", + "cfg_aliases", + "pin-project-lite", + "quinn-proto", + "quinn-udp", + "rustc-hash 2.1.2", + "rustls", + "socket2", + "thiserror 2.0.18", + "tokio", + "tracing", + "web-time", +] + +[[package]] +name = "quinn-proto" +version = "0.11.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "434b42fec591c96ef50e21e886936e66d3cc3f737104fdb9b737c40ffb94c098" +dependencies = [ + "bytes", + "getrandom 0.3.4", + "lru-slab", + "rand 0.9.4", + "ring", + "rustc-hash 2.1.2", + "rustls", + "rustls-pki-types", + "slab", + "thiserror 2.0.18", + "tinyvec", + "tracing", + "web-time", +] + +[[package]] +name = "quinn-udp" +version = "0.5.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "addec6a0dcad8a8d96a771f815f0eaf55f9d1805756410b39f5fa81332574cbd" +dependencies = [ + "cfg_aliases", + "libc", + "once_cell", + "socket2", + "tracing", + "windows-sys 0.60.2", +] + +[[package]] +name = "quote" +version = "1.0.45" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "41f2619966050689382d2b44f664f4bc593e129785a36d6ee376ddf37259b924" +dependencies = [ + "proc-macro2", +] + +[[package]] +name = "r-efi" +version = "5.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "69cdb34c158ceb288df11e18b4bd39de994f6657d83847bdffdbd7f346754b0f" + +[[package]] +name = "rand" +version = "0.8.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5ca0ecfa931c29007047d1bc58e623ab12e5590e8c7cc53200d5202b69266d8a" +dependencies = [ + "rand_core 0.6.4", + "serde", +] + +[[package]] +name = "rand" +version = "0.9.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "44c5af06bb1b7d3216d91932aed5265164bf384dc89cd6ba05cf59a35f5f76ea" +dependencies = [ + "rand_chacha", + "rand_core 0.9.5", +] + +[[package]] +name = "rand_chacha" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3022b5f1df60f26e1ffddd6c66e8aa15de382ae63b3a0c1bfc0e4d3e3f325cb" +dependencies = [ + "ppv-lite86", + "rand_core 0.9.5", +] + +[[package]] +name = "rand_core" +version = "0.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" +dependencies = [ + "serde", +] + +[[package]] +name = "rand_core" +version = "0.9.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "76afc826de14238e6e8c374ddcc1fa19e374fd8dd986b0d2af0d02377261d83c" +dependencies = [ + "getrandom 0.3.4", +] + +[[package]] +name = "rand_distr" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6a8615d50dcf34fa31f7ab52692afec947c4dd0ab803cc87cb3b0b4570ff7463" +dependencies = [ + "num-traits", + "rand 0.9.4", +] + +[[package]] +name = "range-alloc" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ca45419789ae5a7899559e9512e58ca889e41f04f1f2445e9f4b290ceccd1d08" + +[[package]] +name = "raw-cpuid" +version = "11.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "498cd0dc59d73224351ee52a95fee0f1a617a2eae0e7d9d720cc622c73a54186" +dependencies = [ + "bitflags", +] + +[[package]] +name = "raw-window-handle" +version = "0.6.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "20675572f6f24e9e76ef639bc5552774ed45f1c30e2951e1e99c59888861c539" + +[[package]] +name = "rawpointer" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "60a357793950651c4ed0f3f52338f53b2f809f32d83a07f72909fa13e4c6c1e3" + +[[package]] +name = "rayon" +version = "1.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fb39b166781f92d482534ef4b4b1b2568f42613b53e5b6c160e24cfbfa30926d" +dependencies = [ + "either", + "rayon-core", +] + +[[package]] +name = "rayon-core" +version = "1.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "22e18b0f0062d30d4230b2e85ff77fdfe4326feb054b9783a3460d8435c8ab91" +dependencies = [ + "crossbeam-deque", + "crossbeam-utils", +] + +[[package]] +name = "reborrow" +version = "0.5.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "03251193000f4bd3b042892be858ee50e8b3719f2b08e5833ac4353724632430" + +[[package]] +name = "redox_syscall" +version = "0.5.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed2bf2547551a7053d6fdfafda3f938979645c44812fbfcda098faae3f1a362d" +dependencies = [ + "bitflags", +] + +[[package]] +name = "redox_users" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a4e608c6638b9c18977b00b475ac1f28d14e84b27d8d42f70e0bf1e3dec127ac" +dependencies = [ + "getrandom 0.2.17", + "libredox", + "thiserror 2.0.18", +] + +[[package]] +name = "regex" +version = "1.12.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f1292b7759ae1cb9ec195452d1390a074f0cd8541ab7a5a8c31cd6db45d4a6ba" +dependencies = [ + "aho-corasick", + "memchr", + "regex-automata", + "regex-syntax", +] + +[[package]] +name = "regex-automata" +version = "0.4.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6e1dd4122fc1595e8162618945476892eefca7b88c52820e74af6262213cae8f" +dependencies = [ + "aho-corasick", + "memchr", + "regex-syntax", +] + +[[package]] +name = "regex-syntax" +version = "0.8.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d6f6ff9a378485b298a5286656da665ba74413d36db0979633275d2e708145d4" + +[[package]] +name = "renderdoc-sys" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "19b30a45b0cd0bcca8037f3d0dc3421eaf95327a17cad11964fb8179b4fc4832" + +[[package]] +name = "reqwest" +version = "0.12.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eddd3ca559203180a307f12d114c268abf583f59b03cb906fd0b3ff8646c1147" +dependencies = [ + "base64", + "bytes", + "futures-channel", + "futures-core", + "futures-util", + "h2", + "http", + "http-body", + "http-body-util", + "hyper", + "hyper-rustls", + "hyper-util", + "js-sys", + "log", + "percent-encoding", + "pin-project-lite", + "quinn", + "rustls", + "rustls-pki-types", + "serde", + "serde_json", + "serde_urlencoded", + "sync_wrapper", + "tokio", + "tokio-rustls", + "tower", + "tower-http", + "tower-service", + "url", + "wasm-bindgen", + "wasm-bindgen-futures", + "web-sys", + "webpki-roots", +] + +[[package]] +name = "ring" +version = "0.17.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a4689e6c2294d81e88dc6261c768b63bc4fcdb852be6d1352498b114f61383b7" +dependencies = [ + "cc", + "cfg-if", + "getrandom 0.2.17", + "libc", + "untrusted", + "windows-sys 0.52.0", +] + +[[package]] +name = "rmp" +version = "0.8.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4ba8be72d372b2c9b35542551678538b562e7cf86c3315773cae48dfbfe7790c" +dependencies = [ + "num-traits", +] + +[[package]] +name = "rmp-serde" +version = "1.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72f81bee8c8ef9b577d1681a70ebbc962c232461e397b22c208c43c04b67a155" +dependencies = [ + "rmp", + "serde", +] + +[[package]] +name = "rs-conllu" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d6de5aecf17f8fff1b35d59a12e2b8c908cad4d67208805166483655554f9169" +dependencies = [ + "clap", + "derive_more 1.0.0", + "thiserror 1.0.69", + "walkdir", +] + +[[package]] +name = "rustc-hash" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "08d43f7aa6b08d49f382cde6a7982047c3426db949b1424bc4b7ec9ae12c6ce2" + +[[package]] +name = "rustc-hash" +version = "2.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "94300abf3f1ae2e2b8ffb7b58043de3d399c73fa6f4b73826402a5c457614dbe" + +[[package]] +name = "rustc_version" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cfcb3a22ef46e85b45de6ee7e79d063319ebb6594faafcf1c225ea92ab6e9b92" +dependencies = [ + "semver", +] + +[[package]] +name = "rustix" +version = "1.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6fe4565b9518b83ef4f91bb47ce29620ca828bd32cb7e408f0062e9930ba190" +dependencies = [ + "bitflags", + "errno", + "libc", + "linux-raw-sys", + "windows-sys 0.61.2", +] + +[[package]] +name = "rustls" +version = "0.23.40" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ef86cd5876211988985292b91c96a8f2d298df24e75989a43a3c73f2d4d8168b" +dependencies = [ + "once_cell", + "ring", + "rustls-pki-types", + "rustls-webpki", + "subtle", + "zeroize", +] + +[[package]] +name = "rustls-pki-types" +version = "1.14.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "30a7197ae7eb376e574fe940d068c30fe0462554a3ddbe4eca7838e049c937a9" +dependencies = [ + "web-time", + "zeroize", +] + +[[package]] +name = "rustls-webpki" +version = "0.103.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "61c429a8649f110dddef65e2a5ad240f747e85f7758a6bccc7e5777bd33f756e" +dependencies = [ + "ring", + "rustls-pki-types", + "untrusted", +] + +[[package]] +name = "rustversion" +version = "1.0.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b39cdef0fa800fc44525c84ccb54a029961a8215f9619753635a9c0d2538d46d" + +[[package]] +name = "ruzstd" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a7c1c839d570d835527c9a5e4db7cb2198683a988cb9d7293fc8674e6bd58fc8" +dependencies = [ + "twox-hash", +] + +[[package]] +name = "ryu" +version = "1.0.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9774ba4a74de5f7b1c1451ed6cd5285a32eddb5cccb8cc655a4e50009e06477f" + +[[package]] +name = "safetensors" +version = "0.6.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "172dd94c5a87b5c79f945c863da53b2ebc7ccef4eca24ac63cca66a41aab2178" +dependencies = [ + "serde", + "serde_json", +] + +[[package]] +name = "safetensors" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "675656c1eabb620b921efea4f9199f97fc86e36dd6ffd1fbbe48d0f59a4987f5" +dependencies = [ + "hashbrown 0.16.1", + "serde", + "serde_json", +] + +[[package]] +name = "same-file" +version = "1.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "93fc1dc3aaa9bfed95e02e6eadabb4baf7e3078b0bd1b4d7b6b0b68378900502" +dependencies = [ + "winapi-util", +] + +[[package]] +name = "sanitize-filename" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bc984f4f9ceb736a7bb755c3e3bd17dc56370af2600c9780dcc48c66453da34d" +dependencies = [ + "regex", +] + +[[package]] +name = "scopeguard" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" + +[[package]] +name = "semver" +version = "1.0.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8a7852d02fc848982e0c167ef163aaff9cd91dc640ba85e263cb1ce46fae51cd" + +[[package]] +name = "seq-macro" +version = "0.3.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1bc711410fbe7399f390ca1c3b60ad0f53f80e95c5eb935e52268a0e2cd49acc" + +[[package]] +name = "serde" +version = "1.0.228" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9a8e94ea7f378bd32cbbd37198a4a91436180c5bb472411e48b5ec2e2124ae9e" +dependencies = [ + "serde_core", + "serde_derive", +] + +[[package]] +name = "serde_bytes" +version = "0.11.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a5d440709e79d88e51ac01c4b72fc6cb7314017bb7da9eeff678aa94c10e3ea8" +dependencies = [ + "serde", + "serde_core", +] + +[[package]] +name = "serde_core" +version = "1.0.228" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "41d385c7d4ca58e59fc732af25c3983b67ac852c1a25000afe1175de458b67ad" +dependencies = [ + "serde_derive", +] + +[[package]] +name = "serde_derive" +version = "1.0.228" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d540f220d3187173da220f885ab66608367b6574e925011a9353e4badda91d79" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "serde_json" +version = "1.0.150" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e8014e44b4736ed0538adeecded0fce2a272f22dc9578a7eb6b2d9993c74cfb9" +dependencies = [ + "itoa", + "memchr", + "serde", + "serde_core", + "zmij", +] + +[[package]] +name = "serde_spanned" +version = "1.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6662b5879511e06e8999a8a235d848113e942c9124f211511b16466ee2995f26" +dependencies = [ + "serde_core", +] + +[[package]] +name = "serde_urlencoded" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3491c14715ca2294c4d6a88f15e84739788c1d030eed8c110436aafdaa2f3fd" +dependencies = [ + "form_urlencoded", + "itoa", + "ryu", + "serde", +] + +[[package]] +name = "sha2" +version = "0.10.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a7507d819769d01a365ab707794a4084392c824f54a7a6a7862f8c3d0892b283" +dependencies = [ + "cfg-if", + "cpufeatures", + "digest", +] + +[[package]] +name = "shlex" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" + +[[package]] +name = "shlex" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8fadd59c855ef2080decdef8ff161eb6661b86933c9d82e5ba29dc602a55aba" + +[[package]] +name = "simd-adler32" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "703d5c7ef118737c72f1af64ad2f6f8c5e1921f818cdcb97b8fe6fc69bf66214" + +[[package]] +name = "siphasher" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ee5873ec9cce0195efcb7a4e9507a04cd49aec9c83d0389df45b1ef7ba2e649" + +[[package]] +name = "slab" +version = "0.4.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0c790de23124f9ab44544d7ac05d60440adc586479ce501c1d6d7da3cd8c9cf5" + +[[package]] +name = "slotmap" +version = "1.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bdd58c3c93c3d278ca835519292445cb4b0d4dc59ccfdf7ceadaab3f8aeb4038" +dependencies = [ + "version_check", +] + +[[package]] +name = "slug" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "882a80f72ee45de3cc9a5afeb2da0331d58df69e4e7d8eeb5d3c7784ae67e724" +dependencies = [ + "deunicode", + "wasm-bindgen", +] + +[[package]] +name = "smallvec" +version = "1.15.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ed6a63f02c8539c91a8685a86f4099661ba3da017932f6ebbea6de3f0fa7c90" +dependencies = [ + "serde", +] + +[[package]] +name = "socket2" +version = "0.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "52d1cfed4120b4d927bf7c0f86d2087a4a7d6027c906d9f9d525a80573b9be51" +dependencies = [ + "libc", + "windows-sys 0.61.2", +] + +[[package]] +name = "spin" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d5fe4ccb98d9c292d56fec89a5e07da7fc4cf0dc11e156b41793132775d3e591" +dependencies = [ + "lock_api", + "portable-atomic", +] + +[[package]] +name = "spirv" +version = "0.3.0+sdk-1.3.268.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eda41003dc44290527a59b13432d4a0379379fa074b70174882adfbdfd917844" +dependencies = [ + "bitflags", +] + +[[package]] +name = "stable-vec" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6dac7bc0f7d0d44329b200020effbc25a534d89fa142af95e3ddf76113412a5e" + +[[package]] +name = "stable_deref_trait" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6ce2be8dc25455e1f91df71bfa12ad37d7af1092ae736f3a6cd0e37bc7810596" + +[[package]] +name = "static_assertions" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" + +[[package]] +name = "string_cache" +version = "0.8.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bf776ba3fa74f83bf4b63c3dcbbf82173db2632ed8452cb2d891d33f459de70f" +dependencies = [ + "new_debug_unreachable", + "parking_lot", + "phf_shared", + "precomputed-hash", + "serde", +] + +[[package]] +name = "string_cache_codegen" +version = "0.5.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c711928715f1fe0fe509c53b43e993a9a557babc2d0a3567d0a3006f1ac931a0" +dependencies = [ + "phf_generator", + "phf_shared", + "proc-macro2", + "quote", +] + +[[package]] +name = "strsim" +version = "0.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f" + +[[package]] +name = "strum" +version = "0.28.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9628de9b8791db39ceda2b119bbe13134770b56c138ec1d3af810d045c04f9bd" + +[[package]] +name = "strum_macros" +version = "0.28.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ab85eea0270ee17587ed4156089e10b9e6880ee688791d45a905f5b1ca36f664" +dependencies = [ + "heck", + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "subtle" +version = "2.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292" + +[[package]] +name = "syn" +version = "2.0.118" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1b9ae57f904213ebb649ce6895b8a66c66f0203b9319718f69a5612a065b1422" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "sync_wrapper" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0bf256ce5efdfa370213c1dabab5935a12e49f2c58d15e9eac2870d3b4f27263" +dependencies = [ + "futures-core", +] + +[[package]] +name = "synstructure" +version = "0.13.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "728a70f3dbaf5bab7f0c4b1ac8d7ae5ea60a4b5549c8a5914361c99147a709d2" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "sysctl" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "01198a2debb237c62b6826ec7081082d951f46dbb64b0e8c7649a452230d1dfc" +dependencies = [ + "bitflags", + "byteorder", + "enum-as-inner", + "libc", + "thiserror 1.0.69", + "walkdir", +] + +[[package]] +name = "sysinfo" +version = "0.36.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "252800745060e7b9ffb7b2badbd8b31cfa4aa2e61af879d0a3bf2a317c20217d" +dependencies = [ + "libc", + "memchr", + "ntapi", + "objc2-core-foundation", + "objc2-io-kit", + "windows 0.61.3", +] + +[[package]] +name = "tar" +version = "0.4.46" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f6221d9a6003c78398e3b239969f352578258df48c8eb051caadae0015bc840" +dependencies = [ + "filetime", + "libc", + "xattr", +] + +[[package]] +name = "tendril" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d24a120c5fc464a3458240ee02c299ebcb9d67b5249c8848b09d639dca8d7bb0" +dependencies = [ + "futf", + "mac", + "utf-8", +] + +[[package]] +name = "termcolor" +version = "1.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "06794f8f6c5c898b3275aebefa6b8a1cb24cd2c6c79397ab15774837a0bc5755" +dependencies = [ + "winapi-util", +] + +[[package]] +name = "text_placeholder" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dd5008f74a09742486ef0047596cf35df2b914e2a8dca5727fcb6ba6842a766b" +dependencies = [ + "hashbrown 0.13.2", + "serde", + "serde_json", +] + +[[package]] +name = "thiserror" +version = "1.0.69" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6aaf5339b578ea85b50e080feb250a3e8ae8cfcdff9a461c9ec2904bc923f52" +dependencies = [ + "thiserror-impl 1.0.69", +] + +[[package]] +name = "thiserror" +version = "2.0.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4288b5bcbc7920c07a1149a35cf9590a2aa808e0bc1eafaade0b80947865fbc4" +dependencies = [ + "thiserror-impl 2.0.18", +] + +[[package]] +name = "thiserror-impl" +version = "1.0.69" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "thiserror-impl" +version = "2.0.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ebc4ee7f67670e9b64d05fa4253e753e016c6c95ff35b89b7941d6b856dec1d5" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "tiny-keccak" +version = "2.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2c9d3793400a45f954c52e73d068316d76b6f4e36977e3fcebb13a2721e80237" +dependencies = [ + "crunchy", +] + +[[package]] +name = "tinystr" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c8323304221c2a851516f22236c5722a72eaa19749016521d6dff0824447d96d" +dependencies = [ + "displaydoc", + "zerovec", +] + +[[package]] +name = "tinyvec" +version = "1.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3e61e67053d25a4e82c844e8424039d9745781b3fc4f32b8d55ed50f5f667ef3" +dependencies = [ + "tinyvec_macros", +] + +[[package]] +name = "tinyvec_macros" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" + +[[package]] +name = "tokio" +version = "1.52.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8fc7f01b389ac15039e4dc9531aa973a135d7a4135281b12d7c1bc79fd57fffe" +dependencies = [ + "bytes", + "libc", + "mio", + "pin-project-lite", + "socket2", + "windows-sys 0.61.2", +] + +[[package]] +name = "tokio-rustls" +version = "0.26.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1729aa945f29d91ba541258c8df89027d5792d85a8841fb65e8bf0f4ede4ef61" +dependencies = [ + "rustls", + "tokio", +] + +[[package]] +name = "tokio-util" +version = "0.7.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ae9cec805b01e8fc3fd2fe289f89149a9b66dd16786abd8b19cfa7b48cb0098" +dependencies = [ + "bytes", + "futures-core", + "futures-sink", + "pin-project-lite", + "tokio", +] + +[[package]] +name = "toml" +version = "0.9.12+spec-1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cf92845e79fc2e2def6a5d828f0801e29a2f8acc037becc5ab08595c7d5e9863" +dependencies = [ + "indexmap", + "serde_core", + "serde_spanned", + "toml_datetime", + "toml_parser", + "toml_writer", + "winnow 0.7.15", +] + +[[package]] +name = "toml_datetime" +version = "0.7.5+spec-1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "92e1cfed4a3038bc5a127e35a2d360f145e1f4b971b551a2ba5fd7aedf7e1347" +dependencies = [ + "serde_core", +] + +[[package]] +name = "toml_parser" +version = "1.1.2+spec-1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a2abe9b86193656635d2411dc43050282ca48aa31c2451210f4202550afb7526" +dependencies = [ + "winnow 1.0.3", +] + +[[package]] +name = "toml_writer" +version = "1.1.1+spec-1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "756daf9b1013ebe47a8776667b466417e2d4c5679d441c26230efd9ef78692db" + +[[package]] +name = "tower" +version = "0.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ebe5ef63511595f1344e2d5cfa636d973292adc0eec1f0ad45fae9f0851ab1d4" +dependencies = [ + "futures-core", + "futures-util", + "pin-project-lite", + "sync_wrapper", + "tokio", + "tower-layer", + "tower-service", +] + +[[package]] +name = "tower-http" +version = "0.6.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4cfcf7e2740e6fc6d4d688b4ef00650406bb94adf4731e43c096c3a19fe40840" +dependencies = [ + "bitflags", + "bytes", + "futures-util", + "http", + "http-body", + "pin-project-lite", + "tower", + "tower-layer", + "tower-service", + "url", +] + +[[package]] +name = "tower-layer" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "121c2a6cda46980bb0fcd1647ffaf6cd3fc79a013de288782836f6df9c48780e" + +[[package]] +name = "tower-service" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8df9b6e13f2d32c91b9bd719c00d1958837bc7dec474d94952798cc8e69eeec3" + +[[package]] +name = "tracel-llvm" +version = "20.1.4-7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "982535db9eb1a30ac0f2c50239a0eec3e5cf50993a88e92b04747bd2f4d365b2" +dependencies = [ + "tracel-mlir-rs", + "tracel-mlir-sys", +] + +[[package]] +name = "tracel-llvm-bundler" +version = "20.1.4-7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3c75b8e477cb8d49d907afab029ca74d48459f5b88c27bdb4c6cd6acb5e61977" +dependencies = [ + "anyhow", + "bytes", + "constcat", + "dirs", + "liblzma", + "regex", + "reqwest", + "serde", + "serde_json", + "sha2", + "tar", + "walkdir", +] + +[[package]] +name = "tracel-mlir-rs" +version = "20.1.4-7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77a478a35efd68d0ba73f747adfb7923b121c64e7f5be9cd8364ca1dcb772d5c" +dependencies = [ + "tracel-mlir-rs-macros", + "tracel-mlir-sys", +] + +[[package]] +name = "tracel-mlir-rs-macros" +version = "20.1.4-7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7a94f36868c3b10b1825945223d99d106c73f4d249f063caa4651deeb9379344" +dependencies = [ + "comrak", + "convert_case 0.8.0", + "proc-macro2", + "quote", + "regex", + "syn", + "tracel-llvm-bundler", + "tracel-tblgen-rs", + "unindent", +] + +[[package]] +name = "tracel-mlir-sys" +version = "20.1.4-7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "02f26d31af0c225a6d2e3d65d012fd6de848c9fc776897b152ee83b7d1bd15c4" +dependencies = [ + "tracel-llvm-bundler", +] + +[[package]] +name = "tracel-tblgen-rs" +version = "20.1.4-7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "00d2581070380418ccc33b500f3739e4d4869421fdb477fcea51ff97c6253a52" +dependencies = [ + "bindgen", + "cc", + "paste", + "thiserror 2.0.18", + "tracel-llvm-bundler", +] + +[[package]] +name = "tracing" +version = "0.1.44" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "63e71662fa4b2a2c3a26f570f037eb95bb1f85397f3cd8076caed2f026a6d100" +dependencies = [ + "pin-project-lite", + "tracing-core", +] + +[[package]] +name = "tracing-core" +version = "0.1.36" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "db97caf9d906fbde555dd62fa95ddba9eecfd14cb388e4f491a66d74cd5fb79a" +dependencies = [ + "once_cell", +] + +[[package]] +name = "trie-rs" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f6f88f4b0a1ebd6c3d16be3e45eb0e8089372ccadd88849b7ca162ba64b5e6f6" +dependencies = [ + "louds-rs", +] + +[[package]] +name = "try-lock" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e421abadd41a4225275504ea4d6566923418b7f05506fbc9c0fe86ba7396114b" + +[[package]] +name = "twox-hash" +version = "2.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ea3136b675547379c4bd395ca6b938e5ad3c3d20fad76e7fe85f9e0d011419c" + +[[package]] +name = "type-map" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cb30dbbd9036155e74adad6812e9898d03ec374946234fbcebd5dfc7b9187b90" +dependencies = [ + "rustc-hash 2.1.2", +] + +[[package]] +name = "typed-arena" +version = "2.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6af6ae20167a9ece4bcb41af5b80f8a1f1df981f6391189ce00fd257af04126a" + +[[package]] +name = "typed-path" +version = "0.12.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e28f89b80c87b8fb0cf04ab448d5dd0dd0ade2f8891bae878de66a75a28600e" + +[[package]] +name = "typenum" +version = "1.20.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6f5e870be6c3b371b77fe0ee0bafb859fa4964b4404c27de1d380043c4dda20" + +[[package]] +name = "unicase" +version = "2.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dbc4bc3a9f746d862c45cb89d705aa10f187bb96c76001afab07a0d35ce60142" + +[[package]] +name = "unicode-blocks" +version = "0.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6b12e05d9e06373163a9bb6bb8c263c261b396643a99445fe6b9811fd376581b" + +[[package]] +name = "unicode-ident" +version = "1.0.24" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6e4313cd5fcd3dad5cafa179702e2b244f760991f45397d14d4ebf38247da75" + +[[package]] +name = "unicode-normalization" +version = "0.1.25" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5fd4f6878c9cb28d874b009da9e8d183b5abc80117c40bbd187a1fde336be6e8" +dependencies = [ + "tinyvec", +] + +[[package]] +name = "unicode-script" +version = "0.5.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "383ad40bb927465ec0ce7720e033cb4ca06912855fc35db31b5755d0de75b1ee" + +[[package]] +name = "unicode-segmentation" +version = "1.13.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c6f5d3c3b1bf09027a88a6bc961fc00497d651009560b5463668dc81b0fa87a8" + +[[package]] +name = "unicode-width" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b4ac048d71ede7ee76d585517add45da530660ef4390e49b098733c6e897f254" + +[[package]] +name = "unicode-xid" +version = "0.2.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ebc1c04c71510c7f702b52b7c350734c9ff1295c464a03335b00bb84fc54f853" + +[[package]] +name = "unicode_categories" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "39ec24b3121d976906ece63c9daad25b85969647682eee313cb5779fdd69e14e" + +[[package]] +name = "unindent" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7264e107f553ccae879d21fbea1d6724ac785e8c3bfc762137959b5802826ef3" + +[[package]] +name = "untrusted" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1" + +[[package]] +name = "unty" +version = "0.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6d49784317cd0d1ee7ec5c716dd598ec5b4483ea832a2dced265471cc0f690ae" + +[[package]] +name = "url" +version = "2.5.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ff67a8a4397373c3ef660812acab3268222035010ab8680ec4215f38ba3d0eed" +dependencies = [ + "form_urlencoded", + "idna", + "percent-encoding", + "serde", +] + +[[package]] +name = "utf-8" +version = "0.7.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09cc8ee72d2a9becf2f2febe0205bbed8fc6615b7cb429ad062dc7b7ddd036a9" + +[[package]] +name = "utf8_iter" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6c140620e7ffbb22c2dee59cafe6084a59b5ffc27a8859a5f0d494b5d52b6be" + +[[package]] +name = "utf8parse" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821" + +[[package]] +name = "uuid" +version = "1.23.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "144d6b123cef80b301b8f72a9e2ca4370ddec21950d0a103dd22c437006d2db7" + +[[package]] +name = "variadics_please" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "41b6d82be61465f97d42bd1d15bf20f3b0a3a0905018f38f9d6f6962055b0b5c" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "version_check" +version = "0.9.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" + +[[package]] +name = "void" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6a02e4885ed3bc0f2de90ea6dd45ebcbb66dacffe03547fadbb0eeae2770887d" + +[[package]] +name = "walkdir" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "29790946404f91d9c5d06f9874efddea1dc06c5efe94541a7d6863108e3a5e4b" +dependencies = [ + "same-file", + "winapi-util", +] + +[[package]] +name = "want" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bfa7760aed19e106de2c7c0b581b509f2f25d3dacaf737cb82ac61bc6d760b0e" +dependencies = [ + "try-lock", +] + +[[package]] +name = "wasi" +version = "0.11.1+wasi-snapshot-preview1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ccf3ec651a847eb01de73ccad15eb7d99f80485de043efb2f370cd654f4ea44b" + +[[package]] +name = "wasip2" +version = "1.0.4+wasi-0.2.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b67efb37e106e55ce722a510d6b5f9c17f083e5fc79afc2badeb12cc313d9487" +dependencies = [ + "wit-bindgen", +] + +[[package]] +name = "wasm-bindgen" +version = "0.2.125" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ddb3f79143bced6de84270411622a2699cee572fc0875aeaf1e7867cf9fca1a" +dependencies = [ + "cfg-if", + "once_cell", + "rustversion", + "wasm-bindgen-macro", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-futures" +version = "0.4.75" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "503b14d284f2c8dac03b819967e155ea753f573586193b2b2c95990cb5d69280" +dependencies = [ + "js-sys", + "wasm-bindgen", +] + +[[package]] +name = "wasm-bindgen-macro" +version = "0.2.125" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4e21a184b13fb19e157296e2c46056aec9092264fab83e4ba59e68c61b323c3d" +dependencies = [ + "quote", + "wasm-bindgen-macro-support", +] + +[[package]] +name = "wasm-bindgen-macro-support" +version = "0.2.125" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fecefd9c35bd935a20fc3fc344b5f29138961e4f47fb03297d88f2587afb5ebd" +dependencies = [ + "bumpalo", + "proc-macro2", + "quote", + "syn", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-shared" +version = "0.2.125" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "23939e44bb9a5d7576fa2b563dc2e136628f1224e88a8deed09e04858b77871f" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "web-sys" +version = "0.3.102" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a6430a72df5eb332242960fe84b3002a241163998241eb596d4f739b9757061d" +dependencies = [ + "js-sys", + "wasm-bindgen", +] + +[[package]] +name = "web-time" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5a6580f308b1fad9207618087a65c04e7a10bc77e02c8e84e9b00dd4b12fa0bb" +dependencies = [ + "js-sys", + "wasm-bindgen", +] + +[[package]] +name = "web_atoms" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "57ffde1dc01240bdf9992e3205668b235e59421fd085e8a317ed98da0178d414" +dependencies = [ + "phf", + "phf_codegen", + "string_cache", + "string_cache_codegen", +] + +[[package]] +name = "webpki-roots" +version = "1.0.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bf85cb06032201fa7c6f829d7db5a7e5aa45bcc0655327713065f6f0576731bf" +dependencies = [ + "rustls-pki-types", +] + +[[package]] +name = "wgpu" +version = "26.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "70b6ff82bbf6e9206828e1a3178e851f8c20f1c9028e74dd3a8090741ccd5798" +dependencies = [ + "arrayvec", + "bitflags", + "cfg-if", + "cfg_aliases", + "document-features", + "hashbrown 0.15.5", + "js-sys", + "log", + "naga", + "parking_lot", + "portable-atomic", + "profiling", + "raw-window-handle", + "smallvec", + "static_assertions", + "wasm-bindgen", + "wasm-bindgen-futures", + "web-sys", + "wgpu-core", + "wgpu-hal", + "wgpu-types", +] + +[[package]] +name = "wgpu-core" +version = "26.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d5f62f1053bd28c2268f42916f31588f81f64796e2ff91b81293515017ca8bd9" +dependencies = [ + "arrayvec", + "bit-set", + "bit-vec", + "bitflags", + "cfg_aliases", + "document-features", + "hashbrown 0.15.5", + "indexmap", + "log", + "naga", + "once_cell", + "parking_lot", + "portable-atomic", + "profiling", + "raw-window-handle", + "rustc-hash 1.1.0", + "smallvec", + "thiserror 2.0.18", + "wgpu-core-deps-apple", + "wgpu-core-deps-emscripten", + "wgpu-core-deps-windows-linux-android", + "wgpu-hal", + "wgpu-types", +] + +[[package]] +name = "wgpu-core-deps-apple" +version = "26.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "18ae5fbde6a4cbebae38358aa73fcd6e0f15c6144b67ef5dc91ded0db125dbdf" +dependencies = [ + "wgpu-hal", +] + +[[package]] +name = "wgpu-core-deps-emscripten" +version = "26.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d7670e390f416006f746b4600fdd9136455e3627f5bd763abf9a65daa216dd2d" +dependencies = [ + "wgpu-hal", +] + +[[package]] +name = "wgpu-core-deps-windows-linux-android" +version = "26.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "720a5cb9d12b3d337c15ff0e24d3e97ed11490ff3f7506e7f3d98c68fa5d6f14" +dependencies = [ + "wgpu-hal", +] + +[[package]] +name = "wgpu-hal" +version = "26.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a8d0e67224cc7305b3b4eb2cc57ca4c4c3afc665c1d1bee162ea806e19c47bdd" +dependencies = [ + "android_system_properties", + "arrayvec", + "ash", + "bit-set", + "bitflags", + "block", + "bytemuck", + "cfg-if", + "cfg_aliases", + "core-graphics-types", + "glow", + "glutin_wgl_sys", + "gpu-alloc", + "gpu-allocator", + "gpu-descriptor", + "hashbrown 0.15.5", + "js-sys", + "khronos-egl", + "libc", + "libloading", + "log", + "metal", + "naga", + "ndk-sys", + "objc", + "ordered-float 4.6.0", + "parking_lot", + "portable-atomic", + "portable-atomic-util", + "profiling", + "range-alloc", + "raw-window-handle", + "renderdoc-sys", + "smallvec", + "thiserror 2.0.18", + "wasm-bindgen", + "web-sys", + "wgpu-types", + "windows 0.58.0", + "windows-core 0.58.0", +] + +[[package]] +name = "wgpu-types" +version = "26.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eca7a8d8af57c18f57d393601a1fb159ace8b2328f1b6b5f80893f7d672c9ae2" +dependencies = [ + "bitflags", + "bytemuck", + "js-sys", + "log", + "thiserror 2.0.18", + "web-sys", +] + +[[package]] +name = "winapi" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" +dependencies = [ + "winapi-i686-pc-windows-gnu", + "winapi-x86_64-pc-windows-gnu", +] + +[[package]] +name = "winapi-i686-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" + +[[package]] +name = "winapi-util" +version = "0.1.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c2a7b1c03c876122aa43f3020e6c3c3ee5c05081c9a00739faf7503aeba10d22" +dependencies = [ + "windows-sys 0.61.2", +] + +[[package]] +name = "winapi-x86_64-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" + +[[package]] +name = "windows" +version = "0.58.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dd04d41d93c4992d421894c18c8b43496aa748dd4c081bac0dc93eb0489272b6" +dependencies = [ + "windows-core 0.58.0", + "windows-targets 0.52.6", +] + +[[package]] +name = "windows" +version = "0.61.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9babd3a767a4c1aef6900409f85f5d53ce2544ccdfaa86dad48c91782c6d6893" +dependencies = [ + "windows-collections", + "windows-core 0.61.2", + "windows-future", + "windows-link 0.1.3", + "windows-numerics", +] + +[[package]] +name = "windows-collections" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3beeceb5e5cfd9eb1d76b381630e82c4241ccd0d27f1a39ed41b2760b255c5e8" +dependencies = [ + "windows-core 0.61.2", +] + +[[package]] +name = "windows-core" +version = "0.58.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6ba6d44ec8c2591c134257ce647b7ea6b20335bf6379a27dac5f1641fcf59f99" +dependencies = [ + "windows-implement 0.58.0", + "windows-interface 0.58.0", + "windows-result 0.2.0", + "windows-strings 0.1.0", + "windows-targets 0.52.6", +] + +[[package]] +name = "windows-core" +version = "0.61.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c0fdd3ddb90610c7638aa2b3a3ab2904fb9e5cdbecc643ddb3647212781c4ae3" +dependencies = [ + "windows-implement 0.60.2", + "windows-interface 0.59.3", + "windows-link 0.1.3", + "windows-result 0.3.4", + "windows-strings 0.4.2", +] + +[[package]] +name = "windows-future" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fc6a41e98427b19fe4b73c550f060b59fa592d7d686537eebf9385621bfbad8e" +dependencies = [ + "windows-core 0.61.2", + "windows-link 0.1.3", + "windows-threading", +] + +[[package]] +name = "windows-implement" +version = "0.58.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2bbd5b46c938e506ecbce286b6628a02171d56153ba733b6c741fc627ec9579b" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "windows-implement" +version = "0.60.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "053e2e040ab57b9dc951b72c264860db7eb3b0200ba345b4e4c3b14f67855ddf" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "windows-interface" +version = "0.58.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "053c4c462dc91d3b1504c6fe5a726dd15e216ba718e84a0e46a88fbe5ded3515" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "windows-interface" +version = "0.59.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f316c4a2570ba26bbec722032c4099d8c8bc095efccdc15688708623367e358" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "windows-link" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5e6ad25900d524eaabdbbb96d20b4311e1e7ae1699af4fb28c17ae66c80d798a" + +[[package]] +name = "windows-link" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f0805222e57f7521d6a62e36fa9163bc891acd422f971defe97d64e70d0a4fe5" + +[[package]] +name = "windows-numerics" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9150af68066c4c5c07ddc0ce30421554771e528bde427614c61038bc2c92c2b1" +dependencies = [ + "windows-core 0.61.2", + "windows-link 0.1.3", +] + +[[package]] +name = "windows-result" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d1043d8214f791817bab27572aaa8af63732e11bf84aa21a45a78d6c317ae0e" +dependencies = [ + "windows-targets 0.52.6", +] + +[[package]] +name = "windows-result" +version = "0.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "56f42bd332cc6c8eac5af113fc0c1fd6a8fd2aa08a0119358686e5160d0586c6" +dependencies = [ + "windows-link 0.1.3", +] + +[[package]] +name = "windows-strings" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4cd9b125c486025df0eabcb585e62173c6c9eddcec5d117d3b6e8c30e2ee4d10" +dependencies = [ + "windows-result 0.2.0", + "windows-targets 0.52.6", +] + +[[package]] +name = "windows-strings" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "56e6c93f3a0c3b36176cb1327a4958a0353d5d166c2a35cb268ace15e91d3b57" +dependencies = [ + "windows-link 0.1.3", +] + +[[package]] +name = "windows-sys" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" +dependencies = [ + "windows-targets 0.52.6", +] + +[[package]] +name = "windows-sys" +version = "0.60.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f2f500e4d28234f72040990ec9d39e3a6b950f9f22d3dba18416c35882612bcb" +dependencies = [ + "windows-targets 0.53.5", +] + +[[package]] +name = "windows-sys" +version = "0.61.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ae137229bcbd6cdf0f7b80a31df61766145077ddf49416a728b02cb3921ff3fc" +dependencies = [ + "windows-link 0.2.1", +] + +[[package]] +name = "windows-targets" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973" +dependencies = [ + "windows_aarch64_gnullvm 0.52.6", + "windows_aarch64_msvc 0.52.6", + "windows_i686_gnu 0.52.6", + "windows_i686_gnullvm 0.52.6", + "windows_i686_msvc 0.52.6", + "windows_x86_64_gnu 0.52.6", + "windows_x86_64_gnullvm 0.52.6", + "windows_x86_64_msvc 0.52.6", +] + +[[package]] +name = "windows-targets" +version = "0.53.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4945f9f551b88e0d65f3db0bc25c33b8acea4d9e41163edf90dcd0b19f9069f3" +dependencies = [ + "windows-link 0.2.1", + "windows_aarch64_gnullvm 0.53.1", + "windows_aarch64_msvc 0.53.1", + "windows_i686_gnu 0.53.1", + "windows_i686_gnullvm 0.53.1", + "windows_i686_msvc 0.53.1", + "windows_x86_64_gnu 0.53.1", + "windows_x86_64_gnullvm 0.53.1", + "windows_x86_64_msvc 0.53.1", +] + +[[package]] +name = "windows-threading" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b66463ad2e0ea3bbf808b7f1d371311c80e115c0b71d60efc142cafbcfb057a6" +dependencies = [ + "windows-link 0.1.3", +] + +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" + +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a9d8416fa8b42f5c947f8482c43e7d89e73a173cead56d044f6a56104a6d1b53" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b9d782e804c2f632e395708e99a94275910eb9100b2114651e04744e9b125006" + +[[package]] +name = "windows_i686_gnu" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" + +[[package]] +name = "windows_i686_gnu" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "960e6da069d81e09becb0ca57a65220ddff016ff2d6af6a223cf372a506593a3" + +[[package]] +name = "windows_i686_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" + +[[package]] +name = "windows_i686_gnullvm" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fa7359d10048f68ab8b09fa71c3daccfb0e9b559aed648a8f95469c27057180c" + +[[package]] +name = "windows_i686_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" + +[[package]] +name = "windows_i686_msvc" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e7ac75179f18232fe9c285163565a57ef8d3c89254a30685b57d83a38d326c2" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c3842cdd74a865a8066ab39c8a7a473c0778a3f29370b5fd6b4b9aa7df4a499" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ffa179e2d07eee8ad8f57493436566c7cc30ac536a3379fdf008f47f6bb7ae1" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d6bbff5f0aada427a1e5a6da5f1f98158182f26556f345ac9e04d36d0ebed650" + +[[package]] +name = "winnow" +version = "0.7.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df79d97927682d2fd8adb29682d1140b343be4ac0f08fd68b7765d9c059d3945" + +[[package]] +name = "winnow" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0592e1c9d151f854e6fd382574c3a0855250e1d9b2f99d9281c6e6391af352f1" + +[[package]] +name = "wit-bindgen" +version = "0.57.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1ebf944e87a7c253233ad6766e082e3cd714b5d03812acc24c318f549614536e" + +[[package]] +name = "writeable" +version = "0.6.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1ffae5123b2d3fc086436f8834ae3ab053a283cfac8fe0a0b8eaae044768a4c4" + +[[package]] +name = "xattr" +version = "1.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32e45ad4206f6d2479085147f02bc2ef834ac85886624a23575ae137c8aa8156" +dependencies = [ + "libc", + "rustix", +] + +[[package]] +name = "xml-rs" +version = "0.8.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3ae8337f8a065cfc972643663ea4279e04e7256de865aa66fe25cec5fb912d3f" + +[[package]] +name = "yansi" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cfe53a6657fd280eaa890a3bc59152892ffa3e30101319d168b781ed6529b049" + +[[package]] +name = "yoke" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "709fe23a0424b6a435d82152b1bd3fdfb0833487d5fa90d05d42762a9891fef5" +dependencies = [ + "stable_deref_trait", + "yoke-derive", + "zerofrom", +] + +[[package]] +name = "yoke-derive" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "de844c262c8848816172cef550288e7dc6c7b7814b4ee56b3e1553f275f1858e" +dependencies = [ + "proc-macro2", + "quote", + "syn", + "synstructure", +] + +[[package]] +name = "zerocopy" +version = "0.8.52" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ce1022995ff5ff5d841ad7d994facc23098cd40152f2c1d11cd607c6f530653f" +dependencies = [ + "zerocopy-derive", +] + +[[package]] +name = "zerocopy-derive" +version = "0.8.52" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1ae7f38b72ec2a254e2b87ef277cf2cd4fb97cbebf944faa6f33354da0867930" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "zerofrom" +version = "0.1.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ec05a11813ea801ff6d75110ad09cd0824ddba17dfe17128ea0d5f68e6c5272" +dependencies = [ + "zerofrom-derive", +] + +[[package]] +name = "zerofrom-derive" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "11532158c46691caf0f2593ea8358fed6bbf68a0315e80aae9bd41fbade684a1" +dependencies = [ + "proc-macro2", + "quote", + "syn", + "synstructure", +] + +[[package]] +name = "zeroize" +version = "1.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e13c156562582aa81c60cb29407084cdb54c4164760106ab78e6c5b0858cf64e" + +[[package]] +name = "zerotrie" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0f9152d31db0792fa83f70fb2f83148effb5c1f5b8c7686c3459e361d9bc20bf" +dependencies = [ + "displaydoc", + "yoke", + "zerofrom", +] + +[[package]] +name = "zerovec" +version = "0.11.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "90f911cbc359ab6af17377d242225f4d75119aec87ea711a880987b18cd7b239" +dependencies = [ + "yoke", + "zerofrom", + "zerovec-derive", +] + +[[package]] +name = "zerovec-derive" +version = "0.11.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "625dc425cab0dca6dc3c3319506e6593dcb08a9f387ea3b284dbd52a92c40555" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "zip" +version = "7.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c42e33efc22a0650c311c2ef19115ce232583abbe80850bc8b66509ebef02de0" +dependencies = [ + "crc32fast", + "indexmap", + "memchr", + "typed-path", +] + +[[package]] +name = "zip" +version = "8.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2d04a6b5381502aa6087c94c669499eb1602eb9c5e8198e534de571f7154809b" +dependencies = [ + "crc32fast", + "flate2", + "indexmap", + "memchr", + "typed-path", + "zopfli", +] + +[[package]] +name = "zlib-rs" +version = "0.6.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3be3d40e40a133f9c916ee3f9f4fa2d9d63435b5fbe1bfc6d9dae0aa0ada1513" + +[[package]] +name = "zmij" +version = "1.0.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b8848ee67ecc8aedbaf3e4122217aff892639231befc6a1b58d29fff4c2cabaa" + +[[package]] +name = "zopfli" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f05cd8797d63865425ff89b5c4a48804f35ba0ce8d125800027ad6017d2b5249" +dependencies = [ + "bumpalo", + "crc32fast", + "log", + "simd-adler32", +] + +[[package]] +name = "zstd" +version = "0.13.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e91ee311a569c327171651566e07972200e76fcfe2242a4fa446149a3881c08a" +dependencies = [ + "zstd-safe", +] + +[[package]] +name = "zstd-safe" +version = "7.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f49c4d5f0abb602a93fb8736af2a4f4dd9512e36f7f570d66e65ff867ed3b9d" +dependencies = [ + "zstd-sys", +] + +[[package]] +name = "zstd-sys" +version = "2.0.16+zstd.1.5.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "91e19ebc2adc8f83e43039e79776e3fda8ca919132d68a1fed6a5faca2683748" +dependencies = [ + "cc", + "pkg-config", +] diff --git a/harper-ffi/Cargo.toml b/harper-ffi/Cargo.toml new file mode 100644 index 0000000..e528ada --- /dev/null +++ b/harper-ffi/Cargo.toml @@ -0,0 +1,21 @@ +[package] +name = "harper-ffi" +version = "0.1.0" +edition = "2021" + +[lib] +# Static library exposing a C ABI for linking into the Swift app. +name = "harper_ffi" +crate-type = ["staticlib"] + +[dependencies] +# harper-core 2.5.0 — the grammar checker from the Automattic Harper project. +# Verified against https://docs.rs/harper-core/2.5.0/ +harper-core = "2.5.0" +# Used to build the output JSON with correct string escaping. +serde_json = "1" + +[profile.release] +opt-level = 3 +lto = true +codegen-units = 1 diff --git a/harper-ffi/build.sh b/harper-ffi/build.sh new file mode 100755 index 0000000..5447085 --- /dev/null +++ b/harper-ffi/build.sh @@ -0,0 +1,26 @@ +#!/usr/bin/env bash +# Build the UNIVERSAL (Apple Silicon + Intel) Harper static library that the +# Swift app links against: harper-ffi/lib/libharper_ffi.a +# +# Requires the Rust toolchain (rustup) with both macOS targets: +# rustup target add aarch64-apple-darwin x86_64-apple-darwin +set -euo pipefail + +ROOT="$(cd "$(dirname "$0")" && pwd)" +cd "$ROOT" + +# Make cargo available even in non-login shells. +[ -f "$HOME/.cargo/env" ] && source "$HOME/.cargo/env" + +echo "==> cargo build --release (aarch64 + x86_64)" +cargo build --release --target aarch64-apple-darwin +cargo build --release --target x86_64-apple-darwin + +echo "==> lipo -> lib/libharper_ffi.a (universal)" +mkdir -p lib +lipo -create -output lib/libharper_ffi.a \ + target/aarch64-apple-darwin/release/libharper_ffi.a \ + target/x86_64-apple-darwin/release/libharper_ffi.a + +lipo -info lib/libharper_ffi.a +echo "==> done" diff --git a/harper-ffi/include/harper.h b/harper-ffi/include/harper.h new file mode 100644 index 0000000..3518fb6 --- /dev/null +++ b/harper-ffi/include/harper.h @@ -0,0 +1,56 @@ +/* + * harper.h — C ABI for the harper-ffi static library (harper-core 2.5.0). + * + * Link against libharper_ffi.a. All strings are UTF-8. + */ +#ifndef HARPER_FFI_H +#define HARPER_FFI_H + +#ifdef __cplusplus +extern "C" { +#endif + +/* + * Check `text` for grammar/spelling issues using harper-core. + * + * Returns a malloc'd, NUL-terminated UTF-8 JSON C string that the caller MUST + * free with harper_free(). + * + * The JSON is an array of objects: + * [ + * { + * "start": , + * "len": , + * "replacement": "", + * "message": "", + * "kind": "" + * }, + * ... + * ] + * + * Notes on the contract: + * - "start"/"len" are CHAR (Unicode scalar) offsets, matching harper's native + * char indexing. They are NOT byte offsets and NOT UTF-16 code-unit offsets. + * "len" = span.end - span.start (end-exclusive). + * - "replacement" is the FIRST ReplaceWith suggestion's text. If the first + * actionable suggestion is a removal, "replacement" is "" (empty string). + * - Lints with NO actionable suggestion are SKIPPED. + * - "kind" is one of: "spelling", "grammar", "punctuation", "repetition", + * "capitalization", "phrasing". Best-effort; defaults to "grammar". + * + * On a null `text`, invalid UTF-8, or any internal error/panic, returns "[]". + * Never returns NULL on a normal return path. Thread-safe. + */ +char *harper_check(const char *text); + +/* + * Free a string previously returned by harper_check(). + * Passing NULL is a no-op. Do not free the same pointer twice. + */ +void harper_free(char *ptr); + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif /* HARPER_FFI_H */ diff --git a/harper-ffi/src/lib.rs b/harper-ffi/src/lib.rs new file mode 100644 index 0000000..cd6b330 --- /dev/null +++ b/harper-ffi/src/lib.rs @@ -0,0 +1,170 @@ +//! C-ABI FFI bridge exposing harper-core 2.5.0's grammar checker to Swift. +//! +//! Public surface: +//! char* harper_check(const char* text); // malloc'd UTF-8 JSON, free with harper_free +//! void harper_free(char* ptr); +//! +//! Every API call below was written against docs.rs for harper-core 2.5.0. + +use std::ffi::{CStr, CString}; +use std::os::raw::c_char; +use std::panic::{catch_unwind, AssertUnwindSafe}; +use std::sync::{Arc, OnceLock}; + +use harper_core::{Dialect, Document}; +use harper_core::linting::{LintGroup, LintKind, Linter, Suggestion}; +use harper_core::spell::FstDictionary; + +/// Empty JSON array used for null/invalid input and on any panic. +const EMPTY_JSON: &str = "[]"; + +/// The curated FST dictionary is the expensive artifact to build, so build it +/// exactly once and share it across calls/threads via `Arc`. `FstDictionary` +/// is immutable and `Arc` is `Send + Sync`, so this is safe to +/// read from any thread. +/// +/// We intentionally do NOT cache the `LintGroup` itself: `Linter::lint` takes +/// `&mut self`, which would require a `Mutex` and serialize all callers. The +/// `LintGroup` is cheap to reconstruct relative to the dictionary, so we build +/// a fresh one per call from the shared dictionary instead. +fn curated_dictionary() -> Arc { + static DICT: OnceLock> = OnceLock::new(); + DICT.get_or_init(FstDictionary::curated).clone() +} + +/// Map a harper `LintKind` to the lowercase string contract: +/// one of spelling, grammar, punctuation, repetition, capitalization, phrasing. +/// Default is "grammar" for anything not specifically categorized. +fn kind_to_str(kind: LintKind) -> &'static str { + match kind { + LintKind::Spelling | LintKind::Typo => "spelling", + LintKind::Punctuation | LintKind::Formatting => "punctuation", + LintKind::Repetition => "repetition", + LintKind::Capitalization => "capitalization", + // "phrasing"-flavored categories: word choice / style / readability / usage. + LintKind::WordChoice + | LintKind::Style + | LintKind::Readability + | LintKind::Usage + | LintKind::Redundancy + | LintKind::Enhancement + | LintKind::Eggcorn + | LintKind::Malapropism + | LintKind::Nonstandard + | LintKind::Regionalism => "phrasing", + // Grammar-ish / structural categories. + LintKind::Grammar + | LintKind::Agreement + | LintKind::BoundaryError + | LintKind::Miscellaneous => "grammar", + // LintKind may gain variants; default safely. + _ => "grammar", + } +} + +/// Run harper over `text` and produce the JSON contract string. +fn check_to_json(text: &str) -> String { + let dictionary = curated_dictionary(); + + // Build the document with the built-in PlainEnglish parser + curated dictionary. + let document = Document::new_plain_english(text, &dictionary); + + // Fresh curated lint group from the shared dictionary; American dialect. + let mut group = LintGroup::new_curated(dictionary.clone(), Dialect::American); + + // Linter::lint(&mut self, &Document) -> Vec + let lints = group.lint(&document); + + let mut out: Vec = Vec::with_capacity(lints.len()); + for lint in lints { + // span is Span: start/end are CHAR (Unicode scalar) offsets, end-exclusive. + let start = lint.span.start; + let len = lint.span.end.saturating_sub(lint.span.start); + + // Pick the first ReplaceWith suggestion as "replacement". + // If the first actionable suggestion is a Remove, replacement = "". + // InsertAfter is treated as non-replacement here. Lints with no + // actionable suggestion are skipped. + let mut replacement: Option = None; + for suggestion in &lint.suggestions { + match suggestion { + Suggestion::ReplaceWith(chars) => { + replacement = Some(chars.iter().collect()); + break; + } + Suggestion::Remove => { + replacement = Some(String::new()); + break; + } + Suggestion::InsertAfter(_) => {} + } + } + + let replacement = match replacement { + Some(r) => r, + None => continue, + }; + + out.push(serde_json::json!({ + "start": start, + "len": len, + "replacement": replacement, + "message": lint.message, + "kind": kind_to_str(lint.lint_kind), + })); + } + + serde_json::to_string(&out).unwrap_or_else(|_| EMPTY_JSON.to_string()) +} + +/// Allocate a C string for return to the caller. The caller owns it and must +/// free it with `harper_free`. +fn into_c_string(s: String) -> *mut c_char { + match CString::new(s) { + Ok(cstr) => cstr.into_raw(), + Err(_) => CString::new(EMPTY_JSON).unwrap().into_raw(), + } +} + +/// Check `text` for grammar/spelling issues. +/// +/// Returns a malloc'd, NUL-terminated UTF-8 JSON C string the caller MUST free +/// with `harper_free`. On null/invalid-UTF-8 input or on any internal panic, +/// returns the JSON `"[]"`. Never returns null on a normal return path. +/// +/// # Safety +/// `text` must be a valid NUL-terminated C string pointer or null. +#[no_mangle] +pub extern "C" fn harper_check(text: *const c_char) -> *mut c_char { + let result = catch_unwind(AssertUnwindSafe(|| { + if text.is_null() { + return EMPTY_JSON.to_string(); + } + // SAFETY: caller guarantees a valid NUL-terminated C string (non-null checked). + let c_str = unsafe { CStr::from_ptr(text) }; + match c_str.to_str() { + Ok(s) => check_to_json(s), + Err(_) => EMPTY_JSON.to_string(), + } + })); + + match result { + Ok(json) => into_c_string(json), + Err(_) => into_c_string(EMPTY_JSON.to_string()), + } +} + +/// Free a string previously returned by `harper_check`. +/// +/// # Safety +/// `ptr` must be a pointer returned by `harper_check` (or null), freed once. +#[no_mangle] +pub extern "C" fn harper_free(ptr: *mut c_char) { + if ptr.is_null() { + return; + } + // SAFETY: ptr came from CString::into_raw in this module; reclaim and drop it. + unsafe { + drop(CString::from_raw(ptr)); + } +} diff --git a/scripts/build.sh b/scripts/build.sh index 86c8fc3..e04fd1c 100755 --- a/scripts/build.sh +++ b/scripts/build.sh @@ -10,6 +10,10 @@ CONFIG="release" APP="GrammaGem.app" DIST="dist" +echo "==> Building Harper static lib (universal)" +chmod +x harper-ffi/build.sh +./harper-ffi/build.sh + echo "==> Compiling universal (arm64 + x86_64, ${CONFIG})" swift build -c "${CONFIG}" --arch arm64 --arch x86_64 BIN="$(swift build -c "${CONFIG}" --arch arm64 --arch x86_64 --show-bin-path)" From 143620e44e34029b56d77959a83173de38382033 Mon Sep 17 00:00:00 2001 From: BigMarc Date: Thu, 18 Jun 2026 06:43:31 +0200 Subject: [PATCH 3/9] Add Grammarly-style value loop: score, buckets, dismiss, streaks, demo Implements the highest-leverage items from docs/grammarly-value-plan.md: - Live Check: on-device 0-100 writing score, Correctness/Clarity/Polish count chips, and per-suggestion Dismiss / Add-to-dictionary (a cheap, always-available 'no' is what makes 'Apply' feel safe). - Value loop: day-streak, correction milestones and a 'subscription you didn't pay' figure on the dashboard + a streak line in the menu bar (all local, self-vs-self, no telemetry). - First-run demo: a planted sample the real engine cleans in one click, before any permission ask. Co-Authored-By: Claude Opus 4.8 (1M context) --- Sources/GrammaGem/App/AppState.swift | 22 +- .../App/MainWindow/DashboardView.swift | 22 ++ .../App/MainWindow/LiveCheckView.swift | 107 +++++++-- Sources/GrammaGem/App/MenuBarContent.swift | 11 + Sources/GrammaGem/App/OnboardingView.swift | 156 ++++++++++---- Sources/GrammaGem/Core/Models.swift | 36 ++++ Sources/GrammaGem/Grammar/WritingScore.swift | 20 ++ Sources/GrammaGem/Stats/UsageStats.swift | 64 ++++++ Sources/GrammaGem/System/LiveMonitor.swift | 62 +++++- Tests/GrammaGemTests/GrammaGemTests.swift | 61 ++++++ docs/grammarly-value-plan.md | 204 ++++++++++++++++++ 11 files changed, 708 insertions(+), 57 deletions(-) create mode 100644 Sources/GrammaGem/Grammar/WritingScore.swift create mode 100644 docs/grammarly-value-plan.md diff --git a/Sources/GrammaGem/App/AppState.swift b/Sources/GrammaGem/App/AppState.swift index a123b7d..5bb74e4 100644 --- a/Sources/GrammaGem/App/AppState.swift +++ b/Sources/GrammaGem/App/AppState.swift @@ -179,6 +179,26 @@ final class AppState: ObservableObject { usage.recordCorrection(words: 1) } + /// Hide a single suggestion without changing the user's text. + func dismissSuggestion(_ suggestion: Suggestion, in field: DetectedField) { + liveMonitor.dismiss(suggestion, in: field) + } + + /// Add a flagged word to the personal dictionary so it's never corrected + /// again (gated by the free cap), then re-scan so it disappears now. + @discardableResult + func addWordToDictionary(_ word: String) -> FeatureGate.Decision { + let decision = addDictionaryEntry(word) + switch decision { + case .allowed: + lastStatus = "Added “\(word)” to your dictionary" + liveMonitor.refreshSoon() + case .denied(let reason): + lastStatus = reason + } + return decision + } + /// Pause/resume all of GrammaGem (hotkeys + live monitoring). func togglePause() { isPaused.toggle() @@ -258,7 +278,7 @@ final class AppState: ObservableObject { let win = NSWindow(contentViewController: host) win.title = "Welcome to GrammaGem" win.styleMask = [.titled, .closable, .fullSizeContentView] - win.setContentSize(NSSize(width: 540, height: 600)) + win.setContentSize(NSSize(width: 560, height: 720)) win.isReleasedWhenClosed = false win.center() onboardingWindow = win diff --git a/Sources/GrammaGem/App/MainWindow/DashboardView.swift b/Sources/GrammaGem/App/MainWindow/DashboardView.swift index 3b2206b..7bdc8b3 100644 --- a/Sources/GrammaGem/App/MainWindow/DashboardView.swift +++ b/Sources/GrammaGem/App/MainWindow/DashboardView.swift @@ -30,6 +30,15 @@ struct DashboardView: View { StatTile(value: "\(usage.data.totalCorrections)", label: "Corrections made", systemImage: "checkmark.seal.fill", tint: GG.emerald) StatTile(value: timeSaved, label: "Time saved (est.)", systemImage: "clock.fill", tint: .primary) + + StatTile( + value: usage.currentStreak > 0 ? "\(usage.currentStreak)d" : "—", + label: "Day streak", systemImage: "flame.fill", + tint: usage.currentStreak > 0 ? .orange : .secondary) + StatTile( + value: "$\(usage.subscriptionAvoidedUSD)", + label: "Subscription not paid", systemImage: "dollarsign.circle.fill", + tint: GG.emerald) } // Setup health @@ -61,6 +70,19 @@ struct DashboardView: View { .font(.caption).foregroundStyle(.secondary) } + // Next milestone + Card { + let milestone = usage.nextMilestone + HStack { + Text("Next milestone").font(.headline) + Spacer() + Text(milestone.label).font(.caption).foregroundStyle(.secondary) + } + ProgressView(value: milestone.progress).tint(GG.emerald) + Text("\(usage.data.totalCorrections) corrections so far — keep the streak alive.") + .font(.caption).foregroundStyle(.secondary) + } + // Quick actions Card { Text("Quick actions").font(.headline) diff --git a/Sources/GrammaGem/App/MainWindow/LiveCheckView.swift b/Sources/GrammaGem/App/MainWindow/LiveCheckView.swift index 7767c5d..dad4369 100644 --- a/Sources/GrammaGem/App/MainWindow/LiveCheckView.swift +++ b/Sources/GrammaGem/App/MainWindow/LiveCheckView.swift @@ -34,22 +34,32 @@ struct LiveCheckView: View { } private var header: some View { - HStack(spacing: 12) { - VStack(alignment: .leading, spacing: 2) { - Text(summary).font(.headline) - Text(monitor.activeAppName.isEmpty - ? "Checking text areas on screen" - : "In \(monitor.activeAppName) · \(monitor.scannedCount) text area\(monitor.scannedCount == 1 ? "" : "s") checked") - .font(.caption).foregroundStyle(.secondary) - } - Spacer() - Button { monitor.refreshSoon() } label: { Image(systemName: "arrow.clockwise") } - .help("Re-scan now") - if monitor.issueCount > 0 { - Button { app.fixAllDetected() } label: { - Label("Fix everything", systemImage: "checkmark.circle.fill") + VStack(alignment: .leading, spacing: 10) { + HStack(spacing: 12) { + ScoreRing(score: monitor.writingScore) + VStack(alignment: .leading, spacing: 2) { + Text(summary).font(.headline) + Text(contextLine).font(.caption).foregroundStyle(.secondary) + } + Spacer() + Button { monitor.refreshSoon() } label: { Image(systemName: "arrow.clockwise") } + .help("Re-scan now") + if monitor.issueCount > 0 { + Button { app.fixAllDetected() } label: { + Label("Fix everything", systemImage: "checkmark.circle.fill") + } + .buttonStyle(.borderedProminent) + } + } + if monitor.issueCount > 0 { + HStack(spacing: 8) { + ForEach(IssueBucket.allCases) { bucket in + if let n = monitor.bucketCounts[bucket], n > 0 { + BucketChip(bucket: bucket, count: n) + } + } + Spacer() } - .buttonStyle(.borderedProminent) } } .padding(16) @@ -57,10 +67,16 @@ struct LiveCheckView: View { private var summary: String { let issues = monitor.issueCount - if issues == 0 { return "No issues found" } + if issues == 0 { return "Looks clean" } return "\(issues) issue\(issues == 1 ? "" : "s") across \(monitor.fields.count) text area\(monitor.fields.count == 1 ? "" : "s")" } + private var contextLine: String { + monitor.activeAppName.isEmpty + ? "Checking text areas on screen" + : "In \(monitor.activeAppName) · \(monitor.scannedCount) text area\(monitor.scannedCount == 1 ? "" : "s") checked" + } + private var emptyState: some View { VStack(spacing: 10) { Image(systemName: "checkmark.seal.fill").font(.system(size: 42)).foregroundStyle(GG.emerald) @@ -112,9 +128,21 @@ private struct FieldCard: View { } } Spacer() + if s.kind == .spelling { + Button { app.addWordToDictionary(s.original) } label: { + Image(systemName: "book.closed") + } + .controlSize(.small).buttonStyle(.borderless) + .help("Add “\(s.original)” to your dictionary") + } + Button { app.dismissSuggestion(s, in: field) } label: { + Image(systemName: "xmark") + } + .controlSize(.small).buttonStyle(.borderless) + .help("Dismiss this suggestion") if s.replacement != s.original && !s.replacement.isEmpty { Button("Apply") { app.applySuggestion(s, in: field) } - .controlSize(.small) + .controlSize(.small).buttonStyle(.borderedProminent) } } } @@ -141,6 +169,14 @@ private struct FieldCard: View { } } + fileprivate static func color(for bucket: IssueBucket) -> Color { + switch bucket { + case .correctness: return .red + case .clarity: return .blue + case .polish: return GG.gold + } + } + /// Build an attributed string with each issue span tinted. private func highlighted(_ text: String, _ suggestions: [Suggestion]) -> AttributedString { let ns = text as NSString @@ -167,3 +203,40 @@ private struct FieldCard: View { return result } } + +/// A compact 0–100 cleanliness gauge. Green when clean, amber/orange as issues +/// pile up — a meter the user can watch climb as they accept fixes. +private struct ScoreRing: View { + let score: Int + var body: some View { + ZStack { + Circle().stroke(Color.primary.opacity(0.1), lineWidth: 5) + Circle() + .trim(from: 0, to: CGFloat(max(0, min(100, score))) / 100) + .stroke(color, style: StrokeStyle(lineWidth: 5, lineCap: .round)) + .rotationEffect(.degrees(-90)) + .animation(.easeOut(duration: 0.35), value: score) + Text("\(score)").font(.system(size: 15, weight: .bold, design: .rounded)) + } + .frame(width: 44, height: 44) + .help("Writing score for the text on screen") + } + + private var color: Color { + score >= 90 ? GG.emerald : (score >= 70 ? GG.gold : .orange) + } +} + +/// A tappable-looking count chip per issue bucket (Correctness / Clarity / Polish). +private struct BucketChip: View { + let bucket: IssueBucket + let count: Int + var body: some View { + HStack(spacing: 5) { + Circle().fill(FieldCard.color(for: bucket)).frame(width: 7, height: 7) + Text("\(bucket.title) \(count)").font(.caption.weight(.medium)) + } + .padding(.horizontal, 9).padding(.vertical, 4) + .background(FieldCard.color(for: bucket).opacity(0.12), in: Capsule()) + } +} diff --git a/Sources/GrammaGem/App/MenuBarContent.swift b/Sources/GrammaGem/App/MenuBarContent.swift index ad71c13..dc78fc9 100644 --- a/Sources/GrammaGem/App/MenuBarContent.swift +++ b/Sources/GrammaGem/App/MenuBarContent.swift @@ -65,6 +65,7 @@ struct MenuBarContent: View { Divider() usageRow + valueRow Divider() @@ -152,6 +153,16 @@ struct MenuBarContent: View { } } + /// One always-visible value reminder: the streak + lifetime corrections. + @ViewBuilder + private var valueRow: some View { + if app.usage.currentStreak > 1 { + Label("\(app.usage.currentStreak)-day streak · \(app.usage.data.totalCorrections) corrections", + systemImage: "flame.fill") + .font(.caption).foregroundStyle(.secondary) + } + } + private func actionRow(title: String, shortcut: String?, action: @escaping () -> Void) -> some View { Button(action: action) { HStack { diff --git a/Sources/GrammaGem/App/OnboardingView.swift b/Sources/GrammaGem/App/OnboardingView.swift index 22d7b0c..8527961 100644 --- a/Sources/GrammaGem/App/OnboardingView.swift +++ b/Sources/GrammaGem/App/OnboardingView.swift @@ -14,56 +14,69 @@ struct OnboardingView: View { } var body: some View { - VStack(alignment: .leading, spacing: 18) { - VStack(alignment: .leading, spacing: 6) { - Text("Welcome to GrammaGem") - .font(.largeTitle.bold()) - Text("A private, on-device writing assistant that works in every app.") - .foregroundStyle(.secondary) - } - - stepCard( - number: 1, - title: "Grant Accessibility access", - body: "GrammaGem reads the text you select and writes the correction back. macOS requires Accessibility permission for this. Your text is processed on-device and never leaves your Mac.", - granted: permissions.accessibilityTrusted - ) { - if permissions.accessibilityTrusted { - Label("Permission granted", systemImage: "checkmark.circle.fill") - .foregroundStyle(.green) - } else { - HStack { - Button("Open System Settings") { permissions.openAccessibilitySettings() } - Button("Request permission") { permissions.requestAccessibility() } + VStack(spacing: 0) { + ScrollView { + VStack(alignment: .leading, spacing: 18) { + VStack(alignment: .leading, spacing: 6) { + Text("Welcome to GrammaGem") + .font(.largeTitle.bold()) + Text("A private, on-device writing assistant that works in every app.") + .foregroundStyle(.secondary) + } + + // The rigged win: prove the value in one click, before any ask. + VStack(alignment: .leading, spacing: 10) { + Label("See it work", systemImage: "wand.and.stars").font(.headline) + DemoStep() + } + .padding(16) + .background(GG.emerald.opacity(0.06), in: RoundedRectangle(cornerRadius: 12)) + .overlay(RoundedRectangle(cornerRadius: 12).stroke(GG.emerald.opacity(0.25))) + + stepCard( + number: 1, + title: "Turn it on everywhere", + body: "GrammaGem reads the text you select and writes the correction back. macOS requires Accessibility permission for this. Your text is processed on-device and never leaves your Mac.", + granted: permissions.accessibilityTrusted + ) { + if permissions.accessibilityTrusted { + Label("Permission granted", systemImage: "checkmark.circle.fill") + .foregroundStyle(.green) + } else { + HStack { + Button("Open System Settings") { permissions.openAccessibilitySettings() } + Button("Request permission") { permissions.requestAccessibility() } + } + Text("This updates automatically once you flip GrammaGem on in Accessibility.") + .font(.caption).foregroundStyle(.secondary) + } + } + + stepCard( + number: 2, + title: "Download the on-device model (optional)", + body: "Grammar & spelling work instantly with no download. The AI rewrite/tone/Ask features use a small model downloaded once from Hugging Face — then everything runs offline.", + granted: model.state == .ready + ) { + ModelDownloadControls() } - Text("This updates automatically once you flip GrammaGem on in Accessibility.") - .font(.caption).foregroundStyle(.secondary) } + .padding(28) } - stepCard( - number: 2, - title: "Download the on-device model (optional)", - body: "Grammar & spelling work instantly with no download. The AI rewrite/tone/Ask features use a small model downloaded once from Hugging Face — then everything runs offline.", - granted: model.state == .ready - ) { - ModelDownloadControls() - } - - Spacer() + Divider() HStack { - if permissions.accessibilityTrusted { - Label("You're all set", systemImage: "sparkles").foregroundStyle(.secondary) - } + Label("Yours once. No subscription, nothing leaves your Mac.", systemImage: "lock.shield") + .font(.caption).foregroundStyle(.secondary) Spacer() Button(permissions.accessibilityTrusted ? "Done" : "Continue without permission") { app.showOnboardingDismiss() } .keyboardShortcut(.defaultAction) } + .padding(.horizontal, 28).padding(.vertical, 14) } - .padding(28) .frame(maxWidth: .infinity, maxHeight: .infinity, alignment: .topLeading) .onAppear { permissions.startPollingUntilGranted() @@ -98,6 +111,75 @@ struct OnboardingView: View { } } +/// A safe, on-rails first-run demo: a local sample with planted mistakes that +/// the REAL grammar engine fixes in one click. It operates on a plain string +/// (never a live Accessibility element), so it's completely risk-free — the +/// "guaranteed visible win" before GrammaGem asks for anything. +private struct DemoStep: View { + @State private var text = "i has wrote alot of mistakes here, and it dont look profesional" + @State private var issues: [Suggestion] = [] + @State private var cleaned = false + + var body: some View { + VStack(alignment: .leading, spacing: 10) { + Text(headline) + .font(.subheadline.weight(.semibold)) + .foregroundStyle(cleaned ? GG.emerald : .primary) + Text(highlighted) + .font(.callout) + .frame(maxWidth: .infinity, alignment: .leading) + .padding(10) + .background(Color(nsColor: .textBackgroundColor), in: RoundedRectangle(cornerRadius: 8)) + .animation(.easeInOut(duration: 0.35), value: text) + Button { + let fixed = AppState.shared.grammar.correct(text) + withAnimation(.easeOut(duration: 0.4)) { + text = fixed + issues = [] + cleaned = true + } + } label: { + Label(cleaned ? "All clean" : "Clean it up", + systemImage: cleaned ? "checkmark.circle.fill" : "wand.and.stars") + } + .buttonStyle(.borderedProminent) + .disabled(cleaned || issues.isEmpty) + } + .onAppear { + if issues.isEmpty && !cleaned { issues = AppState.shared.grammar.check(text) } + } + } + + private var headline: String { + if cleaned { return "Clean ✨ — GrammaGem does this in every app you type." } + if issues.isEmpty { return "Checking…" } + return "We spotted \(issues.count) thing\(issues.count == 1 ? "" : "s") to tidy up — one click fixes them." + } + + private var highlighted: AttributedString { + let ns = text as NSString + var result = AttributedString() + var cursor = 0 + for s in issues.sorted(by: { $0.location < $1.location }) { + guard s.location >= cursor, s.length > 0, s.location + s.length <= ns.length else { continue } + if s.location > cursor { + result += AttributedString(ns.substring(with: NSRange(location: cursor, length: s.location - cursor))) + } + var run = AttributedString(ns.substring(with: s.range)) + let tint: Color = s.kind == .spelling ? .red : .orange + run.backgroundColor = tint.opacity(0.18) + run.foregroundColor = tint + run.underlineStyle = .single + result += run + cursor = s.location + s.length + } + if cursor < ns.length { + result += AttributedString(ns.substring(with: NSRange(location: cursor, length: ns.length - cursor))) + } + return result + } +} + /// Real model download progress + controls, shared by onboarding and settings. struct ModelDownloadControls: View { @ObservedObject private var model: ModelManager diff --git a/Sources/GrammaGem/Core/Models.swift b/Sources/GrammaGem/Core/Models.swift index d927e32..2676d8f 100644 --- a/Sources/GrammaGem/Core/Models.swift +++ b/Sources/GrammaGem/Core/Models.swift @@ -42,6 +42,42 @@ enum GrammarKind: String, Codable { case phrasing case repetition case capitalization + + /// Severity weight — drives card ordering and the writing-score penalty. + /// Objective errors (spelling, grammar) weigh most. + var severity: Int { + switch self { + case .spelling, .grammar: return 3 + case .punctuation, .capitalization: return 2 + case .repetition, .phrasing: return 1 + } + } + + /// User-facing grouping shown as filter chips in the Live Check panel. + var bucket: IssueBucket { + switch self { + case .spelling, .grammar, .punctuation: return .correctness + case .phrasing: return .clarity + case .repetition, .capitalization: return .polish + } + } +} + +/// Our own named issue groups (deliberately NOT Grammarly's exact buckets/words): +/// objective errors, clarity rewrites, and stylistic polish. +enum IssueBucket: String, CaseIterable, Identifiable { + case correctness + case clarity + case polish + + var id: String { rawValue } + var title: String { + switch self { + case .correctness: return "Correctness" + case .clarity: return "Clarity" + case .polish: return "Polish" + } + } } /// A single grammar suggestion over a span of the input text. diff --git a/Sources/GrammaGem/Grammar/WritingScore.swift b/Sources/GrammaGem/Grammar/WritingScore.swift new file mode 100644 index 0000000..dd1988a --- /dev/null +++ b/Sources/GrammaGem/Grammar/WritingScore.swift @@ -0,0 +1,20 @@ +import Foundation + +/// A deterministic, on-device "cleanliness" score (0–100) for a chunk of text. +/// +/// Honest by construction: it's defined relative to *this* text — weighted issues +/// per 100 words — never a hidden cloud cohort, and grammar/spelling are always +/// fully resolvable, so a clean document genuinely reaches 100. (Contrast with +/// Grammarly's percentile-vs-other-users score, which needs telemetry + an +/// account; see docs/grammarly-value-plan.md §5.) +enum WritingScore { + /// - Parameters: + /// - weightedIssues: sum of `GrammarKind.severity` across outstanding issues. + /// - words: total words in the scanned text. + static func score(weightedIssues: Int, words: Int) -> Int { + guard words > 0 else { return 100 } + let perHundredWords = Double(weightedIssues) / Double(words) * 100.0 + // Each weighted issue per 100 words costs ~4 points; clamp to 0…100. + return max(0, min(100, Int((100.0 - perHundredWords * 4.0).rounded()))) + } +} diff --git a/Sources/GrammaGem/Stats/UsageStats.swift b/Sources/GrammaGem/Stats/UsageStats.swift index 3495f35..47e90c4 100644 --- a/Sources/GrammaGem/Stats/UsageStats.swift +++ b/Sources/GrammaGem/Stats/UsageStats.swift @@ -8,9 +8,15 @@ final class UsageStats: ObservableObject { var totalCorrections = 0 var totalAIActions = 0 var totalWords = 0 + var activeDays = 0 // distinct days with ≥1 action (lifetime) + var firstUseDay: String? // "yyyy-MM-dd" of first ever action var perDay: [String: Int] = [:] // "yyyy-MM-dd" -> actions that day } + /// What a Grammarly-style subscription runs per year (USD) — used only for the + /// honest, local "subscription you didn't pay" figure. GrammaGem is one-time. + static let comparableAnnualSubscriptionUSD = 144.0 + @Published private(set) var data: Snapshot private let key = "GrammaGem.usageStats" @@ -52,6 +58,60 @@ final class UsageStats: ObservableObject { (data.totalCorrections * 8 + data.totalAIActions * 45) / 60 } + // MARK: - Value loop (streak / milestones / subscription-you-didn't-pay) + + /// Consecutive days, ending today or yesterday, with at least one action. + var currentStreak: Int { Self.streak(perDay: data.perDay, asOf: Date()) } + + /// The Grammarly subscription you DIDN'T pay: their annual price prorated over + /// how long you've owned GrammaGem. Honest, local, illustrative — and it only + /// grows, which is the point of a one-time purchase (see the value plan §5). + var subscriptionAvoidedUSD: Int { + Self.subscriptionAvoidedUSD( + firstUseDay: data.firstUseDay, asOf: Date(), + annualPrice: Self.comparableAnnualSubscriptionUSD) + } + + /// The next correction milestone and progress toward it (for a nudge/badge). + var nextMilestone: (target: Int, label: String, progress: Double) { + Self.nextMilestone(corrections: data.totalCorrections) + } + + // MARK: - Pure helpers (unit-testable; no UserDefaults / wall clock) + + static func streak(perDay: [String: Int], asOf now: Date) -> Int { + let cal = Calendar.current + func used(_ day: Date) -> Bool { (perDay[fmt.string(from: day)] ?? 0) > 0 } + var day = now + if !used(day) { + // Streak is still alive if used yesterday but not yet today. + day = cal.date(byAdding: .day, value: -1, to: day) ?? day + if !used(day) { return 0 } + } + var streak = 0 + while used(day) { + streak += 1 + day = cal.date(byAdding: .day, value: -1, to: day) ?? day + } + return streak + } + + static func subscriptionAvoidedUSD(firstUseDay: String?, asOf now: Date, annualPrice: Double) -> Int { + guard let first = firstUseDay, let firstDate = fmt.date(from: first) else { return 0 } + let days = max(1, Calendar.current.dateComponents([.day], from: firstDate, to: now).day ?? 0) + return Int((Double(days) / 365.0 * annualPrice).rounded()) + } + + static func nextMilestone(corrections: Int) -> (target: Int, label: String, progress: Double) { + let targets = [100, 500, 1_000, 5_000, 10_000, 50_000, 100_000] + let target = targets.first { $0 > corrections } ?? (((corrections / 100_000) + 1) * 100_000) + let previous = targets.last { $0 <= corrections } ?? 0 + let span = max(1, target - previous) + let progress = min(1.0, Double(corrections - previous) / Double(span)) + let label = target >= 1_000 ? "\(target / 1_000)k corrections" : "\(target) corrections" + return (target, label, progress) + } + /// Counts for the last 7 calendar days, oldest → newest, for a small chart. func last7Days() -> [(label: String, count: Int)] { let cal = Calendar.current @@ -71,6 +131,10 @@ final class UsageStats: ObservableObject { private func bumpToday() { let k = Self.fmt.string(from: Date()) + if data.perDay[k] == nil { // first action on a brand-new day + data.activeDays += 1 + if data.firstUseDay == nil { data.firstUseDay = k } + } data.perDay[k, default: 0] += 1 // Keep only ~60 days of history. if data.perDay.count > 70 { diff --git a/Sources/GrammaGem/System/LiveMonitor.swift b/Sources/GrammaGem/System/LiveMonitor.swift index 8d9124c..2cc22ff 100644 --- a/Sources/GrammaGem/System/LiveMonitor.swift +++ b/Sources/GrammaGem/System/LiveMonitor.swift @@ -25,12 +25,34 @@ struct DetectedField: Identifiable { final class LiveMonitor: ObservableObject { @Published private(set) var fields: [DetectedField] = [] @Published private(set) var scannedCount = 0 + @Published private(set) var scannedWordCount = 0 @Published private(set) var activeAppName = "" @Published private(set) var running = false /// Total number of issues across all detected text areas. var issueCount: Int { fields.reduce(0) { $0 + $1.suggestions.count } } + /// Outstanding issues grouped into the user-facing buckets (for filter chips). + var bucketCounts: [IssueBucket: Int] { + var counts: [IssueBucket: Int] = [:] + for field in fields { + for s in field.suggestions { counts[s.kind.bucket, default: 0] += 1 } + } + return counts + } + + /// 0–100 on-device cleanliness score for the text currently on screen. + var writingScore: Int { + let weighted = fields.reduce(0) { acc, f in + acc + f.suggestions.reduce(0) { $0 + $1.kind.severity } + } + return WritingScore.score(weightedIssues: weighted, words: scannedWordCount) + } + + /// Content keys of suggestions the user has dismissed; survives re-scans so a + /// dismissed issue doesn't reappear on the next poll. + private var dismissedKeys: Set = [] + private let grammar: GrammarEngine private let detector: AppDetector private let exclusions: Exclusions @@ -88,6 +110,36 @@ final class LiveMonitor: ObservableObject { refreshSoon() } + // MARK: - Dismissing (hide a suggestion without applying it) + + /// Hide one suggestion. A cheap, always-available "no" is what makes saying + /// "yes" (Apply) feel safe. The dismissal is keyed by content so it persists + /// across re-scans of unchanged text. + func dismiss(_ suggestion: Suggestion, in field: DetectedField) { + dismissedKeys.insert(Self.dismissKey(fieldID: field.id, suggestion)) + fields = filterDismissed(fields) + } + + private static func dismissKey(fieldID: String, _ s: Suggestion) -> String { + "\(fieldID)|\(s.location)|\(s.length)|\(s.original)|\(s.replacement)" + } + + private func filterDismissed(_ input: [DetectedField]) -> [DetectedField] { + input.compactMap { f in + let remaining = f.suggestions.filter { + !dismissedKeys.contains(Self.dismissKey(fieldID: f.id, $0)) + } + guard !remaining.isEmpty else { return nil } + return DetectedField(id: f.id, label: f.label, roleName: f.roleName, + text: f.text, suggestions: remaining, + element: f.element, isFocused: f.isFocused) + } + } + + private static func wordCount(_ s: String) -> Int { + s.split { $0.isWhitespace || $0.isNewline }.count + } + /// Correct the element's *current* value (never a stale snapshot), so any /// keystrokes entered since the scan are preserved. private func applyCorrection(to field: DetectedField) -> Int { @@ -156,6 +208,11 @@ final class LiveMonitor: ObservableObject { guard generation == scanGeneration else { return } // superseded by a newer scan guard !scanned.isEmpty else { clear(); return } + // Total words across ALL scanned fields (clean ones included) so the + // writing score is honest about the whole on-screen text, not just the + // fields that happen to have issues. + scannedWordCount = scanned.reduce(0) { $0 + Self.wordCount($1.text) } + // Change detection includes focus + element identity so tabbing between // same-text fields still updates the focused indicator. var hasher = Hasher() @@ -179,16 +236,17 @@ final class LiveMonitor: ObservableObject { text: f.text, suggestions: suggestions, element: f.element, isFocused: f.isFocused)) } detected.sort { ($0.isFocused ? 0 : 1) < ($1.isFocused ? 0 : 1) } - fields = detected + fields = filterDismissed(detected) } private nonisolated static func systemFocusedElement() -> AXUIElement? { - AX.copyElement(AXUIElementCreateSystemWide(), kAXFocusedUIElementAttribute) + AX.focusedElement() } private func clear() { if !fields.isEmpty { fields = [] } scannedCount = 0 + scannedWordCount = 0 lastHash = 0 } } diff --git a/Tests/GrammaGemTests/GrammaGemTests.swift b/Tests/GrammaGemTests/GrammaGemTests.swift index 17f4c96..24a23e4 100644 --- a/Tests/GrammaGemTests/GrammaGemTests.swift +++ b/Tests/GrammaGemTests/GrammaGemTests.swift @@ -49,6 +49,67 @@ final class GrammaGemTests: XCTestCase { XCTAssertFalse(suggestions.contains { $0.original.lowercased() == "teh" }) } + /// Real Harper does true grammar NSSpellChecker can't: subject-verb + /// agreement and verb-form correction, applied cleanly in place. + func testHarperRealGrammarCorrections() { + let harper = HarperEngine() + let fixed = harper.correct("She dont like it and she have went home.") + XCTAssertTrue(fixed.contains("don't"), "dont -> don't") + XCTAssertTrue(fixed.contains("has"), "have -> has (subject-verb agreement)") + XCTAssertTrue(fixed.contains("gone"), "went -> gone (past participle)") + XCTAssertFalse(fixed.contains("went"), "the wrong verb form should be gone") + } + + /// The trust bug: a mid-sentence spelling fix must keep the original casing. + func testSpellingReplacementPreservesCase() { + XCTAssertEqual(SystemGrammarEngine.matchingCase(of: "problemm", in: "Problem"), "problem") + XCTAssertEqual(SystemGrammarEngine.matchingCase(of: "Teh", in: "the"), "The") + XCTAssertEqual(SystemGrammarEngine.matchingCase(of: "teh", in: "the"), "the") + XCTAssertEqual(SystemGrammarEngine.matchingCase(of: "HELLOO", in: "hello"), "HELLO") + } + + /// Harper returns char (Unicode scalar) offsets; they must map exactly onto + /// UTF-16 NSRange offsets even past multi-UTF-16-unit scalars (emoji). + func testHarperCharOffsetsMapToUTF16() { + let text = "😀 teh" // 😀 = 1 scalar / 2 UTF-16 units + let range = HarperEngine.utf16Range(scalarStart: 2, scalarLen: 3, in: text) + XCTAssertEqual(range, NSRange(location: 3, length: 3)) + XCTAssertEqual((text as NSString).substring(with: range!), "teh") + } + + // MARK: - Value loop (streak / subscription-avoided / milestones) + + @MainActor + func testValueLoopMetrics() { + let fmt = DateFormatter() + fmt.dateFormat = "yyyy-MM-dd" + fmt.locale = Locale(identifier: "en_US_POSIX") + fmt.timeZone = .current + let cal = Calendar.current + let now = Date() + func key(_ daysAgo: Int) -> String { + fmt.string(from: cal.date(byAdding: .day, value: -daysAgo, to: now)!) + } + + // today + yesterday + 2-days-ago = streak of 3 (the day-4 entry is broken off). + let perDay = [key(0): 2, key(1): 1, key(2): 5, key(4): 1] + XCTAssertEqual(UsageStats.streak(perDay: perDay, asOf: now), 3) + XCTAssertEqual(UsageStats.streak(perDay: [:], asOf: now), 0) + // Used yesterday but not yet today — streak is still alive. + XCTAssertEqual(UsageStats.streak(perDay: [key(1): 1], asOf: now), 1) + + // ~1 year of ownership ≈ one year of the subscription you didn't pay. + XCTAssertEqual( + UsageStats.subscriptionAvoidedUSD(firstUseDay: key(365), asOf: now, annualPrice: 144), 144) + XCTAssertEqual( + UsageStats.subscriptionAvoidedUSD(firstUseDay: nil, asOf: now, annualPrice: 144), 0) + + let m = UsageStats.nextMilestone(corrections: 50) + XCTAssertEqual(m.target, 100) + XCTAssertEqual(m.progress, 0.5, accuracy: 0.001) + XCTAssertEqual(UsageStats.nextMilestone(corrections: 100).target, 500) + } + // MARK: - Modes func testFreeTierGetsOnlyPolishMode() { diff --git a/docs/grammarly-value-plan.md b/docs/grammarly-value-plan.md new file mode 100644 index 0000000..a37e54c --- /dev/null +++ b/docs/grammarly-value-plan.md @@ -0,0 +1,204 @@ +# Grammarly Value Teardown -> GrammaGem Plan + +*Senior product + Swift engineering review. Every claim below is grounded in the current GrammaGem source. File references use absolute paths; the load-bearing bug is the mis-casing in `SystemGrammarEngine.swift:42-45`.* + +--- + +## 1. Executive summary — what makes Grammarly FEEL valuable (priority order) + +Grammarly's perceived value is NOT its grammar engine. It is a stack of interaction and psychology layers on top of a competent engine. Ranked by leverage for a one-time-purchase, on-device Mac utility: + +1. **Trustworthy correction quality (the foundation).** Every felt-value mechanic above it collapses if a fix is wrong. Grammarly's "accept-accept-accept" rhythm only works because in-place application is reliable and casing/context is preserved. GrammaGem's engine currently *demonstrably violates this* (`problemm` -> `Problem` mid-sentence). Fix this first; nothing else matters until it's solid. + +2. **The fix-as-button atomic loop: read the fix and apply it in one motion.** Grammarly's clickable green replacement chip collapses diagnosis + remedy + action into a single low-friction act, with a cheap, always-present dismiss so saying no is as easy as saying yes. GrammaGem has an `Apply` button but no dismiss/ignore/add-to-dictionary, no keyboard accept, and the apply path is brittle (whole-field AX overwrite). + +3. **Categorization + counts + a score: turning a wall of red into a finite, beatable list.** Four named, color-coded buckets, per-category count chips, one running issue badge, and a 0-100 score convert dread into a checklist with a meter that only goes up. GrammaGem has a raw issue count (3 colors) and *zero* score concept. + +4. **The rigged first-run "wow": guaranteed visible win in under 60 seconds.** A pre-seeded, error-salted demo doc means the product proves itself before asking for anything. GrammaGem's onboarding only handles Accessibility + model download — it never demonstrates the correction loop at all. + +5. **Ongoing perceived value without surveillance: progress you can see.** Grammarly uses cloud percentiles + weekly behavioral emails. GrammaGem can recreate the *feeling* — self-vs-self, fully on-device — with a local score trend, streaks, milestones, and a "subscription you didn't pay" money figure. The plumbing (`UsageStats.perDay`) already exists. + +6. **The generative "writing partner" layer: hand me the better sentence, not just the flag.** Sentence rewrites, tone detection/adjustment, conciseness. This is real value but is currently 100% simulated (`MLXEngine.swift` is a string-hack stub) and gated by a daily counter. It is the right *paid* tier, but it must produce real output before it can be sold. + +The strategic asymmetry to exploit throughout: every Grammarly value moment carries an implicit "and you'll pay again next year." GrammaGem's identical mechanics should be framed "yours once, forever, on this Mac." + +--- + +## 2. Mechanic-by-mechanic: how Grammarly does it -> how GrammaGem should do it + +### Mechanic 1 — Trustworthy correction quality (see §3 for the full engineering plan) +- **Grammarly:** ranks by confidence, suppresses low-confidence edits, never garbles surrounding text, preserves casing, and limits bulk-apply to high-confidence objective mechanics only. +- **GrammaGem today:** `SystemGrammarEngine` blindly trusts `NSSpellChecker.correction(forWordRange:)`, which is sentence-position-aware and capitalizes a word it thinks starts a sentence — producing `problemm` -> `Problem` mid-sentence (`SystemGrammarEngine.swift:42-45`). `Suggestion` has no confidence/severity/alternatives (`Models.swift:48-59`). Default `correct()` applies *every* suggestion including no-op grammar flags where `replacement == original` (`GrammarEngine.swift:22-29`). +- **Do:** real Harper FFI; case/whitespace post-processing; add `confidence`/`severity`/`alternatives` to `Suggestion`; never auto-apply no-ops or low-confidence flags. +- **Files:** `SystemGrammarEngine.swift`, `HarperEngine.swift`, `GrammarEngine.swift`, `Models.swift`, `harper-ffi/`. +- **Impact: high · Effort: L** + +### Mechanic 2 — The fix-as-button atomic loop (+ dismiss / ignore / add-to-dictionary) +- **Grammarly:** the suggested word *is* the button (green = go/safe/done); an always-present cheap dismiss (trash/Esc) and add-to-dictionary make accepting feel safe; Tab-to-navigate / Enter-to-accept / Esc-to-dismiss removes the mouse round-trip. +- **GrammaGem today:** `FieldCard` shows a message + one `original -> replacement` + a small `Apply` button (`LiveCheckView.swift:104-119`). There is **no dismiss, no ignore, no add-to-dictionary, no keyboard accept.** Per-issue `apply()` bails silently if the field changed at all since the snapshot (`LiveMonitor.swift:82-89`), and even single-issue apply rewrites the *whole* AX value (`LiveMonitor.swift:101-103`), risking caret/undo/formatting loss. +- **Do (realistic for a cross-app AX tool — we cannot draw a green chip inside arbitrary apps):** + - Make the replacement text itself the primary tappable control in the card (the chip *is* the fix), styled by category color. + - Add a per-suggestion overflow: **Dismiss** (model a `dismissedIDs: Set` on the monitor so it survives re-scans), **Ignore word** / **Add to dictionary** (route into `PersonalDictionary` -> `ignoreList`), gated by `freeDictionaryCap`. + - Add **keyboard flow inside the Live Check panel**: ↑/↓ or Tab to move selection, Return to apply, Delete/Esc to dismiss. This is fully feasible because the panel is our own SwiftUI window. + - Replace whole-field AX write with **targeted span insertion** where the element supports `kAXSelectedTextRangeAttribute` + `kAXSelectedTextAttribute` (set selection to the issue range, then set selected text to the replacement) — preserves caret and undo. Fall back to whole-value only when selection-set is unsupported. + - Make per-issue apply **rebase** instead of bail: if the live value changed, re-locate the span by matching `original` near the old offset rather than refusing to act. +- **Files:** `LiveCheckView.swift`, `LiveMonitor.swift`, `Models.swift`, `PersonalDictionary.swift`, `AppState.swift`, `TextCapture`. +- **Impact: high · Effort: M** + +### Mechanic 3 — Categorization, counts, and an on-device document score +- **Grammarly:** four named buckets (Correctness/Clarity/Engagement/Delivery) each with a color and a count chip that doubles as a filter; one master running badge; a 0-100 percentile score that ticks up on every accept; cards ordered by severity (objective errors first) so the early wins build trust. +- **GrammaGem today:** `GrammarKind` has 6 cases but `.punctuation` is dead; the panel reduces everything to 3 dot colors (`LiveCheckView.swift:136-142`); `issueCount` is a raw sum (`LiveMonitor.swift:32`); there is **no score, no per-category chips, no severity ordering, no filter**. +- **Do (on-device, no cloud, no percentile-vs-others):** + - Introduce GrammaGem's own named buckets that fit the engine: e.g. **Correctness** (spelling/grammar/punctuation), **Clarity** (phrasing/conciseness — from the real LLM), **Polish** (repetition/capitalization/style). Use original color semantics (do NOT clone Grammarly's exact red/blue/green/purple mapping or wording). + - Add **count chips per bucket** in the panel header that filter the card list; keep the menu-bar badge as the master tally (`MenuBarLabel`). + - Compute a **local cleanliness score** at check-time: a deterministic function of issues-per-100-words by severity (e.g. `100 - weighted_issues`). It is honest because it's defined relative to *this document*, not a hidden user corpus. Show it on the card header and trend it on the dashboard. + - **Order cards by severity then document position** (objective spelling/grammar first) so the first accept is a high-confidence win. + - Critical: the score must reflect the *honest* free promise — grammar/spelling is unlimited and fully resolvable, so a free user CAN reach a clean score. Do **not** manufacture a permanently-nonzero count to force upgrades (that's Grammarly's locked-bucket trick and it contradicts our positioning — see §5). +- **Files:** `Models.swift` (`GrammarKind` cleanup, add `severity`), `LiveMonitor.swift`, `LiveCheckView.swift`, `MenuBarContent.swift`, `DashboardView.swift`, a new `WritingScore` helper. +- **Impact: high · Effort: M** + +### Mechanic 4 — The first-run "wow" (see §4 for the full sequence) +- **Grammarly:** land in an error-salted demo doc -> "we found N issues" -> one-click fixes vanish underlines + decrement counter -> goal setup -> install-everywhere prompt at the dopamine peak. +- **GrammaGem today:** `OnboardingView` only covers Accessibility + model download (`OnboardingView.swift`); it never shows the correction loop. +- **Do:** add an in-app demo step with a pre-seeded sample, a "we found N things to fix" reveal, and a satisfying one-click-to-clean animation — *before* asking for nothing-but-praise (no install-everywhere pressure; we're already system-wide). Detail in §4. +- **Files:** `OnboardingView.swift`, plus a small `DemoDocument` view reusing the highlight + apply UI. +- **Impact: high · Effort: M** + +### Mechanic 5 — Ongoing perceived value (privacy-native, self-vs-self) +- **Grammarly:** 0-100 score, weekly Insights email ("more productive than X% of users"), lifetime words-checked counter, streaks — all cloud + behavioral-email, the exact surveillance we market against. +- **GrammaGem today:** `UsageStats` tracks `totalCorrections`, `totalAIActions`, `totalWords`, and `perDay` (`UsageStats.swift`); the dashboard shows four tiles + a 7-bar chart, but **no score, no streak, no week-over-week, no milestone, no money-saved figure**. `estimatedMinutesSaved` is a crude untuned constant (`8s/correction + 45s/AI-action`). Stats are invisible outside the main window. +- **Do (all local, no telemetry, stops nagging the moment they own it):** + - **Local writing-score trend** on the dashboard (from Mechanic 3), compared only to the user's own past. + - **Streak + milestones** from existing `perDay` data ("7-day streak", "1,000th correction", "100k words polished") — cheap, high word-of-mouth, and the right re-engagement hook for a no-renewal product. + - **"Subscription you didn't pay" figure** — translate usage into money: the marketing site already hammers "~\$144/yr vs pay once," but the *app* never does. Show "You've polished N times — that's the price of GrammaGem recovered M times over," computed locally. This is the strongest one-time-purchase value teaser and it lives where the user actually is. + - **Week-over-week delta** on the bar chart and a lightweight in-app weekly recap card (NOT an email; no pipeline, no surveillance). + - **Surface one stat in the menu bar dropdown** (the most-seen surface) so value reminders don't require opening the dashboard. + - Tune `estimatedMinutesSaved` to scale by words changed / action type so the headline "was it worth it?" number is credible. +- **Files:** `UsageStats.swift`, `DashboardView.swift`, `MenuBarContent.swift`, `web/src/lib/content.ts` (replace PLACEHOLDER stats/testimonials before launch). +- **Impact: high · Effort: M** + +### Mechanic 6 — The generative "writing partner" layer (real LLM, honest gating) +- **Grammarly:** sentence rewrites ("Replace with This Version" + Highlight-Changes diff), tone detection (emoji + label), tone adjustment, conciseness, GrammarlyGO — all one-click, reversible, before/after. +- **GrammaGem today:** `MLXEngine` is a stub doing `replacingOccurrences` string hacks (`MLXEngine.swift`); `tidy()` even re-introduces casing risk; `detectTone` keys off substrings. `ModelManager` downloads real weights but nothing loads them. Gated by `freeDailyAIActions = 10` shared across rewrite/tone/Ask/translate. +- **Do:** + - Wire the **real MLX model** from `ModelManager.modelsDirectory` (the download is currently a dead-end); uncomment `mlx-swift` in `Package.swift`. + - Adopt the **one-click + reversible + before/after diff** delivery contract for every rewrite — this is what neutralizes "the AI is taking over my voice." + - Keep the **honest quantity gate**: free users get *real, full-quality* output, just rationed (the daily counter), plus Polish mode only. This is the parity-respecting tease — satisfaction-driven ("I keep hitting the limit / I want my own modes / I want it on my other Mac"), not anxiety-driven. + - Real **tone detection** (label + emoji) is the highest-value non-grammar feature; it delivers value on grammatically perfect text. Build it once the model is live. +- **Files:** `MLXEngine.swift`, `AIEngine.swift`, `ModelManager.swift`, `Package.swift`, `FeatureGate.swift`, `TextReplacementCoordinator.swift`, `WritingModesView.swift`. +- **Impact: high · Effort: L** (model integration is the long pole) + +--- + +## 3. Correction-QUALITY: the path to trustworthy fixes (this underpins ALL perceived value) + +The engine is the load-bearing wall. Today it is `NSSpellChecker` + a ~6-rule regex stub, and it ships a trust-destroying casing bug. Here is the ordered path. + +### 3.1 Fix the casing/whitespace bug NOW (cheap, immediate) +Root cause: `SystemGrammarEngine.swift:42-45` blindly uses `checker.correction(forWordRange:)`, which is sentence/position-aware and returns a capitalized guess for a token it believes starts a sentence — so a mid-sentence `problemm` comes back `Problem`. + +**Post-process every spelling replacement to preserve the original token's casing** unless the token is a true sentence start or proper noun: +- If `original` is all-lowercase, lowercase the replacement's first letter. +- If `original` is Capitalized (single leading cap), match that. +- If `original` is ALL-CAPS, upper-case the replacement. +- Only adopt the corrector's case when the token is at a genuine sentence boundary (preceded by `.?!` + space, or string start). Also trim/normalize whitespace so a replacement never injects a stray leading/trailing space. + +This is a ~20-line transcase helper applied at suggestion-build time. It removes the single most visible trust failure before any deeper work. + +### 3.2 Stop auto-applying garbage +- `GrammarEngine.correct()` (`GrammarEngine.swift:22-29`) applies **every** suggestion including grammar flags where `replacement == original` (the no-op flags emitted at `SystemGrammarEngine.swift:51-54` and `:67-70`). Filter these out of the bulk path entirely — a no-op flag must never be part of "Fix all," and a low-confidence guess must never auto-apply. +- "Fix all" should be **trust-scoped like Grammarly's bulk accept**: only high-confidence objective mechanics (spelling/grammar/punctuation), never subjective rewrites. + +### 3.3 Enrich the data model +`Suggestion` (`Models.swift:48-59`) needs: +- `confidence: Double` (gate auto-apply below a threshold; show low-confidence ones as optional, never bulk-applied). +- `severity` (drives ordering and the score weighting). +- `alternatives: [String]` — `NSSpellChecker.guesses()` already returns multiple candidates but only `.first` is kept (`SystemGrammarEngine.swift:41`); surface the rest so the card can offer "other suggestions." +- `ruleID`/`source` — so feedback (accept/dismiss) can later tune ranking and so we can attribute a fix to Harper vs NSSpellChecker. + +### 3.4 Integrate the real Harper core (the big precision unlock) +`harper-ffi/` is an empty README; `Package.swift` comments out all real deps. Stand up the Rust crate behind a C-FFI static lib (`harper_check(text) -> spans`), map spans into `Suggestion`, and keep the protocol boundary so the rest of the app is unchanged. This brings real subject-verb agreement, article/preposition usage, comma/apostrophe rules, commonly-confused pairs, etc. — the category coverage NSSpellChecker structurally cannot provide. De-dup against NSSpellChecker as today (`overlaps`), but prefer Harper where both fire. + +### 3.5 Populate the dead `.punctuation` category +`.punctuation` is declared but never emitted, yet punctuation is one of the highest-volume real-world error classes. Harper covers most of it; this fills the gap and makes the new category chips (Mechanic 3) meaningful. + +### 3.6 Incremental, async, grapheme-safe checking +- Today: whole-document, synchronous, `DispatchQueue.main.sync` on a 1.6s poll, truncated at 4000 chars (`LiveMonitor.swift:46,174`), frontmost window only. Move to **debounced incremental re-check of changed spans** with caching of unchanged ranges; keep the heavy AX traversal off-main (already done) but get the spell/grammar pass off the main thread too once Harper is FFI-based (no `NSSpellChecker` main-thread requirement). +- Validate that replacement sub-ranges fall on **grapheme boundaries** (emoji/combining marks) before applying — only a coarse bounds check exists today (`SystemGrammarEngine.swift:63`). + +### 3.7 Feedback loop +Wire dismiss / add-to-dictionary (Mechanic 2) back into ranking so repeated false positives stop nagging — this is the "it learns" trust signal. Today `ignoreList` only suppresses; long-term, dismiss counts per `ruleID` can down-rank a noisy rule. + +**Sequencing:** §3.1 + §3.2 this week (trust-critical, tiny). §3.3 alongside Mechanic 2. §3.4–§3.6 are the real Harper milestone. §3.7 last. + +--- + +## 4. The first-run "wow" sequence for GrammaGem (original copy) + +Goal: a guaranteed visible win in under 60 seconds, *inside our own window* (we don't need Grammarly's blank-canvas demo trick or its install-everywhere upsell — we're already system-wide). Onboarding today (`OnboardingView.swift`) skips this entirely. + +Proposed flow: + +1. **Welcome (1 line):** "A private writing assistant that lives in your menu bar and fixes text in every app — all on this Mac." (existing copy is close; keep it.) + +2. **The rigged win — a live mini-demo BEFORE any permission ask.** Show a short pre-written paragraph salted with obvious, safe errors (a misspelling, a repeated word, a lowercase "i", a missing period). Render it with the highlight UI already built in `LiveCheckView.highlighted(...)`. Above it: **"We spotted N things to tidy up."** (count = guaranteed, because the sample is fixed.) + +3. **One satisfying click.** A single "Clean it up" button animates the highlights resolving one by one; the count ticks to 0; the paragraph visibly improves. This is the operant loop — trivial action, immediate visible reward — experienced once, on rails, with zero risk. (Reuse the apply path; it's a local string, not a live AX element, so it's completely safe.) + +4. **The reveal:** "That's GrammaGem. It does this in Mail, Slack, Notes, your browser — everywhere you type." Then the *first* ask: **Accessibility** (the existing step 2 / `stepCard`), now framed as "Turn it on everywhere." + +5. **Optional model step:** keep the existing "Download the on-device model (optional) — grammar works instantly with no download" card. Frame the AI features as a bonus, not a blocker. + +6. **No install-everywhere nag, no timed discount, no streak guilt.** End on a calm "You're all set" with one honest line about ownership: "Yours once. No subscription, nothing leaves your Mac." + +Guardrails: the demo must use *original* sample text (not Grammarly's), and the count/score must be real (computed by our engine on the sample), never theatrical. + +--- + +## 5. Do NOT copy (dark patterns + claims we can't truthfully make) + +These are Grammarly mechanics that either depend on infrastructure we reject or that would corrode the trust/privacy moat that *is* the product. + +1. **The premium-issue anxiety counter ("14 advanced issues you can't fix").** It works by detecting problems the engine deliberately won't fix. It clashes head-on with our promise that grammar/spelling/punctuation is unlimited and fully resolvable for free. Do not manufacture a permanently-nonzero count or a "score capped until you upgrade" gate. + +2. **Two-tier gold-vs-red underlines (a second class of locked grammar issues).** Our underlines are all free and all resolvable; there is no second class to color differently. Inventing one betrays the core differentiator. + +3. **Blur/lock a result we already computed.** On-device + open-source, hiding output we generated is both trivially bypassable and brand-corrosive. Gate by **quantity/frequency** (the daily counter) and **breadth** (modes, multi-device, snippets, larger model) — never by hiding the quality of a single result. + +4. **Cloud percentile comparisons ("more productive than X% of users").** Requires an account + aggregate corpus + telemetry — the exact surveillance we market against. Replace with **self-vs-self** local trends. + +5. **Behavioral weekly emails / re-nag pipeline.** For a one-time purchase there is no subscription to keep warm; post-purchase nagging is pure annoyance. Any weekly recap must be **in-app, local, opt-in, and stop entirely once they own it.** + +6. **Countdown/limited-time discount urgency** (Grammarly's Day-7 40% timer). Manufactured scarcity undercuts the honest "buy once, fair price" positioning. + +7. **Lifetime "total words checked" framed as cloud sunk-cost-to-lose.** A local milestone counter is fine and good; framing it as "you'll lose your history if you leave" is a retention dark pattern with no place in a no-renewal product. + +8. **Unsubstantiated social proof.** `web/src/lib/content.ts` STATS (200k+ downloads, 4.9 rating) and all TESTIMONIALS are explicitly flagged PLACEHOLDER. Do not ship these as fact — replace with real numbers or remove before launch. + +Positive reframe to keep: surface locked paid features (modes, app-aware, snippets, larger model) honestly — "Unlock all of this once. Yours forever, no subscription." Same mechanism (visible locked features), stronger close (no recurring cost objection). + +--- + +## 6. Prioritized roadmap + +### NOW (trust + the atomic loop — ship-blockers for credibility) +1. **Fix the casing/whitespace post-processing bug** (§3.1). `SystemGrammarEngine.swift`. *high / S.* +2. **Stop bulk-applying no-ops and low-confidence guesses** (§3.2). `GrammarEngine.swift`, `SystemGrammarEngine.swift`. *high / S.* +3. **Dismiss / Ignore / Add-to-dictionary + keyboard accept in the Live Check panel** (Mechanic 2). `LiveCheckView.swift`, `LiveMonitor.swift`, `Models.swift`, `PersonalDictionary.swift`. *high / M.* +4. **Targeted span apply via AX selection instead of whole-field overwrite; rebase instead of bail** (Mechanic 2). `LiveMonitor.swift`, `TextCapture`. *high / M.* +5. **First-run rigged-win demo** (§4). `OnboardingView.swift`. *high / M.* + +### NEXT (organize + the value loop) +6. **Named buckets + per-category count chips + severity ordering + filter** (Mechanic 3). `Models.swift`, `LiveMonitor.swift`, `LiveCheckView.swift`. *high / M.* +7. **On-device writing score (per-doc) + dashboard trend** (Mechanics 3 & 5). `WritingScore` helper, `LiveCheckView.swift`, `DashboardView.swift`. *high / M.* +8. **Streaks + milestones + "subscription you didn't pay" money figure + menu-bar stat** (Mechanic 5). `UsageStats.swift`, `DashboardView.swift`, `MenuBarContent.swift`. *high / M.* +9. **Enrich `Suggestion` with confidence/severity/alternatives + "other suggestions" in card** (§3.3). `Models.swift`, `SystemGrammarEngine.swift`, `LiveCheckView.swift`. *medium / M.* + +### LATER (real engine + real partner layer) +10. **Real Harper FFI integration + populate `.punctuation` + grapheme safety + incremental async re-check** (§3.4–§3.6). `harper-ffi/`, `HarperEngine.swift`, `SystemGrammarEngine.swift`, `LiveMonitor.swift`, `Package.swift`. *high / L.* +11. **Wire the real MLX model (load downloaded weights) + one-click/reversible/before-after diff for rewrites + real tone detection** (Mechanic 6). `MLXEngine.swift`, `ModelManager.swift`, `Package.swift`, `TextReplacementCoordinator.swift`. *high / L.* +12. **Replace PLACEHOLDER web social proof/testimonials before launch** (§5). `web/src/lib/content.ts`. *medium / S.* + +--- + +*Throughline: ship trust first (correction quality + a safe, reversible accept loop), then make the work feel finite and rewarding (buckets, counts, a local score), then sell ongoing value honestly (self-vs-self progress, money saved, lifetime ownership) — and build the generative partner tier on a real model with a reversible, before/after contract. Every Grammarly mechanic translates if you swap cloud-surveillance for on-device self-comparison and recurring-nag for one-time honesty.* From 8a9ffb55af20947923aed1cf49ed25a0185baa80 Mon Sep 17 00:00:00 2001 From: BigMarc Date: Thu, 18 Jun 2026 07:34:02 +0200 Subject: [PATCH 4/9] Add real on-device LLM (MLX) for rewrite / tone / Ask Replace the MLXEngine stub with real Qwen2.5-3B-4bit inference via mlx-swift-examples (2.25.9): loads the local model snapshot on disk (no network), chat-templated generation per AIAction, and tone classification. Wired behind the existing AIEngine seam; AppState resolves the model dir through ModelManager. Build notes: - arm64-only now (MLX is Metal / Apple-Silicon only; matches the spec). - swift build (CLI) cannot compile mlx-swift's .metal kernels, so the metallib is generated once via scripts/build-metallib.sh (xcodebuild) and vendored at AppSupport/mlx.metallib; scripts/build.sh ships it as Contents/Resources/mlx-swift_Cmlx.bundle/Contents/Resources/default.metallib (the path mlx resolves, and it codesigns cleanly). - A hidden --mlx-selftest entrypoint runs one headless generation to verify the runtime end-to-end. Verified: the signed app's self-test produces a real rewrite; full test suite green (the MLX integration test is gated behind GRAMMAGEM_MLX_TEST). Co-Authored-By: Claude Opus 4.8 (1M context) --- .gitignore | 3 + AppSupport/mlx.metallib | Bin 0 -> 2881004 bytes Package.resolved | 69 +++++++ Package.swift | 22 ++- Sources/GrammaGem/AI/MLXEngine.swift | 221 +++++++++++++++------- Sources/GrammaGem/AI/ModelManager.swift | 28 ++- Sources/GrammaGem/App/AppState.swift | 6 +- Sources/GrammaGem/App/GrammaGemApp.swift | 39 +++- Tests/GrammaGemTests/GrammaGemTests.swift | 23 +++ scripts/build-metallib.sh | 25 +++ scripts/build.sh | 27 ++- 11 files changed, 378 insertions(+), 85 deletions(-) create mode 100644 AppSupport/mlx.metallib create mode 100644 Package.resolved create mode 100755 scripts/build-metallib.sh diff --git a/.gitignore b/.gitignore index 9c5b0be..b53644e 100644 --- a/.gitignore +++ b/.gitignore @@ -8,3 +8,6 @@ dist/ # Cargo.lock IS committed (binary crate) for reproducible builds. harper-ffi/target/ harper-ffi/lib/ + +# xcodebuild DerivedData (used only to generate the MLX metallib) +.xcode-build/ diff --git a/AppSupport/mlx.metallib b/AppSupport/mlx.metallib new file mode 100644 index 0000000000000000000000000000000000000000..50598b92804e3fdb91045c420b5539cf0a3d2228 GIT binary patch literal 2881004 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�EwvFr9IQcYm`26K69i*xYPQQ3|Sy&6~iF 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

    8xU0~3t0CY30!4e8i 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⋙w1(DcjS17Cp;ea<*V!7^oiM}DI>VSS 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 harper-ffi/lib/libharper_ffi.a); -// `scripts/build.sh` does this automatically. The remaining heavyweight pieces -// (MLX local LLM, Sparkle, KeyboardShortcuts) are still behind protocol seams. +// `harper-ffi/build.sh`; `scripts/build.sh` does this automatically. +// +// Layer-2 AI (rewrite / tone / Ask) is the real on-device LLM via MLX +// (mlx-swift-examples). MLX is **Apple-Silicon / Metal only**, so the app is +// arm64-only (matches the product spec: Apple Silicon, macOS 14+). The Harper +// static lib stays universal; the linker just uses its arm64 slice. // Absolute path to the prebuilt Harper static lib, independent of build cwd. let packageRoot = URL(fileURLWithPath: #filePath).deletingLastPathComponent().path @@ -22,15 +25,24 @@ let package = Package( products: [ .executable(name: "GrammaGem", targets: ["GrammaGem"]) ], + dependencies: [ + // On-device LLM runtime. Pinned to an exact tag (the LLM libraries still + // ship from this repo at 2.25.9; the package name is "mlx-libraries"). + .package(url: "https://github.com/ml-explore/mlx-swift-examples.git", exact: "2.25.9"), + ], targets: [ // C shim exposing libharper_ffi's C ABI (harper-ffi/include/harper.h) to Swift. .target(name: "CHarper", path: "Sources/CHarper"), .executableTarget( name: "GrammaGem", - dependencies: ["CHarper"], + dependencies: [ + "CHarper", + .product(name: "MLXLLM", package: "mlx-swift-examples"), + .product(name: "MLXLMCommon", package: "mlx-swift-examples"), + ], path: "Sources/GrammaGem", linkerSettings: [ - // Link the prebuilt universal Harper static library. + // Link the prebuilt Harper static library (arm64 slice). .unsafeFlags(["-L\(harperLibDir)", "-lharper_ffi"]) ] ), diff --git a/Sources/GrammaGem/AI/MLXEngine.swift b/Sources/GrammaGem/AI/MLXEngine.swift index 139bf9c..e2e2c96 100644 --- a/Sources/GrammaGem/AI/MLXEngine.swift +++ b/Sources/GrammaGem/AI/MLXEngine.swift @@ -1,91 +1,174 @@ import Foundation +import MLXLMCommon +import MLXLLM -/// STUB standing in for the real MLX-backed local LLM. +/// Layer 2 — the real on-device LLM (rewrite / tone / "Ask" / translate), backed +/// by **MLX** via mlx-swift-examples (verified against tag 2.25.9; SPM package +/// "mlx-libraries", products MLXLLM + MLXLMCommon). /// -/// TODO(real-integration): load the model via mlx-swift from -/// `ModelManager.modelsDirectory`, build the prompt from the action's system -/// prompt + the user's text, and stream tokens (target: first token < 1s on -/// M-series). Everything stays on-device — this method must never hit the network. +/// Loads weights ONLY from a local on-disk snapshot (ModelManager's download +/// directory) — `ModelConfiguration(directory:)` never contacts the network, so +/// inference is fully on-device, honoring the privacy promise. /// -/// The stub produces deterministic, plausible transformations so the capture → -/// engine → replace loop and the entitlement gating can be exercised end-to-end -/// without the multi-gigabyte model present. +/// API surface used (all confirmed in the 2.25.9 source): +/// ModelConfiguration(directory:) MLXLMCommon/ModelConfiguration.swift +/// LLMModelFactory.shared.loadContainer(...) MLXLLM/LLMModelFactory.swift +/// ModelContainer.perform { context in ... } MLXLMCommon/ModelContainer.swift +/// context.processor.prepare(input: UserInput(chat:)) MLXLMCommon/UserInput.swift +/// MLXLMCommon.generate(...) -> AsyncStream MLXLMCommon/Evaluate.swift final class MLXEngine: AIEngine { - private let ready: Bool - init(ready: Bool = true) { - self.ready = ready + /// Returns the local model snapshot directory if a complete model is present, + /// else nil. Owned by ModelManager; MLXEngine only loads + infers. + private let modelDirectoryProvider: () -> URL? + + /// Serializes the (expensive) first load and caches the container. + private let loader = ContainerLoader() + + init(modelDirectoryProvider: @escaping () -> URL?) { + self.modelDirectoryProvider = modelDirectoryProvider } - var isReady: Bool { ready } + var isReady: Bool { modelDirectoryProvider() != nil } + + // MARK: - AIEngine func run(_ action: AIAction, on text: String) async throws -> String { - guard ready else { throw AIEngineError.modelNotReady } let trimmed = text.trimmingCharacters(in: .whitespacesAndNewlines) guard !trimmed.isEmpty else { return text } - switch action { - case .rewriteClarity, .rewrite: - return tidy(trimmed) - case .adjustTone(let tone): - return apply(tone: tone, to: tidy(trimmed)) - case .ask(let instruction): - return follow(instruction: instruction, on: trimmed) - case .translate(let language): - return "[\(language)] " + tidy(trimmed) - case .applyMode(let mode): - return applyMode(mode, to: trimmed) - } + let container = try await container() + let params = GenerateParameters(temperature: temperature(for: action)) + let raw = try await complete( + system: systemPrompt(for: action), user: trimmed, + maxTokens: 512, parameters: params, container: container) + return clean(raw) } func detectTone(_ text: String) async -> Tone { - let lower = text.lowercased() - if lower.contains("!") || lower.contains("🚀") { return .punchy } - if lower.contains("therefore") || lower.contains("hereby") { return .academic } - if lower.contains("hey") || lower.contains("lol") { return .friendly } + let trimmed = text.trimmingCharacters(in: .whitespacesAndNewlines) + guard !trimmed.isEmpty else { return .professional } + let options = Tone.allCases.map(\.rawValue).joined(separator: ", ") + let system = """ + You are a tone classifier. Read the user's text and respond with exactly ONE \ + word — the single best-matching tone from this list: \(options). \ + Output only that word, lowercase, no punctuation or explanation. + """ + do { + let container = try await container() + let raw = try await complete( + system: system, user: trimmed, maxTokens: 8, + parameters: GenerateParameters(temperature: 0.0), container: container) + return parseTone(raw) + } catch { + return .professional + } + } + + // MARK: - Loading + + private func container() async throws -> ModelContainer { + guard let dir = modelDirectoryProvider() else { throw AIEngineError.modelNotReady } + return try await loader.container(at: dir) + } + + // MARK: - Generation + + private func complete(system: String, user: String, maxTokens: Int, + parameters: GenerateParameters, + container: ModelContainer) async throws -> String { + do { + return try await container.perform { context in + let input = try await context.processor.prepare( + input: UserInput(chat: [.system(system), .user(user)])) + var params = parameters + params.maxTokens = maxTokens + var out = "" + let stream = try MLXLMCommon.generate( + input: input, parameters: params, context: context) + for await item in stream { + if let chunk = item.chunk { out += chunk } + } + return out + } + } catch let error as AIEngineError { + throw error + } catch { + throw AIEngineError.generationFailed(error.localizedDescription) + } + } + + // MARK: - Prompting + + private func systemPrompt(for action: AIAction) -> String { + switch action { + case .rewriteClarity: + return "Rewrite the user's text to be clearer and more concise. Preserve the " + + "original meaning and the author's voice. Output only the rewritten text." + case .rewrite: + return "Paraphrase the user's text. Keep the meaning but vary the wording and " + + "structure. Output only the rewritten text." + case .adjustTone(let tone): + return "Rewrite the user's text in a \(tone.rawValue) tone. Preserve the meaning. " + + "Output only the rewritten text." + case .ask(let instruction): + return "Apply this instruction to the user's text: \(instruction). " + + "Output only the resulting text." + case .translate(let language): + return "Translate the user's text into \(language). Output only the translation." + case .applyMode(let mode): + return mode.systemPrompt + } + } + + /// Low temperature for faithful rewrites; a touch higher for free paraphrase. + private func temperature(for action: AIAction) -> Float { + switch action { + case .rewrite: return 0.5 + case .ask: return 0.4 + default: return 0.2 + } + } + + // MARK: - Output cleanup + + private func clean(_ s: String) -> String { + var out = s.trimmingCharacters(in: .whitespacesAndNewlines) + let lower = out.lowercased() + for prefix in ["sure, here", "sure! here", "here is", "here's", "certainly"] { + if lower.hasPrefix(prefix), let colon = out.firstIndex(of: ":") { + let after = out[out.index(after: colon)...] + .trimmingCharacters(in: .whitespacesAndNewlines) + if !after.isEmpty { out = after } + break + } + } + if out.count >= 2, out.first == "\"", out.last == "\"" { + out = String(out.dropFirst().dropLast()) + } + return out.trimmingCharacters(in: .whitespacesAndNewlines) + } + + private func parseTone(_ raw: String) -> Tone { + let token = raw.lowercased().trimmingCharacters(in: CharacterSet.alphanumerics.inverted) + if let exact = Tone(rawValue: token) { return exact } + let lower = raw.lowercased() + for tone in Tone.allCases where lower.contains(tone.rawValue) { return tone } return .professional } +} - // MARK: - Deterministic stand-in transforms +/// Caches one loaded `ModelContainer` (keyed by directory) and coalesces +/// concurrent first-loads. `ModelContainer` is itself an actor, so generation +/// calls through it are serialized safely. +private actor ContainerLoader { + private var cached: (url: URL, container: ModelContainer)? - private func tidy(_ s: String) -> String { - var out = s - out = out.replacingOccurrences(of: " i ", with: " I ") - out = out.replacingOccurrences(of: "lmk", with: "let me know") - out = out.replacingOccurrences(of: "u ", with: "you ") - if let first = out.first, first.isLowercase { - out.replaceSubrange(out.startIndex...out.startIndex, with: String(first).uppercased()) - } - if let last = out.last, !".!?".contains(last) { out.append(".") } - return out - } - - private func apply(tone: Tone, to s: String) -> String { - switch tone { - case .professional: return s - case .friendly: return "Hi! " + s - case .confident: return s.replacingOccurrences(of: "I think ", with: "") - case .academic: return "It is worth noting that " + s.prefix(1).lowercased() + s.dropFirst() - case .punchy: return s.replacingOccurrences(of: ". ", with: ".\n") - } - } - - private func follow(instruction: String, on s: String) -> String { - let i = instruction.lowercased() - if i.contains("short") { return String(s.split(separator: " ").prefix(8).joined(separator: " ")) + "." } - if i.contains("formal") { return apply(tone: .academic, to: tidy(s)) } - if i.contains("translate") { return "[translated] " + tidy(s) } - return tidy(s) - } - - private func applyMode(_ mode: WritingMode, to s: String) -> String { - switch mode.id { - case "email": return "Hi,\n\n\(tidy(s))\n\nThanks!" - case "post": return apply(tone: .punchy, to: tidy(s)) - case "academic": return apply(tone: .academic, to: tidy(s)) - case "slack": return s.lowercased() - case "code": return "// " + tidy(s) - default: return tidy(s) - } + func container(at directory: URL) async throws -> ModelContainer { + if let cached, cached.url == directory { return cached.container } + let configuration = ModelConfiguration(directory: directory) + let container = try await LLMModelFactory.shared.loadContainer(configuration: configuration) + cached = (directory, container) + return container } } diff --git a/Sources/GrammaGem/AI/ModelManager.swift b/Sources/GrammaGem/AI/ModelManager.swift index fdcff5d..0402aff 100644 --- a/Sources/GrammaGem/AI/ModelManager.swift +++ b/Sources/GrammaGem/AI/ModelManager.swift @@ -23,20 +23,38 @@ final class ModelManager: ObservableObject { if isModelPresent(repo: selectedRepo) { state = .ready } } - var modelsDirectory: URL { + var modelsDirectory: URL { Self.modelsDirectory() } + + func modelDir(_ repo: String) -> URL { Self.modelDir(repo) } + + /// Considered present once the completion marker is written. + func isModelPresent(repo: String) -> Bool { Self.isModelPresent(repo: repo) } + + // MARK: - Nonisolated path helpers + // + // The AI engine loads weights off the main actor, so the directory lookup must + // be callable from any thread. These are pure FileManager/URL ops (no actor + // state, no network) and back the @MainActor instance accessors above. + + nonisolated static func modelsDirectory() -> URL { let base = FileManager.default.urls(for: .applicationSupportDirectory, in: .userDomainMask)[0] return base.appendingPathComponent("GrammaGem/Models", isDirectory: true) } - func modelDir(_ repo: String) -> URL { - modelsDirectory.appendingPathComponent(repo.replacingOccurrences(of: "/", with: "_"), isDirectory: true) + nonisolated static func modelDir(_ repo: String) -> URL { + modelsDirectory().appendingPathComponent(repo.replacingOccurrences(of: "/", with: "_"), isDirectory: true) } - /// Considered present once the completion marker is written. - func isModelPresent(repo: String) -> Bool { + nonisolated static func isModelPresent(repo: String) -> Bool { FileManager.default.fileExists(atPath: modelDir(repo).appendingPathComponent(".complete").path) } + /// The local model directory iff a *complete* model is on disk, else nil — + /// fed to the AI engine as its network-free model source. + nonisolated static func completedModelDirectory(repo: String) -> URL? { + isModelPresent(repo: repo) ? modelDir(repo) : nil + } + /// Kick off (or resume to) a real download. Safe to call from the UI. func startDownload(repo: String? = nil) { let target = repo ?? selectedRepo diff --git a/Sources/GrammaGem/App/AppState.swift b/Sources/GrammaGem/App/AppState.swift index 5bb74e4..07e3b93 100644 --- a/Sources/GrammaGem/App/AppState.swift +++ b/Sources/GrammaGem/App/AppState.swift @@ -45,7 +45,11 @@ final class AppState: ObservableObject { private init() { let engine = SystemGrammarEngine() grammar = engine - ai = MLXEngine(ready: true) + // The on-device LLM loads weights from ModelManager's local snapshot (if a + // complete download is present) — never the network. Resolved lazily on use. + ai = MLXEngine(modelDirectoryProvider: { + ModelManager.completedModelDirectory(repo: AppConfig.Model.defaultRepo) + }) permissions = Permissions() model = ModelManager() license = LicenseManager() diff --git a/Sources/GrammaGem/App/GrammaGemApp.swift b/Sources/GrammaGem/App/GrammaGemApp.swift index b2d538f..61de6b0 100644 --- a/Sources/GrammaGem/App/GrammaGemApp.swift +++ b/Sources/GrammaGem/App/GrammaGemApp.swift @@ -1,10 +1,47 @@ import SwiftUI import AppKit +/// Process entry point. A hidden `--mlx-selftest` flag loads the on-device model +/// and runs one real generation (verifies the MLX runtime + metallib headlessly), +/// then exits. Otherwise the normal menu-bar app launches. +@main +enum GrammaGemMain { + static func main() { + if CommandLine.arguments.contains("--mlx-selftest") { + MLXSelfTest.run() + return + } + GrammaGemApp.main() + } +} + +/// Headless verification of the on-device LLM (used by CI / the build pipeline). +enum MLXSelfTest { + static func run() { + let sample = "me and him was going to the store for to buy some milks" + let engine = MLXEngine(modelDirectoryProvider: { + ModelManager.completedModelDirectory(repo: AppConfig.Model.defaultRepo) + }) + guard engine.isReady else { + FileHandle.standardError.write(Data("SELFTEST_FAIL: model not present\n".utf8)) + exit(2) + } + let sem = DispatchSemaphore(value: 0) + var line = "SELFTEST_FAIL: unknown" + Task.detached { + do { line = "SELFTEST_OK: " + (try await engine.run(.rewriteClarity, on: sample)) } + catch { line = "SELFTEST_FAIL: \(error.localizedDescription)" } + sem.signal() + } + sem.wait() + print(line) + exit(line.hasPrefix("SELFTEST_OK") ? 0 : 1) + } +} + /// App entry point. A menu-bar (`LSUIElement`) SwiftUI app: the only persistent /// scene is the `MenuBarExtra`; Settings uses the standard scene; Onboarding and /// Ask are AppKit-hosted windows opened on demand (see `AppState`). -@main struct GrammaGemApp: App { @NSApplicationDelegateAdaptor(AppDelegate.self) private var appDelegate @StateObject private var app = AppState.shared diff --git a/Tests/GrammaGemTests/GrammaGemTests.swift b/Tests/GrammaGemTests/GrammaGemTests.swift index 24a23e4..82f420f 100644 --- a/Tests/GrammaGemTests/GrammaGemTests.swift +++ b/Tests/GrammaGemTests/GrammaGemTests.swift @@ -110,6 +110,29 @@ final class GrammaGemTests: XCTestCase { XCTAssertEqual(UsageStats.nextMilestone(corrections: 100).target, 500) } + // MARK: - MLX on-device LLM (integration; skipped unless the model is present) + + /// Loads the real downloaded model and runs one generation. Skipped in CI / + /// on machines without the weights. Run with the model present to verify the + /// MLX integration end-to-end. + func testMLXRealGenerationIfModelPresent() async throws { + // Opt-in: `swift test` (CLI) can't place mlx-swift's metallib, so this is + // gated. Run it via the app's `--mlx-selftest`, or set GRAMMAGEM_MLX_TEST=1 + // with the metallib colocated. See scripts/build-metallib.sh. + guard ProcessInfo.processInfo.environment["GRAMMAGEM_MLX_TEST"] == "1" else { + throw XCTSkip("set GRAMMAGEM_MLX_TEST=1 (metallib colocated) to run the MLX integration test") + } + guard let dir = ModelManager.completedModelDirectory(repo: AppConfig.Model.defaultRepo) else { + throw XCTSkip("on-device model not downloaded; skipping MLX integration test") + } + let engine = MLXEngine(modelDirectoryProvider: { dir }) + XCTAssertTrue(engine.isReady) + let out = try await engine.run(.rewriteClarity, + on: "me and him was going to the store for to buy some milks") + print("MLX rewriteClarity -> \(out)") + XCTAssertFalse(out.trimmingCharacters(in: .whitespacesAndNewlines).isEmpty) + } + // MARK: - Modes func testFreeTierGetsOnlyPolishMode() { diff --git a/scripts/build-metallib.sh b/scripts/build-metallib.sh new file mode 100755 index 0000000..ce22774 --- /dev/null +++ b/scripts/build-metallib.sh @@ -0,0 +1,25 @@ +#!/usr/bin/env bash +# Regenerate AppSupport/mlx.metallib — the MLX on-device LLM's compiled Metal +# kernels. +# +# `swift build` (SwiftPM CLI) does NOT compile mlx-swift's .metal sources into a +# metallib, but Xcode's build system does. So we build the package once via +# xcodebuild, then vendor the resulting metallib (shipped colocated with the app +# executable; see scripts/build.sh). Run this when bumping the mlx-swift version. +# +# Requires the Metal Toolchain: xcodebuild -downloadComponent MetalToolchain +set -euo pipefail + +ROOT="$(cd "$(dirname "$0")/.." && pwd)" +cd "$ROOT" +DD=".xcode-build" + +echo "==> xcodebuild (compiles mlx-swift metal kernels — a few minutes)" +xcodebuild build -scheme GrammaGem -configuration Release \ + -destination 'platform=macOS,arch=arm64' \ + -derivedDataPath "$DD" -skipMacroValidation >/dev/null + +SRC="$DD/Build/Products/Release/mlx-swift_Cmlx.bundle/Contents/Resources/default.metallib" +[ -f "$SRC" ] || { echo "ERROR: metallib not produced at $SRC" >&2; exit 1; } +cp "$SRC" AppSupport/mlx.metallib +echo "==> vendored AppSupport/mlx.metallib ($(du -h AppSupport/mlx.metallib | cut -f1))" diff --git a/scripts/build.sh b/scripts/build.sh index e04fd1c..62aa160 100755 --- a/scripts/build.sh +++ b/scripts/build.sh @@ -1,5 +1,6 @@ #!/usr/bin/env bash -# Build a runnable, UNIVERSAL (Apple Silicon + Intel) GrammaGem.app bundle. +# Build a runnable GrammaGem.app bundle (arm64 / Apple Silicon — the MLX +# on-device LLM runtime is Metal-only, so Intel is not supported). # Usage: ./scripts/build.sh (run from the mac/ directory) set -euo pipefail @@ -14,9 +15,10 @@ echo "==> Building Harper static lib (universal)" chmod +x harper-ffi/build.sh ./harper-ffi/build.sh -echo "==> Compiling universal (arm64 + x86_64, ${CONFIG})" -swift build -c "${CONFIG}" --arch arm64 --arch x86_64 -BIN="$(swift build -c "${CONFIG}" --arch arm64 --arch x86_64 --show-bin-path)" +echo "==> Compiling (arm64 / Apple Silicon, ${CONFIG})" +# arm64-only: the MLX on-device LLM runtime is Apple-Silicon / Metal only. +swift build -c "${CONFIG}" --arch arm64 +BIN="$(swift build -c "${CONFIG}" --arch arm64 --show-bin-path)" echo "==> Assembling ${APP}" rm -rf "${DIST}/${APP}" @@ -26,6 +28,23 @@ cp "${BIN}/GrammaGem" "${DIST}/${APP}/Contents/MacOS/GrammaGem" cp "AppSupport/Info.plist" "${DIST}/${APP}/Contents/Info.plist" cp "AppSupport/AppIcon.icns" "${DIST}/${APP}/Contents/Resources/AppIcon.icns" +# SwiftPM resource bundles (tokenizer data, etc.) go in Contents/Resources so +# Bundle.module resolves via the main bundle and the signature stays valid. +shopt -s nullglob +for b in "${BIN}"/*.bundle; do + cp -R "$b" "${DIST}/${APP}/Contents/Resources/" +done +shopt -u nullglob + +# MLX Metal kernels: `swift build` (CLI) does NOT compile mlx-swift's .metal +# sources, so we ship a prebuilt metallib in the exact bundle mlx looks for — +# Contents/Resources/mlx-swift_Cmlx.bundle/Contents/Resources/default.metallib — +# which mlx finds via the main bundle's resources and which codesigns cleanly. +# Regenerate AppSupport/mlx.metallib with: ./scripts/build-metallib.sh +MLX_RES="${DIST}/${APP}/Contents/Resources/mlx-swift_Cmlx.bundle/Contents/Resources" +mkdir -p "${MLX_RES}" +cp "AppSupport/mlx.metallib" "${MLX_RES}/default.metallib" + echo "==> Built ${DIST}/${APP}" lipo -info "${DIST}/${APP}/Contents/MacOS/GrammaGem" echo " Run with: open \"${DIST}/${APP}\" (grant Accessibility on first launch)" From e8b7dff65d6a7d60ba8fd49c8e064f6c6e844bc4 Mon Sep 17 00:00:00 2001 From: BigMarc Date: Thu, 18 Jun 2026 08:22:35 +0200 Subject: [PATCH 5/9] Add Sparkle auto-update (appcast on grammagem.app) Installed apps now show an 'Update available' button (menu bar) and can one-click install signed updates. Adds the Sparkle dependency, an UpdaterManager wired into AppState, the menu-bar banner + 'Check for Updates', and Info.plist SUFeedURL (https://grammagem.app/appcast.xml), SUPublicEDKey, and scheduled background checks. Build / release: - build.sh embeds + rpaths Sparkle.framework; sign-app.sh signs it inside-out (XPC services, Updater.app, Autoupdate, framework, then app) for a valid, notarizable signature. - release.sh stamps the version, builds, signs, notarizes, staples, zips, and emits the EdDSA-signed appcast.xml to upload to grammagem.app. - A hidden --update-selftest checks a feed headlessly (CI/build pipeline). Verified: a v0.1.0 build detects a v0.2.0 update against a local signed appcast (UPDATE_FOUND: 0.2.0); the signed app passes codesign --strict. Co-Authored-By: Claude Opus 4.8 (1M context) --- AppSupport/Info.plist | 14 +++ Package.resolved | 11 ++- Package.swift | 3 + Sources/GrammaGem/App/AppState.swift | 2 + Sources/GrammaGem/App/GrammaGemApp.swift | 5 ++ Sources/GrammaGem/App/MenuBarContent.swift | 23 +++++ Sources/GrammaGem/System/UpdaterManager.swift | 81 ++++++++++++++++++ scripts/build.sh | 9 ++ scripts/release.sh | 85 ++++++++++++++----- scripts/sign-app.sh | 35 ++++++++ scripts/sign-notarize.sh | 8 +- 11 files changed, 246 insertions(+), 30 deletions(-) create mode 100644 Sources/GrammaGem/System/UpdaterManager.swift create mode 100755 scripts/sign-app.sh diff --git a/AppSupport/Info.plist b/AppSupport/Info.plist index 8b4ef3c..9cf2470 100644 --- a/AppSupport/Info.plist +++ b/AppSupport/Info.plist @@ -43,5 +43,19 @@ © 2026 FounderGem LLC. Built in public. NSPrincipalClass NSApplication + + + SUFeedURL + https://grammagem.app/appcast.xml + SUPublicEDKey + IwYch+DRgNk3gmCwe86z+SIc4sRdyDf4Z6xGpS+JXDc= + SUEnableAutomaticChecks + + SUScheduledCheckInterval + 86400 + SUAutomaticallyUpdate + diff --git a/Package.resolved b/Package.resolved index 1197b37..2e0f4f3 100644 --- a/Package.resolved +++ b/Package.resolved @@ -1,5 +1,5 @@ { - "originHash" : "1aab35282a23815fc7c2ac7484414660e78b19f68cfbf14f87004cf55bb3ac6b", + "originHash" : "f78005d8f2f9a6a31d5c42cc7ce2b46907eb92fce74810060a58056e592ea3a1", "pins" : [ { "identity" : "gzipswift", @@ -28,6 +28,15 @@ "version" : "2.25.9" } }, + { + "identity" : "sparkle", + "kind" : "remoteSourceControl", + "location" : "https://github.com/sparkle-project/Sparkle", + "state" : { + "revision" : "d46d456107feacc80711b21847b82b07bd9fb46e", + "version" : "2.9.3" + } + }, { "identity" : "swift-collections", "kind" : "remoteSourceControl", diff --git a/Package.swift b/Package.swift index 04ed911..4eb49a7 100644 --- a/Package.swift +++ b/Package.swift @@ -29,6 +29,8 @@ let package = Package( // On-device LLM runtime. Pinned to an exact tag (the LLM libraries still // ship from this repo at 2.25.9; the package name is "mlx-libraries"). .package(url: "https://github.com/ml-explore/mlx-swift-examples.git", exact: "2.25.9"), + // Secure auto-updates (EdDSA-signed appcast served from grammagem.app). + .package(url: "https://github.com/sparkle-project/Sparkle", from: "2.6.0"), ], targets: [ // C shim exposing libharper_ffi's C ABI (harper-ffi/include/harper.h) to Swift. @@ -39,6 +41,7 @@ let package = Package( "CHarper", .product(name: "MLXLLM", package: "mlx-swift-examples"), .product(name: "MLXLMCommon", package: "mlx-swift-examples"), + .product(name: "Sparkle", package: "Sparkle"), ], path: "Sources/GrammaGem", linkerSettings: [ diff --git a/Sources/GrammaGem/App/AppState.swift b/Sources/GrammaGem/App/AppState.swift index 07e3b93..66d0bb0 100644 --- a/Sources/GrammaGem/App/AppState.swift +++ b/Sources/GrammaGem/App/AppState.swift @@ -27,6 +27,7 @@ final class AppState: ObservableObject { let snippets: SnippetStore let exclusions: Exclusions let liveMonitor: LiveMonitor + let updater: UpdaterManager private let capture: TextCapture let coordinator: TextReplacementCoordinator @@ -65,6 +66,7 @@ final class AppState: ObservableObject { let excl = Exclusions() exclusions = excl liveMonitor = LiveMonitor(grammar: engine, detector: detector, exclusions: excl, capture: capture) + updater = UpdaterManager() coordinator = TextReplacementCoordinator( capture: capture, grammar: engine, ai: ai, gate: gate, detector: detector) } diff --git a/Sources/GrammaGem/App/GrammaGemApp.swift b/Sources/GrammaGem/App/GrammaGemApp.swift index 61de6b0..2f0031e 100644 --- a/Sources/GrammaGem/App/GrammaGemApp.swift +++ b/Sources/GrammaGem/App/GrammaGemApp.swift @@ -11,6 +11,11 @@ enum GrammaGemMain { MLXSelfTest.run() return } + if let i = CommandLine.arguments.firstIndex(of: "--update-selftest") { + let feed = i + 1 < CommandLine.arguments.count ? CommandLine.arguments[i + 1] : "" + UpdaterSelfTest.run(feedURL: feed) + return + } GrammaGemApp.main() } } diff --git a/Sources/GrammaGem/App/MenuBarContent.swift b/Sources/GrammaGem/App/MenuBarContent.swift index dc78fc9..053e3dd 100644 --- a/Sources/GrammaGem/App/MenuBarContent.swift +++ b/Sources/GrammaGem/App/MenuBarContent.swift @@ -24,16 +24,22 @@ struct MenuBarLabel: View { struct MenuBarContent: View { @EnvironmentObject private var app: AppState @ObservedObject private var monitor: LiveMonitor + @ObservedObject private var updater: UpdaterManager @Environment(\.openSettings) private var openSettings init() { _monitor = ObservedObject(wrappedValue: AppState.shared.liveMonitor) + _updater = ObservedObject(wrappedValue: AppState.shared.updater) } var body: some View { VStack(alignment: .leading, spacing: 10) { header + if let version = updater.updateAvailableVersion { + updateBanner(version: version) + } + Divider() liveStatus @@ -61,6 +67,7 @@ struct MenuBarContent: View { actionRow(title: "Open GrammaGem…", shortcut: nil) { app.showMainWindow() } actionRow(title: "Manage devices…", shortcut: nil) { app.showMainWindow(select: .devices) } actionRow(title: "Page blocker…", shortcut: nil) { app.showMainWindow(select: .exclusions) } + actionRow(title: "Check for Updates…", shortcut: nil) { app.updater.checkForUpdates() } Divider() @@ -83,6 +90,22 @@ struct MenuBarContent: View { .frame(width: 290) } + /// Shown when Sparkle has found a newer signed build on grammagem.app. + private func updateBanner(version: String) -> some View { + HStack(spacing: 8) { + Image(systemName: "arrow.down.circle.fill").foregroundStyle(GG.emerald) + VStack(alignment: .leading, spacing: 1) { + Text("Update available").font(.callout.weight(.semibold)) + Text("Version \(version) is ready to install").font(.caption).foregroundStyle(.secondary) + } + Spacer() + Button("Update") { app.updater.checkForUpdates() } + .buttonStyle(.borderedProminent).controlSize(.small) + } + .padding(8) + .background(GG.emerald.opacity(0.10), in: RoundedRectangle(cornerRadius: 8)) + } + private var header: some View { HStack(spacing: 8) { Image(systemName: "pencil.and.scribble").foregroundStyle(.tint) diff --git a/Sources/GrammaGem/System/UpdaterManager.swift b/Sources/GrammaGem/System/UpdaterManager.swift new file mode 100644 index 0000000..c8aac65 --- /dev/null +++ b/Sources/GrammaGem/System/UpdaterManager.swift @@ -0,0 +1,81 @@ +import Foundation +import Sparkle + +/// Wraps Sparkle's updater. It background-checks the appcast on grammagem.app and +/// publishes `updateAvailableVersion` when a newer, EdDSA-verified build exists, so +/// the menu bar can show an "Update available" button. Triggering an update runs +/// Sparkle's verified download + install flow. +/// +/// The updater is only started inside the packaged `.app` (where the Info.plist +/// carries `SUFeedURL` + `SUPublicEDKey`); under `swift run`, tests, or the +/// self-test binaries it stays inert so nothing crashes. +@MainActor +final class UpdaterManager: NSObject, ObservableObject { + @Published private(set) var updateAvailableVersion: String? + + private var controller: SPUStandardUpdaterController? + + override init() { + super.init() + guard Bundle.main.object(forInfoDictionaryKey: "SUFeedURL") != nil else { + return // not the packaged app — no updater + } + controller = SPUStandardUpdaterController( + startingUpdater: true, updaterDelegate: self, userDriverDelegate: nil) + } + + var canCheckForUpdates: Bool { controller?.updater.canCheckForUpdates ?? false } + + /// User-initiated check — shows Sparkle's UI (used by the menu item and the + /// "Update" button on the availability banner). + func checkForUpdates() { + controller?.updater.checkForUpdates() + } +} + +extension UpdaterManager: SPUUpdaterDelegate { + func updater(_ updater: SPUUpdater, didFindValidUpdate item: SUAppcastItem) { + updateAvailableVersion = item.displayVersionString + } + + func updaterDidNotFindUpdate(_ updater: SPUUpdater) { + updateAvailableVersion = nil + } +} + +// MARK: - Headless update self-test (build pipeline / CI) + +/// Checks `feedURL` for a newer version with no UI and prints the result, then +/// exits. Used to verify the appcast + signature + version-comparison path. +enum UpdaterSelfTest { + static func run(feedURL: String) { + let delegate = UpdateProbeDelegate(feed: feedURL) + UpdateProbeDelegate.retained = delegate + UpdateProbeDelegate.controller = SPUStandardUpdaterController( + startingUpdater: true, updaterDelegate: delegate, userDriverDelegate: nil) + UpdateProbeDelegate.controller?.updater.checkForUpdateInformation() + RunLoop.main.run() // Sparkle's network check needs the run loop; delegate exits. + } +} + +private final class UpdateProbeDelegate: NSObject, SPUUpdaterDelegate { + static var controller: SPUStandardUpdaterController? + static var retained: UpdateProbeDelegate? + let feed: String + init(feed: String) { self.feed = feed; super.init() } + + func feedURLString(for updater: SPUUpdater) -> String? { feed.isEmpty ? nil : feed } + + func updater(_ updater: SPUUpdater, didFindValidUpdate item: SUAppcastItem) { + print("UPDATE_FOUND: \(item.displayVersionString)") + exit(0) + } + func updaterDidNotFindUpdate(_ updater: SPUUpdater) { + print("UPDATE_NONE") + exit(0) + } + func updater(_ updater: SPUUpdater, didAbortWithError error: Error) { + print("UPDATE_ERROR: \(error.localizedDescription)") + exit(1) + } +} diff --git a/scripts/build.sh b/scripts/build.sh index 62aa160..e530154 100755 --- a/scripts/build.sh +++ b/scripts/build.sh @@ -45,6 +45,15 @@ MLX_RES="${DIST}/${APP}/Contents/Resources/mlx-swift_Cmlx.bundle/Contents/Resour mkdir -p "${MLX_RES}" cp "AppSupport/mlx.metallib" "${MLX_RES}/default.metallib" +# Embed Sparkle.framework (auto-update) and add an rpath so the executable can +# resolve it at @executable_path/../Frameworks. (Signed inside-out by sign-app.sh.) +echo "==> Embedding Sparkle.framework" +SPARKLE_FW="$(find .build -path '*Sparkle.xcframework/macos-arm64*/Sparkle.framework' -type d | head -1)" +mkdir -p "${DIST}/${APP}/Contents/Frameworks" +cp -R "${SPARKLE_FW}" "${DIST}/${APP}/Contents/Frameworks/" +install_name_tool -add_rpath "@executable_path/../Frameworks" \ + "${DIST}/${APP}/Contents/MacOS/GrammaGem" 2>/dev/null || true + echo "==> Built ${DIST}/${APP}" lipo -info "${DIST}/${APP}/Contents/MacOS/GrammaGem" echo " Run with: open \"${DIST}/${APP}\" (grant Accessibility on first launch)" diff --git a/scripts/release.sh b/scripts/release.sh index db7a335..5699081 100755 --- a/scripts/release.sh +++ b/scripts/release.sh @@ -1,32 +1,71 @@ #!/usr/bin/env bash -# Package a signed build for distribution and update the Sparkle appcast hosted -# on GitHub Releases (zero hosting cost). Run after sign-notarize.sh. +# Cut a GrammaGem release and publish the Sparkle appcast (hosted on grammagem.app). # -# This is a documented scaffold — wire it to your Sparkle EdDSA key + repo. +# ./scripts/release.sh e.g. ./scripts/release.sh 0.2.0 +# +# Steps: stamp version -> build -> sign inside-out (incl. Sparkle) -> notarize + +# staple -> zip -> generate the EdDSA-signed appcast.xml. Then upload the .zip and +# appcast.xml to grammagem.app so every installed app shows "Update available". +# +# Notarization needs ONE of: +# NOTARY_PROFILE (xcrun notarytool store-credentials) +# APPLE_ID + TEAM_ID + NOTARY_PASSWORD (Apple ID + app-specific password) +# Set SKIP_NOTARIZE=1 for a dry run (un-notarized build; do not ship). set -euo pipefail ROOT="$(cd "$(dirname "$0")/.." && pwd)" -APP="$ROOT/dist/GrammaGem.app" -VERSION="${1:?Usage: release.sh e.g. 0.1.0}" -DMG="$ROOT/dist/GrammaGem-$VERSION.dmg" +cd "$ROOT" -echo "▸ Creating DMG for $VERSION…" -# hdiutil create -volname "GrammaGem" -srcfolder "$APP" -ov -format UDZO "$DMG" # TODO: enable -echo " (DMG creation stubbed — uncomment hdiutil line)" +VERSION="${1:?usage: release.sh e.g. release.sh 0.2.0}" +APP="dist/GrammaGem.app" +RELDIR="dist/releases" +ZIP="${RELDIR}/GrammaGem-${VERSION}.zip" +DL_PREFIX="${DL_PREFIX:-https://grammagem.app/releases/}" +PB=/usr/libexec/PlistBuddy -cat <<'NOTE' -▸ Sparkle appcast (TODO): - 1. Sign the update: ./bin/sign_update dist/GrammaGem-.dmg - (Sparkle's sign_update tool, using your EdDSA private key) - 2. Add an to appcast.xml with the version, URL (GitHub Releases asset), - length, and sparkle:edSignature. - 3. Upload the DMG + appcast.xml to a GitHub Release. - The app's SUFeedURL points at the raw appcast.xml on GitHub — $0 hosting. +# 1. Stamp the marketing version + bump the monotonic build number. +CUR_BUILD="$($PB -c 'Print :CFBundleVersion' AppSupport/Info.plist)" +NEW_BUILD=$((CUR_BUILD + 1)) +$PB -c "Set :CFBundleShortVersionString ${VERSION}" AppSupport/Info.plist +$PB -c "Set :CFBundleVersion ${NEW_BUILD}" AppSupport/Info.plist +echo "==> Releasing ${VERSION} (build ${NEW_BUILD})" -▸ Distribution touchpoints (all $0 marginal cost): - - Model weights: Hugging Face CDN - - Updates: GitHub Releases + Sparkle - - Licensing: Lemon Squeezy License API (% per sale only) -NOTE +# 2. Build + sign (inside-out so the embedded Sparkle.framework is valid). +./scripts/build.sh +./scripts/sign-app.sh "$APP" -echo "✓ Release steps printed for $VERSION" +# 3. Zip. +mkdir -p "$RELDIR" +rm -f "$ZIP" +ditto -c -k --keepParent "$APP" "$ZIP" + +# 4. Notarize + staple (the ticket lets Sparkle install it without Gatekeeper prompts). +if [ "${SKIP_NOTARIZE:-0}" != "1" ]; then + echo "==> Notarizing" + if [ -n "${NOTARY_PROFILE:-}" ]; then + xcrun notarytool submit "$ZIP" --keychain-profile "$NOTARY_PROFILE" --wait + elif [ -n "${APPLE_ID:-}" ] && [ -n "${TEAM_ID:-}" ] && [ -n "${NOTARY_PASSWORD:-}" ]; then + xcrun notarytool submit "$ZIP" \ + --apple-id "$APPLE_ID" --team-id "$TEAM_ID" --password "$NOTARY_PASSWORD" --wait + else + echo "ERROR: set NOTARY_PROFILE or APPLE_ID+TEAM_ID+NOTARY_PASSWORD (or SKIP_NOTARIZE=1)." >&2 + exit 1 + fi + xcrun stapler staple "$APP" + rm -f "$ZIP"; ditto -c -k --keepParent "$APP" "$ZIP" # re-zip the stapled app +fi + +# 5. Generate the EdDSA-signed appcast (keeps every zip in RELDIR in its history). +GA="$(find .build/artifacts -name generate_appcast -type f | head -1)" +[ -n "$GA" ] || { echo "ERROR: generate_appcast not found (run 'swift package resolve')." >&2; exit 1; } +"$GA" --download-url-prefix "$DL_PREFIX" "$RELDIR" + +echo +echo "✓ Release ${VERSION} built. Upload these to grammagem.app:" +echo " ${ZIP}" +echo " -> ${DL_PREFIX}GrammaGem-${VERSION}.zip" +echo " ${RELDIR}/appcast.xml" +echo " -> https://grammagem.app/appcast.xml (matches Info.plist SUFeedURL)" +echo +echo " Once uploaded, installed apps show an 'Update available' button within a day" +echo " (or immediately via menu bar -> Check for Updates...)." diff --git a/scripts/sign-app.sh b/scripts/sign-app.sh new file mode 100755 index 0000000..869f88a --- /dev/null +++ b/scripts/sign-app.sh @@ -0,0 +1,35 @@ +#!/usr/bin/env bash +# Code-sign GrammaGem.app with Developer ID + Hardened Runtime, signing the +# embedded Sparkle.framework's nested helpers INSIDE-OUT first (required for a +# valid, notarizable signature). +# +# Usage: ./scripts/sign-app.sh [path/to/GrammaGem.app] +set -euo pipefail + +ROOT="$(cd "$(dirname "$0")/.." && pwd)" +cd "$ROOT" + +DEV_ID="${DEV_ID:-Developer ID Application: Marc Schultheiss (D5KT5B9Z9M)}" +ENTITLEMENTS="AppSupport/GrammaGem.entitlements" +APP="${1:-dist/GrammaGem.app}" + +sign() { codesign --force --timestamp --options runtime --sign "$DEV_ID" "$@"; } + +FW="${APP}/Contents/Frameworks/Sparkle.framework" +if [ -d "$FW" ]; then + echo "==> Signing Sparkle.framework (inside-out)" + V="${FW}/Versions/B" + for xpc in "$V"/XPCServices/*.xpc; do [ -e "$xpc" ] && sign "$xpc"; done + [ -e "$V/Updater.app/Contents/MacOS/Autoupdate" ] && sign "$V/Updater.app/Contents/MacOS/Autoupdate" || true + [ -e "$V/Updater.app" ] && sign "$V/Updater.app" + [ -e "$V/Autoupdate" ] && sign "$V/Autoupdate" + sign "$FW" +fi + +echo "==> Signing ${APP}" +codesign --force --timestamp --options runtime \ + --entitlements "$ENTITLEMENTS" --sign "$DEV_ID" "$APP" + +echo "==> Verifying" +codesign --verify --strict --verbose=2 "$APP" +echo "✓ signed: $APP" diff --git a/scripts/sign-notarize.sh b/scripts/sign-notarize.sh index be65729..a5d58cc 100755 --- a/scripts/sign-notarize.sh +++ b/scripts/sign-notarize.sh @@ -22,12 +22,8 @@ ENTITLEMENTS="AppSupport/GrammaGem.entitlements" echo "==> Building universal bundle" ./scripts/build.sh >/dev/null -echo "==> Codesigning (Hardened Runtime)" -codesign --force --timestamp --options runtime \ - --entitlements "$ENTITLEMENTS" \ - --sign "$DEV_ID" \ - "$APP" -codesign --verify --strict --verbose=2 "$APP" +echo "==> Codesigning (Hardened Runtime, inside-out incl. Sparkle)" +DEV_ID="$DEV_ID" ./scripts/sign-app.sh "$APP" echo "==> Zipping" ditto -c -k --keepParent "$APP" "$ZIP" From 3d749e8139c90f7dc477d450d48dae940a221113 Mon Sep 17 00:00:00 2001 From: BigMarc Date: Thu, 18 Jun 2026 16:49:55 +0200 Subject: [PATCH 6/9] feat: Implement LiveMonitor for real-time grammar and spelling checks across applications - Added LiveMonitor class to scan text areas in the frontmost window for grammar and spelling issues. - Introduced DetectedField struct to represent text areas with issues, including suggestions for corrections. - Implemented functionality to apply corrections and dismiss suggestions. - Added Permissions class to manage Accessibility permissions required for monitoring. - Created SnippetStore for managing text-expansion snippets, including persistence to UserDefaults. - Developed TextCapture class to read and write text from the frontmost application using Accessibility API and clipboard fallback. - Implemented TextFieldScanner to traverse the Accessibility tree and collect editable text elements. - Added TextReplacementCoordinator to orchestrate the text correction process. - Integrated UpdaterManager for handling application updates using Sparkle. - Created comprehensive unit tests for various components, including grammar corrections and entitlement checks. --- AppSupport/{GrammaGem.entitlements => GrammarGem.entitlements} | 0 Sources/{GrammaGem => GrammarGem}/AI/AIEngine.swift | 0 Sources/{GrammaGem => GrammarGem}/AI/CustomModesStore.swift | 0 Sources/{GrammaGem => GrammarGem}/AI/MLXEngine.swift | 0 Sources/{GrammaGem => GrammarGem}/AI/ModeRegistry.swift | 0 Sources/{GrammaGem => GrammarGem}/AI/ModelManager.swift | 0 Sources/{GrammaGem => GrammarGem}/App/AppState.swift | 0 Sources/{GrammaGem => GrammarGem}/App/AskView.swift | 0 .../App/GrammaGemApp.swift => GrammarGem/App/GrammarGemApp.swift} | 0 .../{GrammaGem => GrammarGem}/App/MainWindow/AccountViews.swift | 0 .../{GrammaGem => GrammarGem}/App/MainWindow/DashboardView.swift | 0 Sources/{GrammaGem => GrammarGem}/App/MainWindow/DataViews.swift | 0 .../{GrammaGem => GrammarGem}/App/MainWindow/DevicesView.swift | 0 .../{GrammaGem => GrammarGem}/App/MainWindow/ExclusionsView.swift | 0 .../{GrammaGem => GrammarGem}/App/MainWindow/LiveCheckView.swift | 0 .../{GrammaGem => GrammarGem}/App/MainWindow/MainWindowView.swift | 0 .../{GrammaGem => GrammarGem}/App/MainWindow/SystemViews.swift | 0 .../App/MainWindow/WritingModesView.swift | 0 Sources/{GrammaGem => GrammarGem}/App/MenuBarContent.swift | 0 Sources/{GrammaGem => GrammarGem}/App/OnboardingView.swift | 0 Sources/{GrammaGem => GrammarGem}/App/SettingsView.swift | 0 Sources/{GrammaGem => GrammarGem}/Core/AppConfig.swift | 0 Sources/{GrammaGem => GrammarGem}/Core/Logger.swift | 0 Sources/{GrammaGem => GrammarGem}/Core/Models.swift | 0 Sources/{GrammaGem => GrammarGem}/Entitlements/Entitlements.swift | 0 Sources/{GrammaGem => GrammarGem}/Entitlements/FeatureGate.swift | 0 Sources/{GrammaGem => GrammarGem}/Grammar/GrammarEngine.swift | 0 Sources/{GrammaGem => GrammarGem}/Grammar/HarperEngine.swift | 0 .../{GrammaGem => GrammarGem}/Grammar/PersonalDictionary.swift | 0 .../{GrammaGem => GrammarGem}/Grammar/SystemGrammarEngine.swift | 0 Sources/{GrammaGem => GrammarGem}/Grammar/WritingScore.swift | 0 .../{GrammaGem => GrammarGem}/Licensing/DeviceFingerprint.swift | 0 Sources/{GrammaGem => GrammarGem}/Licensing/Keychain.swift | 0 .../{GrammaGem => GrammarGem}/Licensing/LemonSqueezyClient.swift | 0 Sources/{GrammaGem => GrammarGem}/Licensing/LicenseManager.swift | 0 Sources/{GrammaGem => GrammarGem}/Licensing/LicenseModels.swift | 0 Sources/{GrammaGem => GrammarGem}/Preferences/Preferences.swift | 0 Sources/{GrammaGem => GrammarGem}/Stats/UsageStats.swift | 0 Sources/{GrammaGem => GrammarGem}/System/AXSupport.swift | 0 Sources/{GrammaGem => GrammarGem}/System/AppDetector.swift | 0 Sources/{GrammaGem => GrammarGem}/System/Exclusions.swift | 0 Sources/{GrammaGem => GrammarGem}/System/HotkeyCombo.swift | 0 Sources/{GrammaGem => GrammarGem}/System/HotkeyManager.swift | 0 Sources/{GrammaGem => GrammarGem}/System/LiveMonitor.swift | 0 Sources/{GrammaGem => GrammarGem}/System/Permissions.swift | 0 Sources/{GrammaGem => GrammarGem}/System/SnippetStore.swift | 0 Sources/{GrammaGem => GrammarGem}/System/TextCapture.swift | 0 Sources/{GrammaGem => GrammarGem}/System/TextFieldScanner.swift | 0 .../System/TextReplacementCoordinator.swift | 0 Sources/{GrammaGem => GrammarGem}/System/UpdaterManager.swift | 0 .../GrammarGemTests.swift} | 0 51 files changed, 0 insertions(+), 0 deletions(-) rename AppSupport/{GrammaGem.entitlements => GrammarGem.entitlements} (100%) rename Sources/{GrammaGem => GrammarGem}/AI/AIEngine.swift (100%) rename Sources/{GrammaGem => GrammarGem}/AI/CustomModesStore.swift (100%) rename Sources/{GrammaGem => GrammarGem}/AI/MLXEngine.swift (100%) rename Sources/{GrammaGem => GrammarGem}/AI/ModeRegistry.swift (100%) rename Sources/{GrammaGem => GrammarGem}/AI/ModelManager.swift (100%) rename Sources/{GrammaGem => GrammarGem}/App/AppState.swift (100%) rename Sources/{GrammaGem => GrammarGem}/App/AskView.swift (100%) rename Sources/{GrammaGem/App/GrammaGemApp.swift => GrammarGem/App/GrammarGemApp.swift} (100%) rename Sources/{GrammaGem => GrammarGem}/App/MainWindow/AccountViews.swift (100%) rename Sources/{GrammaGem => GrammarGem}/App/MainWindow/DashboardView.swift (100%) rename Sources/{GrammaGem => GrammarGem}/App/MainWindow/DataViews.swift (100%) rename Sources/{GrammaGem => GrammarGem}/App/MainWindow/DevicesView.swift (100%) rename Sources/{GrammaGem => GrammarGem}/App/MainWindow/ExclusionsView.swift (100%) rename Sources/{GrammaGem => GrammarGem}/App/MainWindow/LiveCheckView.swift (100%) rename Sources/{GrammaGem => GrammarGem}/App/MainWindow/MainWindowView.swift (100%) rename Sources/{GrammaGem => GrammarGem}/App/MainWindow/SystemViews.swift (100%) rename Sources/{GrammaGem => GrammarGem}/App/MainWindow/WritingModesView.swift (100%) rename Sources/{GrammaGem => GrammarGem}/App/MenuBarContent.swift (100%) rename Sources/{GrammaGem => GrammarGem}/App/OnboardingView.swift (100%) rename Sources/{GrammaGem => GrammarGem}/App/SettingsView.swift (100%) rename Sources/{GrammaGem => GrammarGem}/Core/AppConfig.swift (100%) rename Sources/{GrammaGem => GrammarGem}/Core/Logger.swift (100%) rename Sources/{GrammaGem => GrammarGem}/Core/Models.swift (100%) rename Sources/{GrammaGem => GrammarGem}/Entitlements/Entitlements.swift (100%) rename Sources/{GrammaGem => GrammarGem}/Entitlements/FeatureGate.swift (100%) rename Sources/{GrammaGem => GrammarGem}/Grammar/GrammarEngine.swift (100%) rename Sources/{GrammaGem => GrammarGem}/Grammar/HarperEngine.swift (100%) rename Sources/{GrammaGem => GrammarGem}/Grammar/PersonalDictionary.swift (100%) rename Sources/{GrammaGem => GrammarGem}/Grammar/SystemGrammarEngine.swift (100%) rename Sources/{GrammaGem => GrammarGem}/Grammar/WritingScore.swift (100%) rename Sources/{GrammaGem => GrammarGem}/Licensing/DeviceFingerprint.swift (100%) rename Sources/{GrammaGem => GrammarGem}/Licensing/Keychain.swift (100%) rename Sources/{GrammaGem => GrammarGem}/Licensing/LemonSqueezyClient.swift (100%) rename Sources/{GrammaGem => GrammarGem}/Licensing/LicenseManager.swift (100%) rename Sources/{GrammaGem => GrammarGem}/Licensing/LicenseModels.swift (100%) rename Sources/{GrammaGem => GrammarGem}/Preferences/Preferences.swift (100%) rename Sources/{GrammaGem => GrammarGem}/Stats/UsageStats.swift (100%) rename Sources/{GrammaGem => GrammarGem}/System/AXSupport.swift (100%) rename Sources/{GrammaGem => GrammarGem}/System/AppDetector.swift (100%) rename Sources/{GrammaGem => GrammarGem}/System/Exclusions.swift (100%) rename Sources/{GrammaGem => GrammarGem}/System/HotkeyCombo.swift (100%) rename Sources/{GrammaGem => GrammarGem}/System/HotkeyManager.swift (100%) rename Sources/{GrammaGem => GrammarGem}/System/LiveMonitor.swift (100%) rename Sources/{GrammaGem => GrammarGem}/System/Permissions.swift (100%) rename Sources/{GrammaGem => GrammarGem}/System/SnippetStore.swift (100%) rename Sources/{GrammaGem => GrammarGem}/System/TextCapture.swift (100%) rename Sources/{GrammaGem => GrammarGem}/System/TextFieldScanner.swift (100%) rename Sources/{GrammaGem => GrammarGem}/System/TextReplacementCoordinator.swift (100%) rename Sources/{GrammaGem => GrammarGem}/System/UpdaterManager.swift (100%) rename Tests/{GrammaGemTests/GrammaGemTests.swift => GrammarGemTests/GrammarGemTests.swift} (100%) diff --git a/AppSupport/GrammaGem.entitlements b/AppSupport/GrammarGem.entitlements similarity index 100% rename from AppSupport/GrammaGem.entitlements rename to AppSupport/GrammarGem.entitlements diff --git a/Sources/GrammaGem/AI/AIEngine.swift b/Sources/GrammarGem/AI/AIEngine.swift similarity index 100% rename from Sources/GrammaGem/AI/AIEngine.swift rename to Sources/GrammarGem/AI/AIEngine.swift diff --git a/Sources/GrammaGem/AI/CustomModesStore.swift b/Sources/GrammarGem/AI/CustomModesStore.swift similarity index 100% rename from Sources/GrammaGem/AI/CustomModesStore.swift rename to Sources/GrammarGem/AI/CustomModesStore.swift diff --git a/Sources/GrammaGem/AI/MLXEngine.swift b/Sources/GrammarGem/AI/MLXEngine.swift similarity index 100% rename from Sources/GrammaGem/AI/MLXEngine.swift rename to Sources/GrammarGem/AI/MLXEngine.swift diff --git a/Sources/GrammaGem/AI/ModeRegistry.swift b/Sources/GrammarGem/AI/ModeRegistry.swift similarity index 100% rename from Sources/GrammaGem/AI/ModeRegistry.swift rename to Sources/GrammarGem/AI/ModeRegistry.swift diff --git a/Sources/GrammaGem/AI/ModelManager.swift b/Sources/GrammarGem/AI/ModelManager.swift similarity index 100% rename from Sources/GrammaGem/AI/ModelManager.swift rename to Sources/GrammarGem/AI/ModelManager.swift diff --git a/Sources/GrammaGem/App/AppState.swift b/Sources/GrammarGem/App/AppState.swift similarity index 100% rename from Sources/GrammaGem/App/AppState.swift rename to Sources/GrammarGem/App/AppState.swift diff --git a/Sources/GrammaGem/App/AskView.swift b/Sources/GrammarGem/App/AskView.swift similarity index 100% rename from Sources/GrammaGem/App/AskView.swift rename to Sources/GrammarGem/App/AskView.swift diff --git a/Sources/GrammaGem/App/GrammaGemApp.swift b/Sources/GrammarGem/App/GrammarGemApp.swift similarity index 100% rename from Sources/GrammaGem/App/GrammaGemApp.swift rename to Sources/GrammarGem/App/GrammarGemApp.swift diff --git a/Sources/GrammaGem/App/MainWindow/AccountViews.swift b/Sources/GrammarGem/App/MainWindow/AccountViews.swift similarity index 100% rename from Sources/GrammaGem/App/MainWindow/AccountViews.swift rename to Sources/GrammarGem/App/MainWindow/AccountViews.swift diff --git a/Sources/GrammaGem/App/MainWindow/DashboardView.swift b/Sources/GrammarGem/App/MainWindow/DashboardView.swift similarity index 100% rename from Sources/GrammaGem/App/MainWindow/DashboardView.swift rename to Sources/GrammarGem/App/MainWindow/DashboardView.swift diff --git a/Sources/GrammaGem/App/MainWindow/DataViews.swift b/Sources/GrammarGem/App/MainWindow/DataViews.swift similarity index 100% rename from Sources/GrammaGem/App/MainWindow/DataViews.swift rename to Sources/GrammarGem/App/MainWindow/DataViews.swift diff --git a/Sources/GrammaGem/App/MainWindow/DevicesView.swift b/Sources/GrammarGem/App/MainWindow/DevicesView.swift similarity index 100% rename from Sources/GrammaGem/App/MainWindow/DevicesView.swift rename to Sources/GrammarGem/App/MainWindow/DevicesView.swift diff --git a/Sources/GrammaGem/App/MainWindow/ExclusionsView.swift b/Sources/GrammarGem/App/MainWindow/ExclusionsView.swift similarity index 100% rename from Sources/GrammaGem/App/MainWindow/ExclusionsView.swift rename to Sources/GrammarGem/App/MainWindow/ExclusionsView.swift diff --git a/Sources/GrammaGem/App/MainWindow/LiveCheckView.swift b/Sources/GrammarGem/App/MainWindow/LiveCheckView.swift similarity index 100% rename from Sources/GrammaGem/App/MainWindow/LiveCheckView.swift rename to Sources/GrammarGem/App/MainWindow/LiveCheckView.swift diff --git a/Sources/GrammaGem/App/MainWindow/MainWindowView.swift b/Sources/GrammarGem/App/MainWindow/MainWindowView.swift similarity index 100% rename from Sources/GrammaGem/App/MainWindow/MainWindowView.swift rename to Sources/GrammarGem/App/MainWindow/MainWindowView.swift diff --git a/Sources/GrammaGem/App/MainWindow/SystemViews.swift b/Sources/GrammarGem/App/MainWindow/SystemViews.swift similarity index 100% rename from Sources/GrammaGem/App/MainWindow/SystemViews.swift rename to Sources/GrammarGem/App/MainWindow/SystemViews.swift diff --git a/Sources/GrammaGem/App/MainWindow/WritingModesView.swift b/Sources/GrammarGem/App/MainWindow/WritingModesView.swift similarity index 100% rename from Sources/GrammaGem/App/MainWindow/WritingModesView.swift rename to Sources/GrammarGem/App/MainWindow/WritingModesView.swift diff --git a/Sources/GrammaGem/App/MenuBarContent.swift b/Sources/GrammarGem/App/MenuBarContent.swift similarity index 100% rename from Sources/GrammaGem/App/MenuBarContent.swift rename to Sources/GrammarGem/App/MenuBarContent.swift diff --git a/Sources/GrammaGem/App/OnboardingView.swift b/Sources/GrammarGem/App/OnboardingView.swift similarity index 100% rename from Sources/GrammaGem/App/OnboardingView.swift rename to Sources/GrammarGem/App/OnboardingView.swift diff --git a/Sources/GrammaGem/App/SettingsView.swift b/Sources/GrammarGem/App/SettingsView.swift similarity index 100% rename from Sources/GrammaGem/App/SettingsView.swift rename to Sources/GrammarGem/App/SettingsView.swift diff --git a/Sources/GrammaGem/Core/AppConfig.swift b/Sources/GrammarGem/Core/AppConfig.swift similarity index 100% rename from Sources/GrammaGem/Core/AppConfig.swift rename to Sources/GrammarGem/Core/AppConfig.swift diff --git a/Sources/GrammaGem/Core/Logger.swift b/Sources/GrammarGem/Core/Logger.swift similarity index 100% rename from Sources/GrammaGem/Core/Logger.swift rename to Sources/GrammarGem/Core/Logger.swift diff --git a/Sources/GrammaGem/Core/Models.swift b/Sources/GrammarGem/Core/Models.swift similarity index 100% rename from Sources/GrammaGem/Core/Models.swift rename to Sources/GrammarGem/Core/Models.swift diff --git a/Sources/GrammaGem/Entitlements/Entitlements.swift b/Sources/GrammarGem/Entitlements/Entitlements.swift similarity index 100% rename from Sources/GrammaGem/Entitlements/Entitlements.swift rename to Sources/GrammarGem/Entitlements/Entitlements.swift diff --git a/Sources/GrammaGem/Entitlements/FeatureGate.swift b/Sources/GrammarGem/Entitlements/FeatureGate.swift similarity index 100% rename from Sources/GrammaGem/Entitlements/FeatureGate.swift rename to Sources/GrammarGem/Entitlements/FeatureGate.swift diff --git a/Sources/GrammaGem/Grammar/GrammarEngine.swift b/Sources/GrammarGem/Grammar/GrammarEngine.swift similarity index 100% rename from Sources/GrammaGem/Grammar/GrammarEngine.swift rename to Sources/GrammarGem/Grammar/GrammarEngine.swift diff --git a/Sources/GrammaGem/Grammar/HarperEngine.swift b/Sources/GrammarGem/Grammar/HarperEngine.swift similarity index 100% rename from Sources/GrammaGem/Grammar/HarperEngine.swift rename to Sources/GrammarGem/Grammar/HarperEngine.swift diff --git a/Sources/GrammaGem/Grammar/PersonalDictionary.swift b/Sources/GrammarGem/Grammar/PersonalDictionary.swift similarity index 100% rename from Sources/GrammaGem/Grammar/PersonalDictionary.swift rename to Sources/GrammarGem/Grammar/PersonalDictionary.swift diff --git a/Sources/GrammaGem/Grammar/SystemGrammarEngine.swift b/Sources/GrammarGem/Grammar/SystemGrammarEngine.swift similarity index 100% rename from Sources/GrammaGem/Grammar/SystemGrammarEngine.swift rename to Sources/GrammarGem/Grammar/SystemGrammarEngine.swift diff --git a/Sources/GrammaGem/Grammar/WritingScore.swift b/Sources/GrammarGem/Grammar/WritingScore.swift similarity index 100% rename from Sources/GrammaGem/Grammar/WritingScore.swift rename to Sources/GrammarGem/Grammar/WritingScore.swift diff --git a/Sources/GrammaGem/Licensing/DeviceFingerprint.swift b/Sources/GrammarGem/Licensing/DeviceFingerprint.swift similarity index 100% rename from Sources/GrammaGem/Licensing/DeviceFingerprint.swift rename to Sources/GrammarGem/Licensing/DeviceFingerprint.swift diff --git a/Sources/GrammaGem/Licensing/Keychain.swift b/Sources/GrammarGem/Licensing/Keychain.swift similarity index 100% rename from Sources/GrammaGem/Licensing/Keychain.swift rename to Sources/GrammarGem/Licensing/Keychain.swift diff --git a/Sources/GrammaGem/Licensing/LemonSqueezyClient.swift b/Sources/GrammarGem/Licensing/LemonSqueezyClient.swift similarity index 100% rename from Sources/GrammaGem/Licensing/LemonSqueezyClient.swift rename to Sources/GrammarGem/Licensing/LemonSqueezyClient.swift diff --git a/Sources/GrammaGem/Licensing/LicenseManager.swift b/Sources/GrammarGem/Licensing/LicenseManager.swift similarity index 100% rename from Sources/GrammaGem/Licensing/LicenseManager.swift rename to Sources/GrammarGem/Licensing/LicenseManager.swift diff --git a/Sources/GrammaGem/Licensing/LicenseModels.swift b/Sources/GrammarGem/Licensing/LicenseModels.swift similarity index 100% rename from Sources/GrammaGem/Licensing/LicenseModels.swift rename to Sources/GrammarGem/Licensing/LicenseModels.swift diff --git a/Sources/GrammaGem/Preferences/Preferences.swift b/Sources/GrammarGem/Preferences/Preferences.swift similarity index 100% rename from Sources/GrammaGem/Preferences/Preferences.swift rename to Sources/GrammarGem/Preferences/Preferences.swift diff --git a/Sources/GrammaGem/Stats/UsageStats.swift b/Sources/GrammarGem/Stats/UsageStats.swift similarity index 100% rename from Sources/GrammaGem/Stats/UsageStats.swift rename to Sources/GrammarGem/Stats/UsageStats.swift diff --git a/Sources/GrammaGem/System/AXSupport.swift b/Sources/GrammarGem/System/AXSupport.swift similarity index 100% rename from Sources/GrammaGem/System/AXSupport.swift rename to Sources/GrammarGem/System/AXSupport.swift diff --git a/Sources/GrammaGem/System/AppDetector.swift b/Sources/GrammarGem/System/AppDetector.swift similarity index 100% rename from Sources/GrammaGem/System/AppDetector.swift rename to Sources/GrammarGem/System/AppDetector.swift diff --git a/Sources/GrammaGem/System/Exclusions.swift b/Sources/GrammarGem/System/Exclusions.swift similarity index 100% rename from Sources/GrammaGem/System/Exclusions.swift rename to Sources/GrammarGem/System/Exclusions.swift diff --git a/Sources/GrammaGem/System/HotkeyCombo.swift b/Sources/GrammarGem/System/HotkeyCombo.swift similarity index 100% rename from Sources/GrammaGem/System/HotkeyCombo.swift rename to Sources/GrammarGem/System/HotkeyCombo.swift diff --git a/Sources/GrammaGem/System/HotkeyManager.swift b/Sources/GrammarGem/System/HotkeyManager.swift similarity index 100% rename from Sources/GrammaGem/System/HotkeyManager.swift rename to Sources/GrammarGem/System/HotkeyManager.swift diff --git a/Sources/GrammaGem/System/LiveMonitor.swift b/Sources/GrammarGem/System/LiveMonitor.swift similarity index 100% rename from Sources/GrammaGem/System/LiveMonitor.swift rename to Sources/GrammarGem/System/LiveMonitor.swift diff --git a/Sources/GrammaGem/System/Permissions.swift b/Sources/GrammarGem/System/Permissions.swift similarity index 100% rename from Sources/GrammaGem/System/Permissions.swift rename to Sources/GrammarGem/System/Permissions.swift diff --git a/Sources/GrammaGem/System/SnippetStore.swift b/Sources/GrammarGem/System/SnippetStore.swift similarity index 100% rename from Sources/GrammaGem/System/SnippetStore.swift rename to Sources/GrammarGem/System/SnippetStore.swift diff --git a/Sources/GrammaGem/System/TextCapture.swift b/Sources/GrammarGem/System/TextCapture.swift similarity index 100% rename from Sources/GrammaGem/System/TextCapture.swift rename to Sources/GrammarGem/System/TextCapture.swift diff --git a/Sources/GrammaGem/System/TextFieldScanner.swift b/Sources/GrammarGem/System/TextFieldScanner.swift similarity index 100% rename from Sources/GrammaGem/System/TextFieldScanner.swift rename to Sources/GrammarGem/System/TextFieldScanner.swift diff --git a/Sources/GrammaGem/System/TextReplacementCoordinator.swift b/Sources/GrammarGem/System/TextReplacementCoordinator.swift similarity index 100% rename from Sources/GrammaGem/System/TextReplacementCoordinator.swift rename to Sources/GrammarGem/System/TextReplacementCoordinator.swift diff --git a/Sources/GrammaGem/System/UpdaterManager.swift b/Sources/GrammarGem/System/UpdaterManager.swift similarity index 100% rename from Sources/GrammaGem/System/UpdaterManager.swift rename to Sources/GrammarGem/System/UpdaterManager.swift diff --git a/Tests/GrammaGemTests/GrammaGemTests.swift b/Tests/GrammarGemTests/GrammarGemTests.swift similarity index 100% rename from Tests/GrammaGemTests/GrammaGemTests.swift rename to Tests/GrammarGemTests/GrammarGemTests.swift From e5b0977abfb6ce6e4e8aaf7124e711aa420a89db Mon Sep 17 00:00:00 2001 From: BigMarc Date: Thu, 18 Jun 2026 16:49:59 +0200 Subject: [PATCH 7/9] f --- AppSupport/Info.plist | 14 +++---- Package.swift | 18 ++++----- README.md | 18 ++++----- Resources/Modes/README.md | 2 +- Sources/CHarper/shim.c | 2 +- Sources/GrammarGem/AI/CustomModesStore.swift | 4 +- Sources/GrammarGem/AI/ModelManager.swift | 2 +- Sources/GrammarGem/App/AppState.swift | 16 ++++---- Sources/GrammarGem/App/AskView.swift | 2 +- Sources/GrammarGem/App/GrammarGemApp.swift | 6 +-- .../App/MainWindow/AccountViews.swift | 6 +-- .../App/MainWindow/DashboardView.swift | 2 +- .../GrammarGem/App/MainWindow/DataViews.swift | 2 +- .../App/MainWindow/DevicesView.swift | 2 +- .../App/MainWindow/ExclusionsView.swift | 4 +- .../App/MainWindow/MainWindowView.swift | 2 +- .../App/MainWindow/SystemViews.swift | 4 +- .../App/MainWindow/WritingModesView.swift | 4 +- Sources/GrammarGem/App/MenuBarContent.swift | 10 ++--- Sources/GrammarGem/App/OnboardingView.swift | 12 +++--- Sources/GrammarGem/App/SettingsView.swift | 4 +- Sources/GrammarGem/Core/AppConfig.swift | 12 +++--- .../GrammarGem/Entitlements/FeatureGate.swift | 2 +- .../Grammar/PersonalDictionary.swift | 4 +- .../Licensing/DeviceFingerprint.swift | 2 +- .../Licensing/LemonSqueezyClient.swift | 4 +- .../GrammarGem/Licensing/LicenseModels.swift | 2 +- Sources/GrammarGem/Stats/UsageStats.swift | 6 +-- Sources/GrammarGem/System/AXSupport.swift | 2 +- Sources/GrammarGem/System/Exclusions.swift | 8 ++-- Sources/GrammarGem/System/LiveMonitor.swift | 4 +- Sources/GrammarGem/System/Permissions.swift | 2 +- Sources/GrammarGem/System/SnippetStore.swift | 2 +- Sources/GrammarGem/System/TextCapture.swift | 4 +- .../GrammarGem/System/TextFieldScanner.swift | 2 +- .../GrammarGem/System/UpdaterManager.swift | 2 +- Tests/GrammarGemTests/GrammarGemTests.swift | 10 ++--- docs/grammarly-value-plan.md | 38 +++++++++---------- harper-ffi/README.md | 2 +- scripts/build-metallib.sh | 2 +- scripts/build.sh | 10 ++--- scripts/make-icon.swift | 2 +- scripts/release.sh | 16 ++++---- scripts/sign-app.sh | 8 ++-- scripts/sign-notarize.sh | 8 ++-- 45 files changed, 145 insertions(+), 145 deletions(-) diff --git a/AppSupport/Info.plist b/AppSupport/Info.plist index 9cf2470..31c84ac 100644 --- a/AppSupport/Info.plist +++ b/AppSupport/Info.plist @@ -1,6 +1,6 @@ SUFeedURL - https://grammagem.app/appcast.xml + https://www.grammargem.com/appcast.xml SUPublicEDKey IwYch+DRgNk3gmCwe86z+SIc4sRdyDf4Z6xGpS+JXDc= SUEnableAutomaticChecks diff --git a/Package.swift b/Package.swift index 4eb49a7..bceb8a5 100644 --- a/Package.swift +++ b/Package.swift @@ -2,7 +2,7 @@ import PackageDescription import Foundation -// GrammaGem — native macOS menu-bar writing assistant. +// GrammarGem — native macOS menu-bar writing assistant. // // Layer-1 grammar is the real **Harper** core (Apache-2.0), embedded as a Rust // C-FFI static library (see `harper-ffi/`). Build the lib first with @@ -18,41 +18,41 @@ let packageRoot = URL(fileURLWithPath: #filePath).deletingLastPathComponent().pa let harperLibDir = packageRoot + "/harper-ffi/lib" let package = Package( - name: "GrammaGem", + name: "GrammarGem", platforms: [ .macOS(.v14) // Apple Silicon, macOS 14+ (per the product spec) ], products: [ - .executable(name: "GrammaGem", targets: ["GrammaGem"]) + .executable(name: "GrammarGem", targets: ["GrammarGem"]) ], dependencies: [ // On-device LLM runtime. Pinned to an exact tag (the LLM libraries still // ship from this repo at 2.25.9; the package name is "mlx-libraries"). .package(url: "https://github.com/ml-explore/mlx-swift-examples.git", exact: "2.25.9"), - // Secure auto-updates (EdDSA-signed appcast served from grammagem.app). + // Secure auto-updates (EdDSA-signed appcast served from grammargem.com). .package(url: "https://github.com/sparkle-project/Sparkle", from: "2.6.0"), ], targets: [ // C shim exposing libharper_ffi's C ABI (harper-ffi/include/harper.h) to Swift. .target(name: "CHarper", path: "Sources/CHarper"), .executableTarget( - name: "GrammaGem", + name: "GrammarGem", dependencies: [ "CHarper", .product(name: "MLXLLM", package: "mlx-swift-examples"), .product(name: "MLXLMCommon", package: "mlx-swift-examples"), .product(name: "Sparkle", package: "Sparkle"), ], - path: "Sources/GrammaGem", + path: "Sources/GrammarGem", linkerSettings: [ // Link the prebuilt Harper static library (arm64 slice). .unsafeFlags(["-L\(harperLibDir)", "-lharper_ffi"]) ] ), .testTarget( - name: "GrammaGemTests", - dependencies: ["GrammaGem"], - path: "Tests/GrammaGemTests" + name: "GrammarGemTests", + dependencies: ["GrammarGem"], + path: "Tests/GrammarGemTests" ), ] ) diff --git a/README.md b/README.md index c4b5b01..5a7a26e 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@

    @@ -20,7 +20,7 @@ Fix grammar, sharpen tone, and rewrite anything — in every app — for one pay ## Stop renting your grammar checker. -Grammarly costs around **$144 every year**, reads everything you type, and sends it to their servers. GrammaGem does the same job — **better** — entirely on your Mac, for a **single payment**. +Grammarly costs around **$144 every year**, reads everything you type, and sends it to their servers. GrammarGem does the same job — **better** — entirely on your Mac, for a **single payment**. Select text in any app, press one hotkey, and it’s polished in place. No copy-paste, no switching windows, and **nothing ever leaves your machine**. @@ -30,7 +30,7 @@ Select text in any app, press one hotkey, and it’s polished in place. No copy- ## Why people switch -| | Grammarly | **GrammaGem** | +| | Grammarly | **GrammarGem** | |---|:---:|:---:| | **Price** | ~$144 / year, forever | **Pay once** | | **Your words** | Sent to the cloud | **Never leave your Mac** | @@ -46,7 +46,7 @@ Select text in any app, press one hotkey, and it’s polished in place. No copy- - 🔒 **Private by design** — everything runs on your Mac’s Neural Engine. Your writing is never uploaded, logged, or used to train a model. - ⌨️ **One global hotkey** — fix or rewrite the selected text in any app: Mail, Slack, Notion, Chrome, Messages, VS Code, and more. - ✨ **Ask & rewrite** — “make it shorter,” “more formal,” “translate to German” — done in place. -- 🎚️ **Writing Modes** — Email, Post, Team Chat, Academic, Code — switch the tone instantly, or let GrammaGem pick the right one for the app you’re in. +- 🎚️ **Writing Modes** — Email, Post, Team Chat, Academic, Code — switch the tone instantly, or let GrammarGem pick the right one for the app you’re in. - 📖 **Personal dictionary** — teach it your names, brand terms, and jargon once; it stops “correcting” them forever. - 🖥️ **A clean management app** — manage your devices, shortcuts, modes, and privacy from one tidy window. @@ -67,7 +67,7 @@ No subscription. No per-seat fees. One payment, lifetime updates.
    -[**⬇️ Get GrammaGem**](https://grammagem.app/#pricing) +[**⬇️ Get GrammarGem**](https://www.grammargem.com/#pricing)
    @@ -85,17 +85,17 @@ No. Core features work fully offline. No — it’s a one-time purchase with lifetime updates and a 14-day money-back guarantee. **What about plagiarism detection?** -GrammaGem is private-first, so it doesn’t do cloud plagiarism scanning — that would require sending your writing to a server. Everything else you’d expect is here. +GrammarGem is private-first, so it doesn’t do cloud plagiarism scanning — that would require sending your writing to a server. Everything else you’d expect is here. --- ## Built in public -GrammaGem is open source under the **MIT License**. We believe a privacy tool should be one you can actually inspect. Issues and pull requests are welcome. +GrammarGem is open source under the **MIT License**. We believe a privacy tool should be one you can actually inspect. Issues and pull requests are welcome.
    -**[grammagem.app](https://grammagem.app)** +**[grammargem.com](https://www.grammargem.com)** © 2026 FounderGem LLC · 1309 Coffeen Avenue STE 1200, Sheridan, WY 82801, USA diff --git a/Resources/Modes/README.md b/Resources/Modes/README.md index 3f56204..f343466 100644 --- a/Resources/Modes/README.md +++ b/Resources/Modes/README.md @@ -1,7 +1,7 @@ # Built-in Writing Modes Each Mode is a named system-prompt preset for the local LLM. The canonical, -compiled definitions live in [`Sources/GrammaGem/AI/ModeRegistry.swift`](../../Sources/GrammaGem/AI/ModeRegistry.swift); +compiled definitions live in [`Sources/GrammarGem/AI/ModeRegistry.swift`](../../Sources/GrammarGem/AI/ModeRegistry.swift); these JSON files mirror them for transparency and easy editing. | Mode | Tier | In public repo? | diff --git a/Sources/CHarper/shim.c b/Sources/CHarper/shim.c index 5089f89..4b76007 100644 --- a/Sources/CHarper/shim.c +++ b/Sources/CHarper/shim.c @@ -1,4 +1,4 @@ // CHarper is a header-only shim that exposes libharper_ffi's C ABI (declared in // include/harper.h) to Swift as the `CHarper` module. The actual symbols are -// provided by libharper_ffi.a, linked via the GrammaGem target's linkerSettings. +// provided by libharper_ffi.a, linked via the GrammarGem target's linkerSettings. // This translation unit exists only so SwiftPM treats CHarper as a C target. diff --git a/Sources/GrammarGem/AI/CustomModesStore.swift b/Sources/GrammarGem/AI/CustomModesStore.swift index 9c15c09..76629fc 100644 --- a/Sources/GrammarGem/AI/CustomModesStore.swift +++ b/Sources/GrammarGem/AI/CustomModesStore.swift @@ -8,8 +8,8 @@ final class CustomModesStore: ObservableObject { /// bundleID -> mode id (overrides the default App-Aware mapping). @Published private(set) var appOverrides: [String: String] - private let modesKey = "GrammaGem.customModes" - private let mapKey = "GrammaGem.appModeOverrides" + private let modesKey = "GrammarGem.customModes" + private let mapKey = "GrammarGem.appModeOverrides" private let d = UserDefaults.standard init() { diff --git a/Sources/GrammarGem/AI/ModelManager.swift b/Sources/GrammarGem/AI/ModelManager.swift index 0402aff..c30d67c 100644 --- a/Sources/GrammarGem/AI/ModelManager.swift +++ b/Sources/GrammarGem/AI/ModelManager.swift @@ -38,7 +38,7 @@ final class ModelManager: ObservableObject { nonisolated static func modelsDirectory() -> URL { let base = FileManager.default.urls(for: .applicationSupportDirectory, in: .userDomainMask)[0] - return base.appendingPathComponent("GrammaGem/Models", isDirectory: true) + return base.appendingPathComponent("GrammarGem/Models", isDirectory: true) } nonisolated static func modelDir(_ repo: String) -> URL { diff --git a/Sources/GrammarGem/App/AppState.swift b/Sources/GrammarGem/App/AppState.swift index 66d0bb0..6d8b2d5 100644 --- a/Sources/GrammarGem/App/AppState.swift +++ b/Sources/GrammarGem/App/AppState.swift @@ -115,7 +115,7 @@ final class AppState: ObservableObject { } Task { await license.validateIfNeeded() } - Log.app.info("GrammaGem started. Licensed: \(self.license.isLicensed, privacy: .public)") + Log.app.info("GrammarGem started. Licensed: \(self.license.isLicensed, privacy: .public)") } // MARK: - Hotkey handling @@ -205,19 +205,19 @@ final class AppState: ObservableObject { return decision } - /// Pause/resume all of GrammaGem (hotkeys + live monitoring). + /// Pause/resume all of GrammarGem (hotkeys + live monitoring). func togglePause() { isPaused.toggle() liveMonitor.setPaused(isPaused) lastStatus = isPaused ? "Paused" : "Ready" } - /// A reason GrammaGem should stay out of the way right now, or nil. + /// A reason GrammarGem should stay out of the way right now, or nil. private func blockReason() -> String? { - if isPaused { return "GrammaGem is paused." } + if isPaused { return "GrammarGem is paused." } let front = detector.frontmost() if exclusions.isBlocked(bundleID: front?.bundleID, domain: detector.frontmostDomain()) { - return "GrammaGem is off for \(front?.name ?? "this app")." + return "GrammarGem is off for \(front?.name ?? "this app")." } return nil } @@ -282,7 +282,7 @@ final class AppState: ObservableObject { if onboardingWindow == nil { let host = NSHostingController(rootView: OnboardingView().environmentObject(self)) let win = NSWindow(contentViewController: host) - win.title = "Welcome to GrammaGem" + win.title = "Welcome to GrammarGem" win.styleMask = [.titled, .closable, .fullSizeContentView] win.setContentSize(NSSize(width: 560, height: 720)) win.isReleasedWhenClosed = false @@ -311,7 +311,7 @@ final class AppState: ObservableObject { .environmentObject(liveMonitor) let host = NSHostingController(rootView: root) let win = NSWindow(contentViewController: host) - win.title = "GrammaGem" + win.title = "GrammarGem" win.styleMask = [.titled, .closable, .miniaturizable, .resizable, .fullSizeContentView] win.setContentSize(NSSize(width: 940, height: 660)) win.minSize = NSSize(width: 820, height: 560) @@ -349,7 +349,7 @@ final class AppState: ObservableObject { if askWindow == nil { let host = NSHostingController(rootView: AskView().environmentObject(self)) let win = NSWindow(contentViewController: host) - win.title = "Ask GrammaGem" + win.title = "Ask GrammarGem" win.styleMask = [.titled, .closable] win.setContentSize(NSSize(width: 460, height: 220)) win.isReleasedWhenClosed = false diff --git a/Sources/GrammarGem/App/AskView.swift b/Sources/GrammarGem/App/AskView.swift index ce02754..618c873 100644 --- a/Sources/GrammarGem/App/AskView.swift +++ b/Sources/GrammarGem/App/AskView.swift @@ -8,7 +8,7 @@ struct AskView: View { var body: some View { VStack(alignment: .leading, spacing: 14) { - Text("Ask GrammaGem") + Text("Ask GrammarGem") .font(.headline) Text("Acts on the text selected in the frontmost app. Runs on-device.") .font(.caption) diff --git a/Sources/GrammarGem/App/GrammarGemApp.swift b/Sources/GrammarGem/App/GrammarGemApp.swift index 2f0031e..5a2bcf4 100644 --- a/Sources/GrammarGem/App/GrammarGemApp.swift +++ b/Sources/GrammarGem/App/GrammarGemApp.swift @@ -5,7 +5,7 @@ import AppKit /// and runs one real generation (verifies the MLX runtime + metallib headlessly), /// then exits. Otherwise the normal menu-bar app launches. @main -enum GrammaGemMain { +enum GrammarGemMain { static func main() { if CommandLine.arguments.contains("--mlx-selftest") { MLXSelfTest.run() @@ -16,7 +16,7 @@ enum GrammaGemMain { UpdaterSelfTest.run(feedURL: feed) return } - GrammaGemApp.main() + GrammarGemApp.main() } } @@ -47,7 +47,7 @@ enum MLXSelfTest { /// App entry point. A menu-bar (`LSUIElement`) SwiftUI app: the only persistent /// scene is the `MenuBarExtra`; Settings uses the standard scene; Onboarding and /// Ask are AppKit-hosted windows opened on demand (see `AppState`). -struct GrammaGemApp: App { +struct GrammarGemApp: App { @NSApplicationDelegateAdaptor(AppDelegate.self) private var appDelegate @StateObject private var app = AppState.shared diff --git a/Sources/GrammarGem/App/MainWindow/AccountViews.swift b/Sources/GrammarGem/App/MainWindow/AccountViews.swift index 6304145..e77fec2 100644 --- a/Sources/GrammarGem/App/MainWindow/AccountViews.swift +++ b/Sources/GrammarGem/App/MainWindow/AccountViews.swift @@ -8,7 +8,7 @@ struct GeneralView: View { @EnvironmentObject private var permissions: Permissions var body: some View { - DetailScaffold(title: "General", subtitle: "Make GrammaGem feel like yours.") { + DetailScaffold(title: "General", subtitle: "Make GrammarGem feel like yours.") { Card { Toggle("Launch at login", isOn: $prefs.launchAtLogin) Divider() @@ -134,7 +134,7 @@ struct AboutView: View { .frame(width: 56, height: 56) .background(GG.emerald.opacity(0.12), in: RoundedRectangle(cornerRadius: 14)) VStack(alignment: .leading, spacing: 2) { - Text("GrammaGem").font(.title2.bold()) + Text("GrammarGem").font(.title2.bold()) Text("Version \(AppConfig.appVersion)").foregroundStyle(.secondary) Text("The private, on-device writing assistant for Mac.") .font(.callout).foregroundStyle(.secondary) @@ -153,7 +153,7 @@ struct AboutView: View { Card { Text("Open source").font(.headline) - Text("GrammaGem is open source under the MIT License — a privacy tool you can inspect.") + Text("GrammarGem is open source under the MIT License — a privacy tool you can inspect.") .font(.callout).foregroundStyle(.secondary) } diff --git a/Sources/GrammarGem/App/MainWindow/DashboardView.swift b/Sources/GrammarGem/App/MainWindow/DashboardView.swift index 7bdc8b3..b57c192 100644 --- a/Sources/GrammarGem/App/MainWindow/DashboardView.swift +++ b/Sources/GrammarGem/App/MainWindow/DashboardView.swift @@ -91,7 +91,7 @@ struct DashboardView: View { Label("Fix selection", systemImage: "checkmark.circle") } Button { app.showAsk() } label: { - Label("Ask GrammaGem", systemImage: "sparkles") + Label("Ask GrammarGem", systemImage: "sparkles") } if !license.isLicensed { Spacer() diff --git a/Sources/GrammarGem/App/MainWindow/DataViews.swift b/Sources/GrammarGem/App/MainWindow/DataViews.swift index de9c92d..4b35b4b 100644 --- a/Sources/GrammarGem/App/MainWindow/DataViews.swift +++ b/Sources/GrammarGem/App/MainWindow/DataViews.swift @@ -12,7 +12,7 @@ struct DictionaryView: View { var body: some View { DetailScaffold( title: "Personal Dictionary", - subtitle: "Words GrammaGem should never “correct” — names, brands, jargon." + subtitle: "Words GrammarGem should never “correct” — names, brands, jargon." ) { Card { HStack { diff --git a/Sources/GrammarGem/App/MainWindow/DevicesView.swift b/Sources/GrammarGem/App/MainWindow/DevicesView.swift index d2147f9..d39a93e 100644 --- a/Sources/GrammarGem/App/MainWindow/DevicesView.swift +++ b/Sources/GrammarGem/App/MainWindow/DevicesView.swift @@ -83,7 +83,7 @@ struct DevicesView: View { HStack { Link("Open license portal", destination: AppConfig.modelPortalURL) Spacer() - Text("Add a Mac: install GrammaGem there and paste the same key.") + Text("Add a Mac: install GrammarGem there and paste the same key.") .font(.caption).foregroundStyle(.secondary) } } diff --git a/Sources/GrammarGem/App/MainWindow/ExclusionsView.swift b/Sources/GrammarGem/App/MainWindow/ExclusionsView.swift index 74e4667..0c005d8 100644 --- a/Sources/GrammarGem/App/MainWindow/ExclusionsView.swift +++ b/Sources/GrammarGem/App/MainWindow/ExclusionsView.swift @@ -8,12 +8,12 @@ struct ExclusionsView: View { var body: some View { DetailScaffold( title: "Page Blocker", - subtitle: "Keep GrammaGem out of the way in sensitive apps and sites." + subtitle: "Keep GrammarGem out of the way in sensitive apps and sites." ) { Card { Label("How it works", systemImage: "hand.raised") .font(.headline) - Text("When the frontmost app or website is on these lists, GrammaGem stops monitoring and the hotkeys do nothing — useful for password managers, banking, and private work.") + Text("When the frontmost app or website is on these lists, GrammarGem stops monitoring and the hotkeys do nothing — useful for password managers, banking, and private work.") .font(.callout).foregroundStyle(.secondary) } diff --git a/Sources/GrammarGem/App/MainWindow/MainWindowView.swift b/Sources/GrammarGem/App/MainWindow/MainWindowView.swift index bc81ab6..2b2d224 100644 --- a/Sources/GrammarGem/App/MainWindow/MainWindowView.swift +++ b/Sources/GrammarGem/App/MainWindow/MainWindowView.swift @@ -59,7 +59,7 @@ enum MainSection: String, CaseIterable, Identifiable { ] } -/// The full GrammaGem management window: a clean sidebar + detail layout. +/// The full GrammarGem management window: a clean sidebar + detail layout. struct MainWindowView: View { @State private var selection: MainSection? diff --git a/Sources/GrammarGem/App/MainWindow/SystemViews.swift b/Sources/GrammarGem/App/MainWindow/SystemViews.swift index 41b5d08..bec3bb8 100644 --- a/Sources/GrammarGem/App/MainWindow/SystemViews.swift +++ b/Sources/GrammarGem/App/MainWindow/SystemViews.swift @@ -17,7 +17,7 @@ struct ShortcutsView: View { combo: $prefs.fixHotkey) Divider() shortcutRow( - name: "Ask GrammaGem", + name: "Ask GrammarGem", detail: "Rewrite with an instruction", combo: $prefs.askHotkey) } @@ -141,7 +141,7 @@ struct PrivacyView: View { } Card { - Text("The only times GrammaGem uses the network").font(.headline) + Text("The only times GrammarGem uses the network").font(.headline) networkRow("One-time AI model download", "Hugging Face, on first run") Divider() networkRow("License activation & checks", "To enforce your device cap") diff --git a/Sources/GrammarGem/App/MainWindow/WritingModesView.swift b/Sources/GrammarGem/App/MainWindow/WritingModesView.swift index e25b9f2..f981b27 100644 --- a/Sources/GrammarGem/App/MainWindow/WritingModesView.swift +++ b/Sources/GrammarGem/App/MainWindow/WritingModesView.swift @@ -15,7 +15,7 @@ struct WritingModesView: View { var body: some View { DetailScaffold( title: "Writing Modes", - subtitle: "Tune the tone for every context — or let GrammaGem pick it for you." + subtitle: "Tune the tone for every context — or let GrammarGem pick it for you." ) { builtInCard customCard @@ -88,7 +88,7 @@ struct WritingModesView: View { private var appAwareCard: some View { Card { HStack { Text("App-aware switching").font(.headline); if !paid { UpgradeBadge() } } - Text("Map an app to a Mode and GrammaGem applies it automatically when that app is in front.") + Text("Map an app to a Mode and GrammarGem applies it automatically when that app is in front.") .font(.callout).foregroundStyle(.secondary) if !customModes.appOverrides.isEmpty { diff --git a/Sources/GrammarGem/App/MenuBarContent.swift b/Sources/GrammarGem/App/MenuBarContent.swift index 053e3dd..4c00415 100644 --- a/Sources/GrammarGem/App/MenuBarContent.swift +++ b/Sources/GrammarGem/App/MenuBarContent.swift @@ -49,7 +49,7 @@ struct MenuBarContent: View { actionRow(title: "Fix selection", shortcut: app.preferences.fixHotkey.display) { Task { await app.runFix() } } - actionRow(title: "Ask GrammaGem…", shortcut: app.preferences.askHotkey.display) { + actionRow(title: "Ask GrammarGem…", shortcut: app.preferences.askHotkey.display) { app.showAsk() } if app.gate.appAwareEnabled { @@ -57,14 +57,14 @@ struct MenuBarContent: View { Task { await app.runAppAwareRewrite() } } } - actionRow(title: app.isPaused ? "Resume GrammaGem" : "Pause GrammaGem", shortcut: nil) { + actionRow(title: app.isPaused ? "Resume GrammarGem" : "Pause GrammarGem", shortcut: nil) { app.togglePause() } Divider() actionRow(title: "Show live issues…", shortcut: nil) { app.showLiveCheck() } - actionRow(title: "Open GrammaGem…", shortcut: nil) { app.showMainWindow() } + actionRow(title: "Open GrammarGem…", shortcut: nil) { app.showMainWindow() } actionRow(title: "Manage devices…", shortcut: nil) { app.showMainWindow(select: .devices) } actionRow(title: "Page blocker…", shortcut: nil) { app.showMainWindow(select: .exclusions) } actionRow(title: "Check for Updates…", shortcut: nil) { app.updater.checkForUpdates() } @@ -90,7 +90,7 @@ struct MenuBarContent: View { .frame(width: 290) } - /// Shown when Sparkle has found a newer signed build on grammagem.app. + /// Shown when Sparkle has found a newer signed build on grammargem.com. private func updateBanner(version: String) -> some View { HStack(spacing: 8) { Image(systemName: "arrow.down.circle.fill").foregroundStyle(GG.emerald) @@ -110,7 +110,7 @@ struct MenuBarContent: View { HStack(spacing: 8) { Image(systemName: "pencil.and.scribble").foregroundStyle(.tint) VStack(alignment: .leading, spacing: 1) { - Text("GrammaGem").font(.headline) + Text("GrammarGem").font(.headline) Text(app.license.tier.displayName + (app.license.isLicensed ? " · licensed" : " · free")) .font(.caption).foregroundStyle(.secondary) } diff --git a/Sources/GrammarGem/App/OnboardingView.swift b/Sources/GrammarGem/App/OnboardingView.swift index 8527961..b926043 100644 --- a/Sources/GrammarGem/App/OnboardingView.swift +++ b/Sources/GrammarGem/App/OnboardingView.swift @@ -1,6 +1,6 @@ import SwiftUI -/// First-run onboarding: explains why GrammaGem needs Accessibility, deep-links +/// First-run onboarding: explains why GrammarGem needs Accessibility, deep-links /// to System Settings, and advances automatically the moment permission is /// granted (even if granted directly in System Settings). struct OnboardingView: View { @@ -18,7 +18,7 @@ struct OnboardingView: View { ScrollView { VStack(alignment: .leading, spacing: 18) { VStack(alignment: .leading, spacing: 6) { - Text("Welcome to GrammaGem") + Text("Welcome to GrammarGem") .font(.largeTitle.bold()) Text("A private, on-device writing assistant that works in every app.") .foregroundStyle(.secondary) @@ -36,7 +36,7 @@ struct OnboardingView: View { stepCard( number: 1, title: "Turn it on everywhere", - body: "GrammaGem reads the text you select and writes the correction back. macOS requires Accessibility permission for this. Your text is processed on-device and never leaves your Mac.", + body: "GrammarGem reads the text you select and writes the correction back. macOS requires Accessibility permission for this. Your text is processed on-device and never leaves your Mac.", granted: permissions.accessibilityTrusted ) { if permissions.accessibilityTrusted { @@ -47,7 +47,7 @@ struct OnboardingView: View { Button("Open System Settings") { permissions.openAccessibilitySettings() } Button("Request permission") { permissions.requestAccessibility() } } - Text("This updates automatically once you flip GrammaGem on in Accessibility.") + Text("This updates automatically once you flip GrammarGem on in Accessibility.") .font(.caption).foregroundStyle(.secondary) } } @@ -114,7 +114,7 @@ struct OnboardingView: View { /// A safe, on-rails first-run demo: a local sample with planted mistakes that /// the REAL grammar engine fixes in one click. It operates on a plain string /// (never a live Accessibility element), so it's completely risk-free — the -/// "guaranteed visible win" before GrammaGem asks for anything. +/// "guaranteed visible win" before GrammarGem asks for anything. private struct DemoStep: View { @State private var text = "i has wrote alot of mistakes here, and it dont look profesional" @State private var issues: [Suggestion] = [] @@ -151,7 +151,7 @@ private struct DemoStep: View { } private var headline: String { - if cleaned { return "Clean ✨ — GrammaGem does this in every app you type." } + if cleaned { return "Clean ✨ — GrammarGem does this in every app you type." } if issues.isEmpty { return "Checking…" } return "We spotted \(issues.count) thing\(issues.count == 1 ? "" : "s") to tidy up — one click fixes them." } diff --git a/Sources/GrammarGem/App/SettingsView.swift b/Sources/GrammarGem/App/SettingsView.swift index 32981b9..b293065 100644 --- a/Sources/GrammarGem/App/SettingsView.swift +++ b/Sources/GrammarGem/App/SettingsView.swift @@ -25,7 +25,7 @@ private struct GeneralSettings: View { Form { Section("Shortcuts") { LabeledContent("Fix selection", value: "⌘;") - LabeledContent("Ask GrammaGem", value: "⌘'") + LabeledContent("Ask GrammarGem", value: "⌘'") Text("Custom shortcuts coming via the KeyboardShortcuts recorder (see README).") .font(.caption).foregroundStyle(.secondary) } @@ -147,7 +147,7 @@ private struct DictionarySettings: View { var body: some View { VStack(alignment: .leading, spacing: 12) { HStack { - TextField("Add a word GrammaGem should never correct", text: $newWord) + TextField("Add a word GrammarGem should never correct", text: $newWord) .textFieldStyle(.roundedBorder) .onSubmit(add) Button("Add", action: add).disabled(newWord.trimmingCharacters(in: .whitespaces).isEmpty) diff --git a/Sources/GrammarGem/Core/AppConfig.swift b/Sources/GrammarGem/Core/AppConfig.swift index a1016a2..7df8bab 100644 --- a/Sources/GrammarGem/Core/AppConfig.swift +++ b/Sources/GrammarGem/Core/AppConfig.swift @@ -1,15 +1,15 @@ import Foundation /// Compile-time configuration. The Lemon Squeezy identifiers are hard-coded so -/// the licensing layer can *hard-verify* that a key belongs to GrammaGem (and to +/// the licensing layer can *hard-verify* that a key belongs to GrammarGem (and to /// the claimed tier) rather than to some other Lemon Squeezy product. /// TODO(real-integration): replace every `TODO_*` value with your real IDs. enum AppConfig { - static let appName = "GrammaGem" - static let bundleIdentifier = "com.foundergem.grammagem" // TODO(real-integration) - static let supportEmail = "support@grammagem.app" // TODO(real-integration) - static let modelPortalURL = URL(string: "https://grammagem.app/license")! // TODO - static let websiteURL = URL(string: "https://grammagem.app")! + static let appName = "GrammarGem" + static let bundleIdentifier = "com.foundergem.grammargem" // TODO(real-integration) + static let supportEmail = "support@grammargem.com" // TODO(real-integration) + static let modelPortalURL = URL(string: "https://www.grammargem.com/license")! // TODO + static let websiteURL = URL(string: "https://www.grammargem.com")! static let appVersion = "0.1.0" // Legal entity (shown in About / legal). diff --git a/Sources/GrammarGem/Entitlements/FeatureGate.swift b/Sources/GrammarGem/Entitlements/FeatureGate.swift index 981a02c..13e56ef 100644 --- a/Sources/GrammarGem/Entitlements/FeatureGate.swift +++ b/Sources/GrammarGem/Entitlements/FeatureGate.swift @@ -72,7 +72,7 @@ final class FeatureGate: ObservableObject { /// Free-tier AI action counter. Persists `{date, count}` in UserDefaults and /// resets at local midnight (compares the stored local date string to today's). final class DailyCounter { - private let key = "GrammaGem.aiActions.daily" + private let key = "GrammarGem.aiActions.daily" private let defaults = UserDefaults.standard private static let formatter: DateFormatter = { diff --git a/Sources/GrammarGem/Grammar/PersonalDictionary.swift b/Sources/GrammarGem/Grammar/PersonalDictionary.swift index 97764ac..29afb66 100644 --- a/Sources/GrammarGem/Grammar/PersonalDictionary.swift +++ b/Sources/GrammarGem/Grammar/PersonalDictionary.swift @@ -1,13 +1,13 @@ import Foundation -/// The user's personal dictionary — names, brand terms, jargon GrammaGem should +/// The user's personal dictionary — names, brand terms, jargon GrammarGem should /// never "correct". Feeds Harper's ignore-list and the LLM context. Capped at 25 /// entries on free, unlimited on paid (enforced by `FeatureGate`, not here). @MainActor final class PersonalDictionary: ObservableObject { @Published private(set) var entries: [String] - private let key = "GrammaGem.personalDictionary" + private let key = "GrammarGem.personalDictionary" private let defaults = UserDefaults.standard init() { diff --git a/Sources/GrammarGem/Licensing/DeviceFingerprint.swift b/Sources/GrammarGem/Licensing/DeviceFingerprint.swift index be5ae2b..b17ee51 100644 --- a/Sources/GrammarGem/Licensing/DeviceFingerprint.swift +++ b/Sources/GrammarGem/Licensing/DeviceFingerprint.swift @@ -38,7 +38,7 @@ enum DeviceFingerprint { } private static func fallbackID() -> String { - let key = "GrammaGem.fallbackDeviceID" + let key = "GrammarGem.fallbackDeviceID" if let existing = UserDefaults.standard.string(forKey: key) { return existing } let id = UUID().uuidString UserDefaults.standard.set(id, forKey: key) diff --git a/Sources/GrammarGem/Licensing/LemonSqueezyClient.swift b/Sources/GrammarGem/Licensing/LemonSqueezyClient.swift index 5b9a6b4..15f2f69 100644 --- a/Sources/GrammarGem/Licensing/LemonSqueezyClient.swift +++ b/Sources/GrammarGem/Licensing/LemonSqueezyClient.swift @@ -2,7 +2,7 @@ import Foundation /// Talks to the **Lemon Squeezy License API** directly from the app — no server /// of ours, no database, no per-user cost (spec §6). Exposes activate / validate -/// / deactivate and hard-verifies that a key belongs to GrammaGem + the claimed tier. +/// / deactivate and hard-verifies that a key belongs to GrammarGem + the claimed tier. final class LemonSqueezyClient { private let session: URLSession private let base = AppConfig.LemonSqueezy.apiBase @@ -54,7 +54,7 @@ final class LemonSqueezyClient { // MARK: - Hard verification (spec §6) /// Confirm the key is for OUR store/product, then resolve which tier its - /// variant corresponds to. Prevents a key from another LS product unlocking GrammaGem. + /// variant corresponds to. Prevents a key from another LS product unlocking GrammarGem. private func verifyAndResolveTier(meta: LSMeta?, licenseKey: LSLicenseKey?) throws -> Tier { guard let meta else { throw LicenseError.wrongProduct } diff --git a/Sources/GrammarGem/Licensing/LicenseModels.swift b/Sources/GrammarGem/Licensing/LicenseModels.swift index a9196a5..140a3e2 100644 --- a/Sources/GrammarGem/Licensing/LicenseModels.swift +++ b/Sources/GrammarGem/Licensing/LicenseModels.swift @@ -62,7 +62,7 @@ struct LSLicenseKey: Codable { } /// `meta` carries the store/product/variant identity we *hard-verify* against -/// AppConfig so a key from another Lemon Squeezy product can't unlock GrammaGem. +/// AppConfig so a key from another Lemon Squeezy product can't unlock GrammarGem. struct LSMeta: Codable { let store_id: Int? let product_id: Int? diff --git a/Sources/GrammarGem/Stats/UsageStats.swift b/Sources/GrammarGem/Stats/UsageStats.swift index 47e90c4..40d5db0 100644 --- a/Sources/GrammarGem/Stats/UsageStats.swift +++ b/Sources/GrammarGem/Stats/UsageStats.swift @@ -14,12 +14,12 @@ final class UsageStats: ObservableObject { } /// What a Grammarly-style subscription runs per year (USD) — used only for the - /// honest, local "subscription you didn't pay" figure. GrammaGem is one-time. + /// honest, local "subscription you didn't pay" figure. GrammarGem is one-time. static let comparableAnnualSubscriptionUSD = 144.0 @Published private(set) var data: Snapshot - private let key = "GrammaGem.usageStats" + private let key = "GrammarGem.usageStats" private let d = UserDefaults.standard private static let fmt: DateFormatter = { @@ -64,7 +64,7 @@ final class UsageStats: ObservableObject { var currentStreak: Int { Self.streak(perDay: data.perDay, asOf: Date()) } /// The Grammarly subscription you DIDN'T pay: their annual price prorated over - /// how long you've owned GrammaGem. Honest, local, illustrative — and it only + /// how long you've owned GrammarGem. Honest, local, illustrative — and it only /// grows, which is the point of a one-time purchase (see the value plan §5). var subscriptionAvoidedUSD: Int { Self.subscriptionAvoidedUSD( diff --git a/Sources/GrammarGem/System/AXSupport.swift b/Sources/GrammarGem/System/AXSupport.swift index a80141c..48f155c 100644 --- a/Sources/GrammarGem/System/AXSupport.swift +++ b/Sources/GrammarGem/System/AXSupport.swift @@ -43,7 +43,7 @@ enum AX { /// /// On recent macOS, `AXUIElementCreateSystemWide()` returns /// `kAXErrorCannotComplete` (-25204) for *every* query made by a background / - /// accessory process (which is exactly what a menu-bar app like GrammaGem is). + /// accessory process (which is exactly what a menu-bar app like GrammarGem is). /// When that happens the system-wide focused-element read yields nil and the /// app "sees" no text or text fields at all. Resolving the focused element /// through the **frontmost application's** own AX element works reliably in diff --git a/Sources/GrammarGem/System/Exclusions.swift b/Sources/GrammarGem/System/Exclusions.swift index 4587ed7..84ac71f 100644 --- a/Sources/GrammarGem/System/Exclusions.swift +++ b/Sources/GrammarGem/System/Exclusions.swift @@ -1,7 +1,7 @@ import Foundation import AppKit -/// The "page blocker": apps and domains where GrammaGem should stay completely +/// The "page blocker": apps and domains where GrammarGem should stay completely /// out of the way — password managers, banking sites, anything sensitive. /// When the frontmost context is excluded, live monitoring and the hotkeys are /// suppressed. @@ -10,8 +10,8 @@ final class Exclusions: ObservableObject { @Published private(set) var blockedApps: [String] // bundle identifiers @Published private(set) var blockedDomains: [String] // hostnames, e.g. "chase.com" - private let appsKey = "GrammaGem.blockedApps" - private let domainsKey = "GrammaGem.blockedDomains" + private let appsKey = "GrammarGem.blockedApps" + private let domainsKey = "GrammarGem.blockedDomains" private let d = UserDefaults.standard /// Common sensitive apps offered as one-tap suggestions in the UI. @@ -31,7 +31,7 @@ final class Exclusions: ObservableObject { /// a browser's URL can't be read). var hasDomainRules: Bool { !blockedDomains.isEmpty } - /// Whether GrammaGem should be suppressed for this frontmost context. + /// Whether GrammarGem should be suppressed for this frontmost context. func isBlocked(bundleID: String?, domain: String?) -> Bool { if let bundleID, blockedApps.contains(bundleID) { return true } if let host = domain?.lowercased(), !host.isEmpty { diff --git a/Sources/GrammarGem/System/LiveMonitor.swift b/Sources/GrammarGem/System/LiveMonitor.swift index 2cc22ff..ad6b65c 100644 --- a/Sources/GrammarGem/System/LiveMonitor.swift +++ b/Sources/GrammarGem/System/LiveMonitor.swift @@ -19,7 +19,7 @@ struct DetectedField: Identifiable { /// Performance & safety: the Accessibility-tree traversal (the part that can hang /// on a busy/wedged app) runs OFF the main thread with a per-message timeout; only /// the bounded spell/grammar pass and publish happen on the main actor. It never -/// scans GrammaGem itself, respects the page blocker, and applies fixes against the +/// scans GrammarGem itself, respects the page blocker, and applies fixes against the /// element's *live* value so it can't overwrite text typed since the last scan. @MainActor final class LiveMonitor: ObservableObject { @@ -179,7 +179,7 @@ final class LiveMonitor: ObservableObject { if scanning && !force { return } // don't pile up scans guard let app = NSWorkspace.shared.frontmostApplication else { clear(); return } - // Never scan GrammaGem's own windows. + // Never scan GrammarGem's own windows. if app.processIdentifier == ownPID { clear(); return } activeAppName = app.localizedName ?? "" diff --git a/Sources/GrammarGem/System/Permissions.swift b/Sources/GrammarGem/System/Permissions.swift index 044f44d..3ac8ec2 100644 --- a/Sources/GrammarGem/System/Permissions.swift +++ b/Sources/GrammarGem/System/Permissions.swift @@ -2,7 +2,7 @@ import Foundation import AppKit import ApplicationServices -/// Tracks and requests the macOS permissions GrammaGem needs to read & replace +/// Tracks and requests the macOS permissions GrammarGem needs to read & replace /// text system-wide: **Accessibility** (required) and, for the synthetic-keystroke /// clipboard fallback, **Input Monitoring** may also be prompted by the system. @MainActor diff --git a/Sources/GrammarGem/System/SnippetStore.swift b/Sources/GrammarGem/System/SnippetStore.swift index 4d17914..a959497 100644 --- a/Sources/GrammarGem/System/SnippetStore.swift +++ b/Sources/GrammarGem/System/SnippetStore.swift @@ -13,7 +13,7 @@ struct Snippet: Codable, Identifiable, Equatable { final class SnippetStore: ObservableObject { @Published private(set) var snippets: [Snippet] - private let key = "GrammaGem.snippets" + private let key = "GrammarGem.snippets" private let d = UserDefaults.standard init() { diff --git a/Sources/GrammarGem/System/TextCapture.swift b/Sources/GrammarGem/System/TextCapture.swift index e9df9a2..80e4f48 100644 --- a/Sources/GrammarGem/System/TextCapture.swift +++ b/Sources/GrammarGem/System/TextCapture.swift @@ -4,7 +4,7 @@ import ApplicationServices import Carbon.HIToolbox /// Reads the user's selected text from the frontmost app and writes a corrected -/// value back — the mechanism that makes GrammaGem work *everywhere*. +/// value back — the mechanism that makes GrammarGem work *everywhere*. /// /// Two paths, mirroring the spec (§4): /// 1. **Accessibility API** (preferred): read/write `kAXSelectedTextAttribute` @@ -27,7 +27,7 @@ final class TextCapture { var errorDescription: String? { switch self { case .noSelection: return "Select some text first, then press the hotkey." - case .notPermitted: return "GrammaGem needs Accessibility permission to read and replace text." + case .notPermitted: return "GrammarGem needs Accessibility permission to read and replace text." } } } diff --git a/Sources/GrammarGem/System/TextFieldScanner.swift b/Sources/GrammarGem/System/TextFieldScanner.swift index e2c40fb..ff5ac1d 100644 --- a/Sources/GrammarGem/System/TextFieldScanner.swift +++ b/Sources/GrammarGem/System/TextFieldScanner.swift @@ -15,7 +15,7 @@ struct ScannedField { /// Walks the Accessibility tree of the frontmost window and collects every /// editable text element (text fields, text areas, combo/search boxes) with -/// content — so GrammaGem can check *all* the text on screen, not just the one +/// content — so GrammarGem can check *all* the text on screen, not just the one /// the cursor is in. Bounded so huge web/Electron trees can't stall the app, and /// every cross-process message has a timeout so a wedged app can't hang the scan. /// diff --git a/Sources/GrammarGem/System/UpdaterManager.swift b/Sources/GrammarGem/System/UpdaterManager.swift index c8aac65..e4c2981 100644 --- a/Sources/GrammarGem/System/UpdaterManager.swift +++ b/Sources/GrammarGem/System/UpdaterManager.swift @@ -1,7 +1,7 @@ import Foundation import Sparkle -/// Wraps Sparkle's updater. It background-checks the appcast on grammagem.app and +/// Wraps Sparkle's updater. It background-checks the appcast on grammargem.com and /// publishes `updateAvailableVersion` when a newer, EdDSA-verified build exists, so /// the menu bar can show an "Update available" button. Triggering an update runs /// Sparkle's verified download + install flow. diff --git a/Tests/GrammarGemTests/GrammarGemTests.swift b/Tests/GrammarGemTests/GrammarGemTests.swift index 82f420f..41bc914 100644 --- a/Tests/GrammarGemTests/GrammarGemTests.swift +++ b/Tests/GrammarGemTests/GrammarGemTests.swift @@ -1,7 +1,7 @@ import XCTest -@testable import GrammaGem +@testable import GrammarGem -final class GrammaGemTests: XCTestCase { +final class GrammarGemTests: XCTestCase { // MARK: - Tiers / entitlements @@ -117,10 +117,10 @@ final class GrammaGemTests: XCTestCase { /// MLX integration end-to-end. func testMLXRealGenerationIfModelPresent() async throws { // Opt-in: `swift test` (CLI) can't place mlx-swift's metallib, so this is - // gated. Run it via the app's `--mlx-selftest`, or set GRAMMAGEM_MLX_TEST=1 + // gated. Run it via the app's `--mlx-selftest`, or set GRAMMARGEM_MLX_TEST=1 // with the metallib colocated. See scripts/build-metallib.sh. - guard ProcessInfo.processInfo.environment["GRAMMAGEM_MLX_TEST"] == "1" else { - throw XCTSkip("set GRAMMAGEM_MLX_TEST=1 (metallib colocated) to run the MLX integration test") + guard ProcessInfo.processInfo.environment["GRAMMARGEM_MLX_TEST"] == "1" else { + throw XCTSkip("set GRAMMARGEM_MLX_TEST=1 (metallib colocated) to run the MLX integration test") } guard let dir = ModelManager.completedModelDirectory(repo: AppConfig.Model.defaultRepo) else { throw XCTSkip("on-device model not downloaded; skipping MLX integration test") diff --git a/docs/grammarly-value-plan.md b/docs/grammarly-value-plan.md index a37e54c..11bf563 100644 --- a/docs/grammarly-value-plan.md +++ b/docs/grammarly-value-plan.md @@ -1,6 +1,6 @@ -# Grammarly Value Teardown -> GrammaGem Plan +# Grammarly Value Teardown -> GrammarGem Plan -*Senior product + Swift engineering review. Every claim below is grounded in the current GrammaGem source. File references use absolute paths; the load-bearing bug is the mis-casing in `SystemGrammarEngine.swift:42-45`.* +*Senior product + Swift engineering review. Every claim below is grounded in the current GrammarGem source. File references use absolute paths; the load-bearing bug is the mis-casing in `SystemGrammarEngine.swift:42-45`.* --- @@ -8,34 +8,34 @@ Grammarly's perceived value is NOT its grammar engine. It is a stack of interaction and psychology layers on top of a competent engine. Ranked by leverage for a one-time-purchase, on-device Mac utility: -1. **Trustworthy correction quality (the foundation).** Every felt-value mechanic above it collapses if a fix is wrong. Grammarly's "accept-accept-accept" rhythm only works because in-place application is reliable and casing/context is preserved. GrammaGem's engine currently *demonstrably violates this* (`problemm` -> `Problem` mid-sentence). Fix this first; nothing else matters until it's solid. +1. **Trustworthy correction quality (the foundation).** Every felt-value mechanic above it collapses if a fix is wrong. Grammarly's "accept-accept-accept" rhythm only works because in-place application is reliable and casing/context is preserved. GrammarGem's engine currently *demonstrably violates this* (`problemm` -> `Problem` mid-sentence). Fix this first; nothing else matters until it's solid. -2. **The fix-as-button atomic loop: read the fix and apply it in one motion.** Grammarly's clickable green replacement chip collapses diagnosis + remedy + action into a single low-friction act, with a cheap, always-present dismiss so saying no is as easy as saying yes. GrammaGem has an `Apply` button but no dismiss/ignore/add-to-dictionary, no keyboard accept, and the apply path is brittle (whole-field AX overwrite). +2. **The fix-as-button atomic loop: read the fix and apply it in one motion.** Grammarly's clickable green replacement chip collapses diagnosis + remedy + action into a single low-friction act, with a cheap, always-present dismiss so saying no is as easy as saying yes. GrammarGem has an `Apply` button but no dismiss/ignore/add-to-dictionary, no keyboard accept, and the apply path is brittle (whole-field AX overwrite). -3. **Categorization + counts + a score: turning a wall of red into a finite, beatable list.** Four named, color-coded buckets, per-category count chips, one running issue badge, and a 0-100 score convert dread into a checklist with a meter that only goes up. GrammaGem has a raw issue count (3 colors) and *zero* score concept. +3. **Categorization + counts + a score: turning a wall of red into a finite, beatable list.** Four named, color-coded buckets, per-category count chips, one running issue badge, and a 0-100 score convert dread into a checklist with a meter that only goes up. GrammarGem has a raw issue count (3 colors) and *zero* score concept. -4. **The rigged first-run "wow": guaranteed visible win in under 60 seconds.** A pre-seeded, error-salted demo doc means the product proves itself before asking for anything. GrammaGem's onboarding only handles Accessibility + model download — it never demonstrates the correction loop at all. +4. **The rigged first-run "wow": guaranteed visible win in under 60 seconds.** A pre-seeded, error-salted demo doc means the product proves itself before asking for anything. GrammarGem's onboarding only handles Accessibility + model download — it never demonstrates the correction loop at all. -5. **Ongoing perceived value without surveillance: progress you can see.** Grammarly uses cloud percentiles + weekly behavioral emails. GrammaGem can recreate the *feeling* — self-vs-self, fully on-device — with a local score trend, streaks, milestones, and a "subscription you didn't pay" money figure. The plumbing (`UsageStats.perDay`) already exists. +5. **Ongoing perceived value without surveillance: progress you can see.** Grammarly uses cloud percentiles + weekly behavioral emails. GrammarGem can recreate the *feeling* — self-vs-self, fully on-device — with a local score trend, streaks, milestones, and a "subscription you didn't pay" money figure. The plumbing (`UsageStats.perDay`) already exists. 6. **The generative "writing partner" layer: hand me the better sentence, not just the flag.** Sentence rewrites, tone detection/adjustment, conciseness. This is real value but is currently 100% simulated (`MLXEngine.swift` is a string-hack stub) and gated by a daily counter. It is the right *paid* tier, but it must produce real output before it can be sold. -The strategic asymmetry to exploit throughout: every Grammarly value moment carries an implicit "and you'll pay again next year." GrammaGem's identical mechanics should be framed "yours once, forever, on this Mac." +The strategic asymmetry to exploit throughout: every Grammarly value moment carries an implicit "and you'll pay again next year." GrammarGem's identical mechanics should be framed "yours once, forever, on this Mac." --- -## 2. Mechanic-by-mechanic: how Grammarly does it -> how GrammaGem should do it +## 2. Mechanic-by-mechanic: how Grammarly does it -> how GrammarGem should do it ### Mechanic 1 — Trustworthy correction quality (see §3 for the full engineering plan) - **Grammarly:** ranks by confidence, suppresses low-confidence edits, never garbles surrounding text, preserves casing, and limits bulk-apply to high-confidence objective mechanics only. -- **GrammaGem today:** `SystemGrammarEngine` blindly trusts `NSSpellChecker.correction(forWordRange:)`, which is sentence-position-aware and capitalizes a word it thinks starts a sentence — producing `problemm` -> `Problem` mid-sentence (`SystemGrammarEngine.swift:42-45`). `Suggestion` has no confidence/severity/alternatives (`Models.swift:48-59`). Default `correct()` applies *every* suggestion including no-op grammar flags where `replacement == original` (`GrammarEngine.swift:22-29`). +- **GrammarGem today:** `SystemGrammarEngine` blindly trusts `NSSpellChecker.correction(forWordRange:)`, which is sentence-position-aware and capitalizes a word it thinks starts a sentence — producing `problemm` -> `Problem` mid-sentence (`SystemGrammarEngine.swift:42-45`). `Suggestion` has no confidence/severity/alternatives (`Models.swift:48-59`). Default `correct()` applies *every* suggestion including no-op grammar flags where `replacement == original` (`GrammarEngine.swift:22-29`). - **Do:** real Harper FFI; case/whitespace post-processing; add `confidence`/`severity`/`alternatives` to `Suggestion`; never auto-apply no-ops or low-confidence flags. - **Files:** `SystemGrammarEngine.swift`, `HarperEngine.swift`, `GrammarEngine.swift`, `Models.swift`, `harper-ffi/`. - **Impact: high · Effort: L** ### Mechanic 2 — The fix-as-button atomic loop (+ dismiss / ignore / add-to-dictionary) - **Grammarly:** the suggested word *is* the button (green = go/safe/done); an always-present cheap dismiss (trash/Esc) and add-to-dictionary make accepting feel safe; Tab-to-navigate / Enter-to-accept / Esc-to-dismiss removes the mouse round-trip. -- **GrammaGem today:** `FieldCard` shows a message + one `original -> replacement` + a small `Apply` button (`LiveCheckView.swift:104-119`). There is **no dismiss, no ignore, no add-to-dictionary, no keyboard accept.** Per-issue `apply()` bails silently if the field changed at all since the snapshot (`LiveMonitor.swift:82-89`), and even single-issue apply rewrites the *whole* AX value (`LiveMonitor.swift:101-103`), risking caret/undo/formatting loss. +- **GrammarGem today:** `FieldCard` shows a message + one `original -> replacement` + a small `Apply` button (`LiveCheckView.swift:104-119`). There is **no dismiss, no ignore, no add-to-dictionary, no keyboard accept.** Per-issue `apply()` bails silently if the field changed at all since the snapshot (`LiveMonitor.swift:82-89`), and even single-issue apply rewrites the *whole* AX value (`LiveMonitor.swift:101-103`), risking caret/undo/formatting loss. - **Do (realistic for a cross-app AX tool — we cannot draw a green chip inside arbitrary apps):** - Make the replacement text itself the primary tappable control in the card (the chip *is* the fix), styled by category color. - Add a per-suggestion overflow: **Dismiss** (model a `dismissedIDs: Set` on the monitor so it survives re-scans), **Ignore word** / **Add to dictionary** (route into `PersonalDictionary` -> `ignoreList`), gated by `freeDictionaryCap`. @@ -47,9 +47,9 @@ The strategic asymmetry to exploit throughout: every Grammarly value moment carr ### Mechanic 3 — Categorization, counts, and an on-device document score - **Grammarly:** four named buckets (Correctness/Clarity/Engagement/Delivery) each with a color and a count chip that doubles as a filter; one master running badge; a 0-100 percentile score that ticks up on every accept; cards ordered by severity (objective errors first) so the early wins build trust. -- **GrammaGem today:** `GrammarKind` has 6 cases but `.punctuation` is dead; the panel reduces everything to 3 dot colors (`LiveCheckView.swift:136-142`); `issueCount` is a raw sum (`LiveMonitor.swift:32`); there is **no score, no per-category chips, no severity ordering, no filter**. +- **GrammarGem today:** `GrammarKind` has 6 cases but `.punctuation` is dead; the panel reduces everything to 3 dot colors (`LiveCheckView.swift:136-142`); `issueCount` is a raw sum (`LiveMonitor.swift:32`); there is **no score, no per-category chips, no severity ordering, no filter**. - **Do (on-device, no cloud, no percentile-vs-others):** - - Introduce GrammaGem's own named buckets that fit the engine: e.g. **Correctness** (spelling/grammar/punctuation), **Clarity** (phrasing/conciseness — from the real LLM), **Polish** (repetition/capitalization/style). Use original color semantics (do NOT clone Grammarly's exact red/blue/green/purple mapping or wording). + - Introduce GrammarGem's own named buckets that fit the engine: e.g. **Correctness** (spelling/grammar/punctuation), **Clarity** (phrasing/conciseness — from the real LLM), **Polish** (repetition/capitalization/style). Use original color semantics (do NOT clone Grammarly's exact red/blue/green/purple mapping or wording). - Add **count chips per bucket** in the panel header that filter the card list; keep the menu-bar badge as the master tally (`MenuBarLabel`). - Compute a **local cleanliness score** at check-time: a deterministic function of issues-per-100-words by severity (e.g. `100 - weighted_issues`). It is honest because it's defined relative to *this document*, not a hidden user corpus. Show it on the card header and trend it on the dashboard. - **Order cards by severity then document position** (objective spelling/grammar first) so the first accept is a high-confidence win. @@ -59,18 +59,18 @@ The strategic asymmetry to exploit throughout: every Grammarly value moment carr ### Mechanic 4 — The first-run "wow" (see §4 for the full sequence) - **Grammarly:** land in an error-salted demo doc -> "we found N issues" -> one-click fixes vanish underlines + decrement counter -> goal setup -> install-everywhere prompt at the dopamine peak. -- **GrammaGem today:** `OnboardingView` only covers Accessibility + model download (`OnboardingView.swift`); it never shows the correction loop. +- **GrammarGem today:** `OnboardingView` only covers Accessibility + model download (`OnboardingView.swift`); it never shows the correction loop. - **Do:** add an in-app demo step with a pre-seeded sample, a "we found N things to fix" reveal, and a satisfying one-click-to-clean animation — *before* asking for nothing-but-praise (no install-everywhere pressure; we're already system-wide). Detail in §4. - **Files:** `OnboardingView.swift`, plus a small `DemoDocument` view reusing the highlight + apply UI. - **Impact: high · Effort: M** ### Mechanic 5 — Ongoing perceived value (privacy-native, self-vs-self) - **Grammarly:** 0-100 score, weekly Insights email ("more productive than X% of users"), lifetime words-checked counter, streaks — all cloud + behavioral-email, the exact surveillance we market against. -- **GrammaGem today:** `UsageStats` tracks `totalCorrections`, `totalAIActions`, `totalWords`, and `perDay` (`UsageStats.swift`); the dashboard shows four tiles + a 7-bar chart, but **no score, no streak, no week-over-week, no milestone, no money-saved figure**. `estimatedMinutesSaved` is a crude untuned constant (`8s/correction + 45s/AI-action`). Stats are invisible outside the main window. +- **GrammarGem today:** `UsageStats` tracks `totalCorrections`, `totalAIActions`, `totalWords`, and `perDay` (`UsageStats.swift`); the dashboard shows four tiles + a 7-bar chart, but **no score, no streak, no week-over-week, no milestone, no money-saved figure**. `estimatedMinutesSaved` is a crude untuned constant (`8s/correction + 45s/AI-action`). Stats are invisible outside the main window. - **Do (all local, no telemetry, stops nagging the moment they own it):** - **Local writing-score trend** on the dashboard (from Mechanic 3), compared only to the user's own past. - **Streak + milestones** from existing `perDay` data ("7-day streak", "1,000th correction", "100k words polished") — cheap, high word-of-mouth, and the right re-engagement hook for a no-renewal product. - - **"Subscription you didn't pay" figure** — translate usage into money: the marketing site already hammers "~\$144/yr vs pay once," but the *app* never does. Show "You've polished N times — that's the price of GrammaGem recovered M times over," computed locally. This is the strongest one-time-purchase value teaser and it lives where the user actually is. + - **"Subscription you didn't pay" figure** — translate usage into money: the marketing site already hammers "~\$144/yr vs pay once," but the *app* never does. Show "You've polished N times — that's the price of GrammarGem recovered M times over," computed locally. This is the strongest one-time-purchase value teaser and it lives where the user actually is. - **Week-over-week delta** on the bar chart and a lightweight in-app weekly recap card (NOT an email; no pipeline, no surveillance). - **Surface one stat in the menu bar dropdown** (the most-seen surface) so value reminders don't require opening the dashboard. - Tune `estimatedMinutesSaved` to scale by words changed / action type so the headline "was it worth it?" number is credible. @@ -79,7 +79,7 @@ The strategic asymmetry to exploit throughout: every Grammarly value moment carr ### Mechanic 6 — The generative "writing partner" layer (real LLM, honest gating) - **Grammarly:** sentence rewrites ("Replace with This Version" + Highlight-Changes diff), tone detection (emoji + label), tone adjustment, conciseness, GrammarlyGO — all one-click, reversible, before/after. -- **GrammaGem today:** `MLXEngine` is a stub doing `replacingOccurrences` string hacks (`MLXEngine.swift`); `tidy()` even re-introduces casing risk; `detectTone` keys off substrings. `ModelManager` downloads real weights but nothing loads them. Gated by `freeDailyAIActions = 10` shared across rewrite/tone/Ask/translate. +- **GrammarGem today:** `MLXEngine` is a stub doing `replacingOccurrences` string hacks (`MLXEngine.swift`); `tidy()` even re-introduces casing risk; `detectTone` keys off substrings. `ModelManager` downloads real weights but nothing loads them. Gated by `freeDailyAIActions = 10` shared across rewrite/tone/Ask/translate. - **Do:** - Wire the **real MLX model** from `ModelManager.modelsDirectory` (the download is currently a dead-end); uncomment `mlx-swift` in `Package.swift`. - Adopt the **one-click + reversible + before/after diff** delivery contract for every rewrite — this is what neutralizes "the AI is taking over my voice." @@ -133,7 +133,7 @@ Wire dismiss / add-to-dictionary (Mechanic 2) back into ranking so repeated fals --- -## 4. The first-run "wow" sequence for GrammaGem (original copy) +## 4. The first-run "wow" sequence for GrammarGem (original copy) Goal: a guaranteed visible win in under 60 seconds, *inside our own window* (we don't need Grammarly's blank-canvas demo trick or its install-everywhere upsell — we're already system-wide). Onboarding today (`OnboardingView.swift`) skips this entirely. @@ -145,7 +145,7 @@ Proposed flow: 3. **One satisfying click.** A single "Clean it up" button animates the highlights resolving one by one; the count ticks to 0; the paragraph visibly improves. This is the operant loop — trivial action, immediate visible reward — experienced once, on rails, with zero risk. (Reuse the apply path; it's a local string, not a live AX element, so it's completely safe.) -4. **The reveal:** "That's GrammaGem. It does this in Mail, Slack, Notes, your browser — everywhere you type." Then the *first* ask: **Accessibility** (the existing step 2 / `stepCard`), now framed as "Turn it on everywhere." +4. **The reveal:** "That's GrammarGem. It does this in Mail, Slack, Notes, your browser — everywhere you type." Then the *first* ask: **Accessibility** (the existing step 2 / `stepCard`), now framed as "Turn it on everywhere." 5. **Optional model step:** keep the existing "Download the on-device model (optional) — grammar works instantly with no download" card. Frame the AI features as a bonus, not a blocker. diff --git a/harper-ffi/README.md b/harper-ffi/README.md index 2d4153f..6fd2d49 100644 --- a/harper-ffi/README.md +++ b/harper-ffi/README.md @@ -5,7 +5,7 @@ A thin Rust static library that exposes the **Harper** grammar core integration (spec §1, §2, §8). The Swift side talks to this through the `GrammarEngine` protocol; today -[`HarperEngine.swift`](../Sources/GrammaGem/Grammar/HarperEngine.swift) ships a +[`HarperEngine.swift`](../Sources/GrammarGem/Grammar/HarperEngine.swift) ships a small pure-Swift rule stub so the system loop + tests run with zero native deps. ## Planned shape diff --git a/scripts/build-metallib.sh b/scripts/build-metallib.sh index ce22774..755a7b4 100755 --- a/scripts/build-metallib.sh +++ b/scripts/build-metallib.sh @@ -15,7 +15,7 @@ cd "$ROOT" DD=".xcode-build" echo "==> xcodebuild (compiles mlx-swift metal kernels — a few minutes)" -xcodebuild build -scheme GrammaGem -configuration Release \ +xcodebuild build -scheme GrammarGem -configuration Release \ -destination 'platform=macOS,arch=arm64' \ -derivedDataPath "$DD" -skipMacroValidation >/dev/null diff --git a/scripts/build.sh b/scripts/build.sh index e530154..1d66509 100755 --- a/scripts/build.sh +++ b/scripts/build.sh @@ -1,5 +1,5 @@ #!/usr/bin/env bash -# Build a runnable GrammaGem.app bundle (arm64 / Apple Silicon — the MLX +# Build a runnable GrammarGem.app bundle (arm64 / Apple Silicon — the MLX # on-device LLM runtime is Metal-only, so Intel is not supported). # Usage: ./scripts/build.sh (run from the mac/ directory) set -euo pipefail @@ -8,7 +8,7 @@ ROOT="$(cd "$(dirname "$0")/.." && pwd)" cd "$ROOT" CONFIG="release" -APP="GrammaGem.app" +APP="GrammarGem.app" DIST="dist" echo "==> Building Harper static lib (universal)" @@ -24,7 +24,7 @@ echo "==> Assembling ${APP}" rm -rf "${DIST}/${APP}" mkdir -p "${DIST}/${APP}/Contents/MacOS" "${DIST}/${APP}/Contents/Resources" -cp "${BIN}/GrammaGem" "${DIST}/${APP}/Contents/MacOS/GrammaGem" +cp "${BIN}/GrammarGem" "${DIST}/${APP}/Contents/MacOS/GrammarGem" cp "AppSupport/Info.plist" "${DIST}/${APP}/Contents/Info.plist" cp "AppSupport/AppIcon.icns" "${DIST}/${APP}/Contents/Resources/AppIcon.icns" @@ -52,8 +52,8 @@ SPARKLE_FW="$(find .build -path '*Sparkle.xcframework/macos-arm64*/Sparkle.frame mkdir -p "${DIST}/${APP}/Contents/Frameworks" cp -R "${SPARKLE_FW}" "${DIST}/${APP}/Contents/Frameworks/" install_name_tool -add_rpath "@executable_path/../Frameworks" \ - "${DIST}/${APP}/Contents/MacOS/GrammaGem" 2>/dev/null || true + "${DIST}/${APP}/Contents/MacOS/GrammarGem" 2>/dev/null || true echo "==> Built ${DIST}/${APP}" -lipo -info "${DIST}/${APP}/Contents/MacOS/GrammaGem" +lipo -info "${DIST}/${APP}/Contents/MacOS/GrammarGem" echo " Run with: open \"${DIST}/${APP}\" (grant Accessibility on first launch)" diff --git a/scripts/make-icon.swift b/scripts/make-icon.swift index 81c0e3c..3226134 100644 --- a/scripts/make-icon.swift +++ b/scripts/make-icon.swift @@ -1,5 +1,5 @@ #!/usr/bin/env swift -// Generates AppIcon.iconset (PNGs) for GrammaGem — a gold pen-nib on the ink +// Generates AppIcon.iconset (PNGs) for GrammarGem — a gold pen-nib on the ink // brand square. Run from mac/: swift scripts/make-icon.swift // Then: iconutil -c icns AppIcon.iconset -o AppSupport/AppIcon.icns import AppKit diff --git a/scripts/release.sh b/scripts/release.sh index 5699081..6711020 100755 --- a/scripts/release.sh +++ b/scripts/release.sh @@ -1,11 +1,11 @@ #!/usr/bin/env bash -# Cut a GrammaGem release and publish the Sparkle appcast (hosted on grammagem.app). +# Cut a GrammarGem release and publish the Sparkle appcast (hosted on grammargem.com). # # ./scripts/release.sh e.g. ./scripts/release.sh 0.2.0 # # Steps: stamp version -> build -> sign inside-out (incl. Sparkle) -> notarize + # staple -> zip -> generate the EdDSA-signed appcast.xml. Then upload the .zip and -# appcast.xml to grammagem.app so every installed app shows "Update available". +# appcast.xml to grammargem.com so every installed app shows "Update available". # # Notarization needs ONE of: # NOTARY_PROFILE (xcrun notarytool store-credentials) @@ -17,10 +17,10 @@ ROOT="$(cd "$(dirname "$0")/.." && pwd)" cd "$ROOT" VERSION="${1:?usage: release.sh e.g. release.sh 0.2.0}" -APP="dist/GrammaGem.app" +APP="dist/GrammarGem.app" RELDIR="dist/releases" -ZIP="${RELDIR}/GrammaGem-${VERSION}.zip" -DL_PREFIX="${DL_PREFIX:-https://grammagem.app/releases/}" +ZIP="${RELDIR}/GrammarGem-${VERSION}.zip" +DL_PREFIX="${DL_PREFIX:-https://www.grammargem.com/releases/}" PB=/usr/libexec/PlistBuddy # 1. Stamp the marketing version + bump the monotonic build number. @@ -61,11 +61,11 @@ GA="$(find .build/artifacts -name generate_appcast -type f | head -1)" "$GA" --download-url-prefix "$DL_PREFIX" "$RELDIR" echo -echo "✓ Release ${VERSION} built. Upload these to grammagem.app:" +echo "✓ Release ${VERSION} built. Upload these to grammargem.com:" echo " ${ZIP}" -echo " -> ${DL_PREFIX}GrammaGem-${VERSION}.zip" +echo " -> ${DL_PREFIX}GrammarGem-${VERSION}.zip" echo " ${RELDIR}/appcast.xml" -echo " -> https://grammagem.app/appcast.xml (matches Info.plist SUFeedURL)" +echo " -> https://www.grammargem.com/appcast.xml (matches Info.plist SUFeedURL)" echo echo " Once uploaded, installed apps show an 'Update available' button within a day" echo " (or immediately via menu bar -> Check for Updates...)." diff --git a/scripts/sign-app.sh b/scripts/sign-app.sh index 869f88a..743b882 100755 --- a/scripts/sign-app.sh +++ b/scripts/sign-app.sh @@ -1,17 +1,17 @@ #!/usr/bin/env bash -# Code-sign GrammaGem.app with Developer ID + Hardened Runtime, signing the +# Code-sign GrammarGem.app with Developer ID + Hardened Runtime, signing the # embedded Sparkle.framework's nested helpers INSIDE-OUT first (required for a # valid, notarizable signature). # -# Usage: ./scripts/sign-app.sh [path/to/GrammaGem.app] +# Usage: ./scripts/sign-app.sh [path/to/GrammarGem.app] set -euo pipefail ROOT="$(cd "$(dirname "$0")/.." && pwd)" cd "$ROOT" DEV_ID="${DEV_ID:-Developer ID Application: Marc Schultheiss (D5KT5B9Z9M)}" -ENTITLEMENTS="AppSupport/GrammaGem.entitlements" -APP="${1:-dist/GrammaGem.app}" +ENTITLEMENTS="AppSupport/GrammarGem.entitlements" +APP="${1:-dist/GrammarGem.app}" sign() { codesign --force --timestamp --options runtime --sign "$DEV_ID" "$@"; } diff --git a/scripts/sign-notarize.sh b/scripts/sign-notarize.sh index a5d58cc..38787db 100755 --- a/scripts/sign-notarize.sh +++ b/scripts/sign-notarize.sh @@ -1,6 +1,6 @@ #!/usr/bin/env bash # Build (universal), codesign (Hardened Runtime + Developer ID), notarize, and -# staple GrammaGem.app. Requires the Apple Developer Program ($99/yr) — a FIXED +# staple GrammarGem.app. Requires the Apple Developer Program ($99/yr) — a FIXED # cost, not per-user. # # Credentials are read from the environment or a stored keychain profile — never @@ -15,9 +15,9 @@ ROOT="$(cd "$(dirname "$0")/.." && pwd)" cd "$ROOT" DEV_ID="${DEV_ID:-Developer ID Application: Marc Schultheiss (D5KT5B9Z9M)}" -APP="dist/GrammaGem.app" -ZIP="dist/GrammaGem.zip" -ENTITLEMENTS="AppSupport/GrammaGem.entitlements" +APP="dist/GrammarGem.app" +ZIP="dist/GrammarGem.zip" +ENTITLEMENTS="AppSupport/GrammarGem.entitlements" echo "==> Building universal bundle" ./scripts/build.sh >/dev/null From 201fe04d8a99f927026a95567462bfcf33069295 Mon Sep 17 00:00:00 2001 From: BigMarc Date: Sat, 20 Jun 2026 20:21:29 +0200 Subject: [PATCH 8/9] feat: backend-neutral AI seam, Ollama backend, extension bridge + trust/correctness fixes MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Wave 1 (correctness/trust): - Fix paid large-model dead path: engine reads the persisted selected repo via a thread-safe ModelManager.activeRepo(), so download/load/isReady now agree. - Lemon Squeezy store/product check fails closed in release builds — the placeholder-ID 'any key unlocks paid' bypass can no longer ship. - Replace force-unwrapped Hugging Face URLs with safe URLComponents construction. - Never read/replace/scan secure (password) fields via AX.isSecureTextField. Wave 2 (compounding seam): - Extract AIPromptKit (prompts/temperature/maxTokens/cleanup) out of MLXEngine so every backend produces identical prompts and output. - AIEngine gains protectedTerms (personal dictionary now actually injected into the LLM), warmup(), and runStreaming(); add makeAIEngine() factory. - Honor WritingMode.lengthCap for maxTokens; warm the model on launch/after download. - Guard custom modes against empty prompts and duplicate names. Wave 3: OllamaEngine — a URLSession-only AIEngine backend (cross-platform, opt-in via GRAMMARGEM_AI_BACKEND=ollama). Wave 4: LocalEngineServer — loopback-only, token-authed HTTP bridge (Network.framework, no new deps), off by default, exposing Harper + the LLM + the entitlement gate to a browser extension. Tests: 6 new unit tests for the AIPrompts seam and custom-mode guard (19 pass). Co-Authored-By: Claude Opus 4.8 (1M context) --- Sources/GrammarGem/AI/AIEngine.swift | 45 ++- Sources/GrammarGem/AI/AIPromptKit.swift | 111 ++++++++ Sources/GrammarGem/AI/CustomModesStore.swift | 14 +- Sources/GrammarGem/AI/MLXEngine.swift | 117 +++----- Sources/GrammarGem/AI/ModelManager.swift | 39 ++- Sources/GrammarGem/AI/OllamaEngine.swift | 176 ++++++++++++ Sources/GrammarGem/App/AppState.swift | 92 +++++- Sources/GrammarGem/App/GrammarGemApp.swift | 2 +- Sources/GrammarGem/Core/AppConfig.swift | 17 ++ .../Licensing/LemonSqueezyClient.swift | 16 +- Sources/GrammarGem/System/AXSupport.swift | 11 + .../GrammarGem/System/LocalEngineServer.swift | 266 ++++++++++++++++++ Sources/GrammarGem/System/TextCapture.swift | 17 +- .../GrammarGem/System/TextFieldScanner.swift | 4 +- .../System/TextReplacementCoordinator.swift | 11 +- Tests/GrammarGemTests/GrammarGemTests.swift | 60 ++++ 16 files changed, 900 insertions(+), 98 deletions(-) create mode 100644 Sources/GrammarGem/AI/AIPromptKit.swift create mode 100644 Sources/GrammarGem/AI/OllamaEngine.swift create mode 100644 Sources/GrammarGem/System/LocalEngineServer.swift diff --git a/Sources/GrammarGem/AI/AIEngine.swift b/Sources/GrammarGem/AI/AIEngine.swift index cb03c01..1911059 100644 --- a/Sources/GrammarGem/AI/AIEngine.swift +++ b/Sources/GrammarGem/AI/AIEngine.swift @@ -10,11 +10,52 @@ protocol AIEngine: AnyObject { var isReady: Bool { get } /// Run an action against `text` and return the rewritten result. - /// Throws on model-not-ready or generation failure. Never performs network I/O. - func run(_ action: AIAction, on text: String) async throws -> String + /// `protectedTerms` are vocabulary the model must reproduce verbatim (the + /// personal dictionary / style-guide terms). Throws on model-not-ready or + /// generation failure. Never performs network I/O on the on-device backend. + func run(_ action: AIAction, on text: String, protectedTerms: [String]) async throws -> String /// Best-effort local tone classification (used by tone-detection UI). func detectTone(_ text: String) async -> Tone + + /// Optionally preload the model so the first real action is instant. + func warmup() async + + /// Streaming variant: yields incremental output as it generates. The default + /// implementation wraps `run` as a single chunk, so a backend that doesn't + /// natively stream still conforms. + func runStreaming(_ action: AIAction, on text: String, protectedTerms: [String]) + -> AsyncThrowingStream +} + +extension AIEngine { + /// Convenience: run with no protected terms. + func run(_ action: AIAction, on text: String) async throws -> String { + try await run(action, on: text, protectedTerms: []) + } + + /// Default: no preload. + func warmup() async {} + + /// Default streaming: produce the full result, then emit it as one chunk. + func runStreaming(_ action: AIAction, on text: String, protectedTerms: [String]) + -> AsyncThrowingStream { + AsyncThrowingStream { continuation in + Task { + do { + continuation.yield(try await run(action, on: text, protectedTerms: protectedTerms)) + continuation.finish() + } catch { + continuation.finish(throwing: error) + } + } + } + } + + /// Convenience streaming overload with no protected terms. + func runStreaming(_ action: AIAction, on text: String) -> AsyncThrowingStream { + runStreaming(action, on: text, protectedTerms: []) + } } enum AIEngineError: LocalizedError { diff --git a/Sources/GrammarGem/AI/AIPromptKit.swift b/Sources/GrammarGem/AI/AIPromptKit.swift new file mode 100644 index 0000000..0194c08 --- /dev/null +++ b/Sources/GrammarGem/AI/AIPromptKit.swift @@ -0,0 +1,111 @@ +import Foundation + +/// Backend-neutral prompt construction, generation parameters, and output +/// cleanup for Layer-2 actions. Extracted from `MLXEngine` so EVERY `AIEngine` +/// backend (MLX today, Ollama/llama.cpp next, the localhost extension server) is +/// guaranteed to produce identical prompts and identical output trimming — no +/// behavioral drift between runtimes — and so the personal dictionary / a future +/// style guide can inject protected vocabulary in exactly ONE place. +/// +/// Everything here is a pure function of its inputs (no MLX, no I/O), which also +/// makes per-action behavior unit-testable without a model present. +enum AIPrompts { + + /// The system prompt for an action. `protectedTerms` (personal-dictionary + /// entries + future style-guide vocabulary) are terms the model must never + /// alter, so AI rewrites stop "correcting" brand names and jargon. + static func systemPrompt(for action: AIAction, protectedTerms: [String] = []) -> String { + base(for: action) + protectedTermsClause(protectedTerms) + } + + private static func base(for action: AIAction) -> String { + switch action { + case .rewriteClarity: + return "Rewrite the user's text to be clearer and more concise. Preserve the " + + "original meaning and the author's voice. Output only the rewritten text." + case .rewrite: + return "Paraphrase the user's text. Keep the meaning but vary the wording and " + + "structure. Output only the rewritten text." + case .adjustTone(let tone): + return "Rewrite the user's text in a \(tone.rawValue) tone. Preserve the meaning. " + + "Output only the rewritten text." + case .ask(let instruction): + return "Apply this instruction to the user's text: \(instruction). " + + "Output only the resulting text." + case .translate(let language): + return "Translate the user's text into \(language). Output only the translation." + case .applyMode(let mode): + return mode.systemPrompt + } + } + + /// Appended to every system prompt: terms the model must reproduce verbatim + /// (brand names, jargon the user added to their personal dictionary). Capped + /// so a large dictionary can't blow the context window. + private static func protectedTermsClause(_ terms: [String]) -> String { + let cleaned = terms + .map { $0.trimmingCharacters(in: .whitespacesAndNewlines) } + .filter { !$0.isEmpty } + guard !cleaned.isEmpty else { return "" } + let list = cleaned.prefix(50).map { "\"\($0)\"" }.joined(separator: ", ") + return " Never change, translate, or \"correct\" these exact terms — reproduce them " + + "verbatim, including capitalization: \(list)." + } + + /// Low temperature for faithful rewrites; a touch higher for free paraphrase. + static func temperature(for action: AIAction) -> Float { + switch action { + case .rewrite: return 0.5 + case .ask: return 0.4 + default: return 0.2 + } + } + + /// Generation token budget. Honors a Mode's `lengthCap` (in characters) for + /// short-form modes (Post = 280, Team Chat = 60) so we don't spend the full + /// 512-token default on a one-line message; falls back to the default otherwise. + static func maxTokens(for action: AIAction) -> Int { + let fallback = 512 + guard case .applyMode(let mode) = action, let cap = mode.lengthCap else { return fallback } + // ~1 token per 3 characters of English, plus headroom; clamp to a floor. + return min(fallback, max(64, cap / 3 + 48)) + } + + /// Strip a leading "Sure, here's …:" preamble and surrounding quotes that small + /// instruct models sometimes add, so the result drops cleanly into the field. + static func clean(_ s: String) -> String { + var out = s.trimmingCharacters(in: .whitespacesAndNewlines) + let lower = out.lowercased() + for prefix in ["sure, here", "sure! here", "here is", "here's", "certainly"] { + if lower.hasPrefix(prefix), let colon = out.firstIndex(of: ":") { + let after = out[out.index(after: colon)...] + .trimmingCharacters(in: .whitespacesAndNewlines) + if !after.isEmpty { out = after } + break + } + } + if out.count >= 2, out.first == "\"", out.last == "\"" { + out = String(out.dropFirst().dropLast()) + } + return out.trimmingCharacters(in: .whitespacesAndNewlines) + } + + /// The tone-classifier system prompt (kept here so any backend reuses it). + static func toneClassifierPrompt() -> String { + let options = Tone.allCases.map(\.rawValue).joined(separator: ", ") + return """ + You are a tone classifier. Read the user's text and respond with exactly ONE \ + word — the single best-matching tone from this list: \(options). \ + Output only that word, lowercase, no punctuation or explanation. + """ + } + + /// Parse the one-word tone classification output into a `Tone`. + static func parseTone(_ raw: String) -> Tone { + let token = raw.lowercased().trimmingCharacters(in: CharacterSet.alphanumerics.inverted) + if let exact = Tone(rawValue: token) { return exact } + let lower = raw.lowercased() + for tone in Tone.allCases where lower.contains(tone.rawValue) { return tone } + return .professional + } +} diff --git a/Sources/GrammarGem/AI/CustomModesStore.swift b/Sources/GrammarGem/AI/CustomModesStore.swift index 76629fc..29dd876 100644 --- a/Sources/GrammarGem/AI/CustomModesStore.swift +++ b/Sources/GrammarGem/AI/CustomModesStore.swift @@ -25,19 +25,27 @@ final class CustomModesStore: ObservableObject { /// Built-in + custom modes (custom ones are always paid). func allModes() -> [WritingMode] { ModeRegistry.all + customModes } - func addCustom(name: String, prompt: String) { + /// Returns false (no-op) if the name or prompt is empty, or the name + /// collides with an existing built-in/custom mode — so an empty-prompt mode + /// can't slip through to the LLM as an empty system prompt. + @discardableResult + func addCustom(name: String, prompt: String) -> Bool { let trimmed = name.trimmingCharacters(in: .whitespacesAndNewlines) - guard !trimmed.isEmpty else { return } + let trimmedPrompt = prompt.trimmingCharacters(in: .whitespacesAndNewlines) + guard !trimmed.isEmpty, !trimmedPrompt.isEmpty else { return false } + guard !allModes().contains(where: { $0.name.caseInsensitiveCompare(trimmed) == .orderedSame }) + else { return false } let mode = WritingMode( id: "custom-\(UUID().uuidString.prefix(8))", name: trimmed, - systemPrompt: prompt.trimmingCharacters(in: .whitespacesAndNewlines), + systemPrompt: trimmedPrompt, isPaid: true, lengthCap: nil, autoFormat: "Custom" ) customModes.append(mode) persistModes() + return true } func removeCustom(id: String) { diff --git a/Sources/GrammarGem/AI/MLXEngine.swift b/Sources/GrammarGem/AI/MLXEngine.swift index e2e2c96..d46c12f 100644 --- a/Sources/GrammarGem/AI/MLXEngine.swift +++ b/Sources/GrammarGem/AI/MLXEngine.swift @@ -33,33 +33,63 @@ final class MLXEngine: AIEngine { // MARK: - AIEngine - func run(_ action: AIAction, on text: String) async throws -> String { + func run(_ action: AIAction, on text: String, protectedTerms: [String]) async throws -> String { let trimmed = text.trimmingCharacters(in: .whitespacesAndNewlines) guard !trimmed.isEmpty else { return text } let container = try await container() - let params = GenerateParameters(temperature: temperature(for: action)) + let params = GenerateParameters(temperature: AIPrompts.temperature(for: action)) let raw = try await complete( - system: systemPrompt(for: action), user: trimmed, - maxTokens: 512, parameters: params, container: container) - return clean(raw) + system: AIPrompts.systemPrompt(for: action, protectedTerms: protectedTerms), + user: trimmed, + maxTokens: AIPrompts.maxTokens(for: action), + parameters: params, container: container) + return AIPrompts.clean(raw) + } + + /// Preload the model container so the first real action doesn't pay the + /// multi-second load. Safe to call repeatedly (the loader caches). + func warmup() async { + _ = try? await container() + } + + func runStreaming(_ action: AIAction, on text: String, protectedTerms: [String]) + -> AsyncThrowingStream { + AsyncThrowingStream { continuation in + Task { + let trimmed = text.trimmingCharacters(in: .whitespacesAndNewlines) + guard !trimmed.isEmpty else { continuation.yield(text); continuation.finish(); return } + do { + let container = try await container() + var params = GenerateParameters(temperature: AIPrompts.temperature(for: action)) + params.maxTokens = AIPrompts.maxTokens(for: action) + let system = AIPrompts.systemPrompt(for: action, protectedTerms: protectedTerms) + try await container.perform { context in + let input = try await context.processor.prepare( + input: UserInput(chat: [.system(system), .user(trimmed)])) + let stream = try MLXLMCommon.generate( + input: input, parameters: params, context: context) + for await item in stream { + if let chunk = item.chunk { continuation.yield(chunk) } + } + } + continuation.finish() + } catch { + continuation.finish(throwing: error) + } + } + } } func detectTone(_ text: String) async -> Tone { let trimmed = text.trimmingCharacters(in: .whitespacesAndNewlines) guard !trimmed.isEmpty else { return .professional } - let options = Tone.allCases.map(\.rawValue).joined(separator: ", ") - let system = """ - You are a tone classifier. Read the user's text and respond with exactly ONE \ - word — the single best-matching tone from this list: \(options). \ - Output only that word, lowercase, no punctuation or explanation. - """ do { let container = try await container() let raw = try await complete( - system: system, user: trimmed, maxTokens: 8, + system: AIPrompts.toneClassifierPrompt(), user: trimmed, maxTokens: 8, parameters: GenerateParameters(temperature: 0.0), container: container) - return parseTone(raw) + return AIPrompts.parseTone(raw) } catch { return .professional } @@ -98,64 +128,9 @@ final class MLXEngine: AIEngine { } } - // MARK: - Prompting - - private func systemPrompt(for action: AIAction) -> String { - switch action { - case .rewriteClarity: - return "Rewrite the user's text to be clearer and more concise. Preserve the " - + "original meaning and the author's voice. Output only the rewritten text." - case .rewrite: - return "Paraphrase the user's text. Keep the meaning but vary the wording and " - + "structure. Output only the rewritten text." - case .adjustTone(let tone): - return "Rewrite the user's text in a \(tone.rawValue) tone. Preserve the meaning. " - + "Output only the rewritten text." - case .ask(let instruction): - return "Apply this instruction to the user's text: \(instruction). " - + "Output only the resulting text." - case .translate(let language): - return "Translate the user's text into \(language). Output only the translation." - case .applyMode(let mode): - return mode.systemPrompt - } - } - - /// Low temperature for faithful rewrites; a touch higher for free paraphrase. - private func temperature(for action: AIAction) -> Float { - switch action { - case .rewrite: return 0.5 - case .ask: return 0.4 - default: return 0.2 - } - } - - // MARK: - Output cleanup - - private func clean(_ s: String) -> String { - var out = s.trimmingCharacters(in: .whitespacesAndNewlines) - let lower = out.lowercased() - for prefix in ["sure, here", "sure! here", "here is", "here's", "certainly"] { - if lower.hasPrefix(prefix), let colon = out.firstIndex(of: ":") { - let after = out[out.index(after: colon)...] - .trimmingCharacters(in: .whitespacesAndNewlines) - if !after.isEmpty { out = after } - break - } - } - if out.count >= 2, out.first == "\"", out.last == "\"" { - out = String(out.dropFirst().dropLast()) - } - return out.trimmingCharacters(in: .whitespacesAndNewlines) - } - - private func parseTone(_ raw: String) -> Tone { - let token = raw.lowercased().trimmingCharacters(in: CharacterSet.alphanumerics.inverted) - if let exact = Tone(rawValue: token) { return exact } - let lower = raw.lowercased() - for tone in Tone.allCases where lower.contains(tone.rawValue) { return tone } - return .professional - } + // Prompt construction, temperature, token budget, and output cleanup now live + // in `AIPrompts` (backend-neutral; see AIPromptKit.swift) so every AIEngine + // backend produces identical prompts and identical output trimming. } /// Caches one loaded `ModelContainer` (keyed by directory) and coalesces diff --git a/Sources/GrammarGem/AI/ModelManager.swift b/Sources/GrammarGem/AI/ModelManager.swift index c30d67c..97f814e 100644 --- a/Sources/GrammarGem/AI/ModelManager.swift +++ b/Sources/GrammarGem/AI/ModelManager.swift @@ -14,7 +14,9 @@ final class ModelManager: ObservableObject { @Published private(set) var state: State = .notDownloaded @Published private(set) var statusText: String = "" - @Published var selectedRepo: String = AppConfig.Model.defaultRepo + @Published var selectedRepo: String = ModelManager.activeRepo() { + didSet { UserDefaults.standard.set(selectedRepo, forKey: Self.selectedRepoKey) } + } private var task: Task? private var generation = 0 @@ -55,6 +57,33 @@ final class ModelManager: ObservableObject { isModelPresent(repo: repo) ? modelDir(repo) : nil } + /// UserDefaults key backing the user's chosen model repo. + nonisolated static let selectedRepoKey = "GrammarGem.selectedModelRepo" + + /// The user's currently-selected repo, readable from ANY thread (it lives in + /// UserDefaults, which is thread-safe). The AI engine's model-directory + /// provider reads this so download, load, and `isReady` all agree on the SAME + /// repo — including the paid large model, which the old hardcoded-default + /// provider silently ignored. Falls back to the default repo when unset. + nonisolated static func activeRepo() -> String { + UserDefaults.standard.string(forKey: selectedRepoKey) ?? AppConfig.Model.defaultRepo + } + + /// Safe URL construction for the two Hugging Face endpoints. A malformed + /// repo/path yields nil → a thrown `ModelError`, never a force-unwrap crash. + nonisolated static func fileURL(repo: String, path: String) -> URL? { + var c = URLComponents(string: AppConfig.Model.huggingFaceBase) + c?.path = "/\(repo)/resolve/main/\(path)" + return c?.url + } + + nonisolated static func treeURL(repo: String) -> URL? { + var c = URLComponents(string: AppConfig.Model.huggingFaceBase) + c?.path = "/api/models/\(repo)/tree/main" + c?.queryItems = [URLQueryItem(name: "recursive", value: "1")] + return c?.url + } + /// Kick off (or resume to) a real download. Safe to call from the UI. func startDownload(repo: String? = nil) { let target = repo ?? selectedRepo @@ -92,7 +121,9 @@ final class ModelManager: ObservableObject { try Task.checkCancellation() set(gen, .downloading(progress: min(1, Double(done) / Double(total))), "Downloading \(file.path) (\(byteString(file.size)))…") - let url = URL(string: "\(AppConfig.Model.huggingFaceBase)/\(repo)/resolve/main/\(file.path)")! + guard let url = Self.fileURL(repo: repo, path: file.path) else { + throw ModelError.invalidURL(file.path) + } let (tmp, response) = try await URLSession.shared.download(from: url) if let http = response as? HTTPURLResponse, http.statusCode != 200 { throw ModelError.http(http.statusCode, file.path) @@ -148,7 +179,7 @@ final class ModelManager: ObservableObject { /// List the repo's files (+ sizes) from the Hugging Face tree API. private func fetchFileList(repo: String) async throws -> [(path: String, size: Int64)] { - let url = URL(string: "\(AppConfig.Model.huggingFaceBase)/api/models/\(repo)/tree/main?recursive=1")! + guard let url = Self.treeURL(repo: repo) else { throw ModelError.invalidURL("file list") } let (data, response) = try await URLSession.shared.data(from: url) if let http = response as? HTTPURLResponse, http.statusCode != 200 { throw ModelError.http(http.statusCode, "file list") @@ -166,11 +197,13 @@ final class ModelManager: ObservableObject { case empty case http(Int, String) case corrupt(String) + case invalidURL(String) var errorDescription: String? { switch self { case .empty: return "No model files were found for this repository." case .http(let code, let what): return "Download failed (\(code)) while fetching \(what)." case .corrupt(let what): return "Downloaded file looked wrong (\(what)); please retry." + case .invalidURL(let what): return "Couldn't build a valid download URL for \(what)." } } } diff --git a/Sources/GrammarGem/AI/OllamaEngine.swift b/Sources/GrammarGem/AI/OllamaEngine.swift new file mode 100644 index 0000000..842d870 --- /dev/null +++ b/Sources/GrammarGem/AI/OllamaEngine.swift @@ -0,0 +1,176 @@ +import Foundation + +/// A cross-platform Layer-2 backend that talks to a locally-running **Ollama** +/// server over HTTP. Conforms to the same `AIEngine` seam as `MLXEngine`, reuses +/// the backend-neutral `AIPrompts` (so prompts/output are identical across +/// runtimes), and depends only on `URLSession` — no MLX, no Metal — so it compiles +/// and runs anywhere, including Windows/Linux. This is what converts the AIEngine +/// abstraction from nominal to real and opens the non-Apple-Silicon market. +/// +/// Privacy is preserved: Ollama runs the model on the user's own machine on +/// loopback (127.0.0.1); no text leaves the device. +final class OllamaEngine: AIEngine { + private let base: URL + private let model: String + private let session: URLSession + + /// `isReady` is read synchronously by the coordinator but readiness for an HTTP + /// backend is an async probe, so we cache the last-known result behind a lock. + private let lock = NSLock() + private var cachedReady = false + + init(base: URL = AppConfig.Ollama.baseURL, + model: String = AppConfig.Ollama.defaultModel, + session: URLSession = .shared) { + self.base = base + self.model = model + self.session = session + } + + var isReady: Bool { + lock.lock(); defer { lock.unlock() } + return cachedReady + } + + private func setReady(_ value: Bool) { + lock.lock(); cachedReady = value; lock.unlock() + } + + // MARK: - AIEngine + + /// Probe the server and confirm the configured model is pulled. Readiness for + /// Ollama means "server up + model present" (vs. MLX's "weights on disk"). + func warmup() async { + setReady(await probeModelPresent()) + } + + func run(_ action: AIAction, on text: String, protectedTerms: [String]) async throws -> String { + let trimmed = text.trimmingCharacters(in: .whitespacesAndNewlines) + guard !trimmed.isEmpty else { return text } + let raw = try await chat( + system: AIPrompts.systemPrompt(for: action, protectedTerms: protectedTerms), + user: trimmed, + temperature: AIPrompts.temperature(for: action), + maxTokens: AIPrompts.maxTokens(for: action)) + setReady(true) + return AIPrompts.clean(raw) + } + + func detectTone(_ text: String) async -> Tone { + let trimmed = text.trimmingCharacters(in: .whitespacesAndNewlines) + guard !trimmed.isEmpty else { return .professional } + do { + let raw = try await chat( + system: AIPrompts.toneClassifierPrompt(), user: trimmed, + temperature: 0.0, maxTokens: 8) + return AIPrompts.parseTone(raw) + } catch { + return .professional + } + } + + func runStreaming(_ action: AIAction, on text: String, protectedTerms: [String]) + -> AsyncThrowingStream { + AsyncThrowingStream { continuation in + Task { + let trimmed = text.trimmingCharacters(in: .whitespacesAndNewlines) + guard !trimmed.isEmpty else { continuation.yield(text); continuation.finish(); return } + do { + try await streamChat( + system: AIPrompts.systemPrompt(for: action, protectedTerms: protectedTerms), + user: trimmed, + temperature: AIPrompts.temperature(for: action), + maxTokens: AIPrompts.maxTokens(for: action), + onChunk: { continuation.yield($0) }) + setReady(true) + continuation.finish() + } catch { + continuation.finish(throwing: error) + } + } + } + } + + // MARK: - HTTP + + private func probeModelPresent() async -> Bool { + do { + let (data, response) = try await session.data(from: base.appendingPathComponent("api/tags")) + guard (response as? HTTPURLResponse)?.statusCode == 200 else { return false } + let names = (try JSONDecoder().decode(TagsResponse.self, from: data)).models.map(\.name) + // Match exact or family (e.g. configured "qwen2.5:3b" vs a pulled "qwen2.5:3b-instruct"). + return names.contains(model) + || names.contains { $0.hasPrefix(model) || model.hasPrefix($0) } + } catch { + return false + } + } + + private func chat(system: String, user: String, + temperature: Float, maxTokens: Int) async throws -> String { + let request = try makeRequest(path: "api/chat", body: ChatRequest( + model: model, + messages: [.init(role: "system", content: system), .init(role: "user", content: user)], + stream: false, + options: .init(temperature: temperature, num_predict: maxTokens))) + let (data, response) = try await session.data(for: request) + guard let http = response as? HTTPURLResponse else { + throw AIEngineError.generationFailed("No HTTP response from Ollama at \(base.absoluteString)") + } + guard http.statusCode == 200 else { + throw AIEngineError.generationFailed("Ollama returned HTTP \(http.statusCode)") + } + return (try JSONDecoder().decode(ChatResponse.self, from: data)).message?.content ?? "" + } + + private func streamChat(system: String, user: String, + temperature: Float, maxTokens: Int, + onChunk: (String) -> Void) async throws { + let request = try makeRequest(path: "api/chat", body: ChatRequest( + model: model, + messages: [.init(role: "system", content: system), .init(role: "user", content: user)], + stream: true, + options: .init(temperature: temperature, num_predict: maxTokens))) + let (bytes, response) = try await session.bytes(for: request) + guard (response as? HTTPURLResponse)?.statusCode == 200 else { + throw AIEngineError.generationFailed("Ollama streaming request failed") + } + // Ollama streams newline-delimited JSON frames, one per token-ish chunk. + for try await line in bytes.lines { + guard let data = line.data(using: .utf8), + let frame = try? JSONDecoder().decode(ChatResponse.self, from: data), + let chunk = frame.message?.content, !chunk.isEmpty + else { continue } + onChunk(chunk) + } + } + + private func makeRequest(path: String, body: T) throws -> URLRequest { + var request = URLRequest(url: base.appendingPathComponent(path)) + request.httpMethod = "POST" + request.setValue("application/json", forHTTPHeaderField: "Content-Type") + request.httpBody = try JSONEncoder().encode(body) + return request + } + + // MARK: - Wire types + + private struct ChatRequest: Encodable { + let model: String + let messages: [Message] + let stream: Bool + let options: Options + struct Message: Encodable { let role: String; let content: String } + struct Options: Encodable { let temperature: Float; let num_predict: Int } + } + + private struct ChatResponse: Decodable { + let message: Message? + struct Message: Decodable { let content: String } + } + + private struct TagsResponse: Decodable { + let models: [Model] + struct Model: Decodable { let name: String } + } +} diff --git a/Sources/GrammarGem/App/AppState.swift b/Sources/GrammarGem/App/AppState.swift index 6d8b2d5..d69dc53 100644 --- a/Sources/GrammarGem/App/AppState.swift +++ b/Sources/GrammarGem/App/AppState.swift @@ -30,6 +30,8 @@ final class AppState: ObservableObject { let updater: UpdaterManager private let capture: TextCapture let coordinator: TextReplacementCoordinator + /// Loopback bridge to the browser extension (opt-in; nil unless enabled). + private var localServer: LocalEngineServer? // UI state @Published var lastStatus: String = "Ready" @@ -48,9 +50,9 @@ final class AppState: ObservableObject { grammar = engine // The on-device LLM loads weights from ModelManager's local snapshot (if a // complete download is present) — never the network. Resolved lazily on use. - ai = MLXEngine(modelDirectoryProvider: { - ModelManager.completedModelDirectory(repo: AppConfig.Model.defaultRepo) - }) + // Reads the user's *selected* repo (default or paid large model) so the + // model that gets loaded matches the one that gets downloaded. + ai = AppState.makeAIEngine() permissions = Permissions() model = ModelManager() license = LicenseManager() @@ -67,8 +69,29 @@ final class AppState: ObservableObject { exclusions = excl liveMonitor = LiveMonitor(grammar: engine, detector: detector, exclusions: excl, capture: capture) updater = UpdaterManager() + let dict = dictionary coordinator = TextReplacementCoordinator( - capture: capture, grammar: engine, ai: ai, gate: gate, detector: detector) + capture: capture, grammar: engine, ai: ai, gate: gate, detector: detector, + protectedTerms: { dict.entries }) + } + + // MARK: - Backend factory + + /// The single place the Layer-2 backend is chosen. Defaults to the MLX + /// on-device engine (Apple Silicon); a user/CI override selects the + /// cross-platform `OllamaEngine`. Adding a backend is a one-line branch here + /// instead of edits scattered across construction sites. The MLX provider + /// reads the user's *selected* repo so the loaded model matches the downloaded + /// one (incl. the paid large model). + static func makeAIEngine() -> AIEngine { + let override = ProcessInfo.processInfo.environment["GRAMMARGEM_AI_BACKEND"] + ?? UserDefaults.standard.string(forKey: "GrammarGem.aiBackend") + if override == "ollama" { + return OllamaEngine() + } + return MLXEngine(modelDirectoryProvider: { + ModelManager.completedModelDirectory(repo: ModelManager.activeRepo()) + }) } /// Called once at launch (from the AppDelegate). @@ -101,10 +124,19 @@ final class AppState: ObservableObject { // Auto-install the on-device AI model in the background on first use, so // the AI features are ready without the user hunting for a button. The - // download is resumable/cancelable from the AI Model screen. - if !model.isModelPresent(repo: model.selectedRepo) { + // download is resumable/cancelable from the AI Model screen. If a model is + // already present, warm it up now so the first AI action is instant. + if model.isModelPresent(repo: model.selectedRepo) { + Task { [weak self] in await self?.ai.warmup() } + } else { model.startDownload() } + // Warm the model up as soon as a (first-run) download completes. + model.$state.dropFirst() + .sink { [weak self] state in + if case .ready = state { Task { [weak self] in await self?.ai.warmup() } } + } + .store(in: &cancellables) permissions.refresh() appAwareEnabled = gate.appAwareEnabled @@ -115,9 +147,57 @@ final class AppState: ObservableObject { } Task { await license.validateIfNeeded() } + startLocalServerIfEnabled() Log.app.info("GrammarGem started. Licensed: \(self.license.isLicensed, privacy: .public)") } + // MARK: - Browser-extension bridge (opt-in) + + /// Start the loopback engine server only when the user has opted in, so the app + /// ships no listening socket by default. The server reuses the SAME engines, + /// prompts, and entitlement gate as the menu-bar app. + private func startLocalServerIfEnabled() { + let enabled = ProcessInfo.processInfo.environment["GRAMMARGEM_LOCAL_SERVER"] == "1" + || UserDefaults.standard.bool(forKey: AppConfig.LocalServer.enableKey) + guard enabled, localServer == nil else { return } + + let server = LocalEngineServer( + port: AppConfig.LocalServer.port, + token: LocalEngineServer.loadOrCreateToken(), + grammarHandler: { [weak self] text in + await MainActor.run { + guard let self else { return (text, []) } + let corrected = self.grammar.correct(text) + let suggestions = self.grammar.check(text).map { + LocalEngineServer.WireSuggestion( + location: $0.location, length: $0.length, + original: $0.original, replacement: $0.replacement, + kind: $0.kind.rawValue, message: $0.message) + } + return (corrected, suggestions) + } + }, + aiHandler: { [weak self] (req: LocalEngineServer.AIRequest) async -> LocalEngineServer.AIOutcome in + guard let self else { return .error("GrammarGem is shutting down.") } + return await self.handleServerAI(req) + }) + server.start() + localServer = server + } + + /// Run an AI action requested by the extension — same gate + model as the app. + private func handleServerAI(_ req: LocalEngineServer.AIRequest) async -> LocalEngineServer.AIOutcome { + if case .denied(let reason) = gate.authorizeAI(req.action) { return .error(reason) } + guard ai.isReady else { return .error(AIEngineError.modelNotReady.localizedDescription) } + do { + let out = try await ai.run(req.action, on: req.text, protectedTerms: dictionary.entries) + gate.recordAIActionUsed() + return .ok(out) + } catch { + return .error(error.localizedDescription) + } + } + // MARK: - Hotkey handling /// (Re)register the global hotkeys from the current preferences. diff --git a/Sources/GrammarGem/App/GrammarGemApp.swift b/Sources/GrammarGem/App/GrammarGemApp.swift index 5a2bcf4..e3726ee 100644 --- a/Sources/GrammarGem/App/GrammarGemApp.swift +++ b/Sources/GrammarGem/App/GrammarGemApp.swift @@ -25,7 +25,7 @@ enum MLXSelfTest { static func run() { let sample = "me and him was going to the store for to buy some milks" let engine = MLXEngine(modelDirectoryProvider: { - ModelManager.completedModelDirectory(repo: AppConfig.Model.defaultRepo) + ModelManager.completedModelDirectory(repo: ModelManager.activeRepo()) }) guard engine.isReady else { FileHandle.standardError.write(Data("SELFTEST_FAIL: model not present\n".utf8)) diff --git a/Sources/GrammarGem/Core/AppConfig.swift b/Sources/GrammarGem/Core/AppConfig.swift index 7df8bab..9f0f998 100644 --- a/Sources/GrammarGem/Core/AppConfig.swift +++ b/Sources/GrammarGem/Core/AppConfig.swift @@ -37,6 +37,23 @@ enum AppConfig { static let huggingFaceBase = "https://huggingface.co" } + /// The cross-platform Layer-2 backend: a locally-running Ollama server. Used + /// when MLX isn't available (Windows/Linux) or when the user opts in. Inference + /// stays on-device — Ollama runs the model on the user's own machine. + enum Ollama { + static let baseURL = URL(string: "http://127.0.0.1:11434")! + static let defaultModel = "qwen2.5:3b" // matches the MLX default model family + } + + /// Loopback engine server for the browser extension (off by default; see + /// `LocalEngineServer`). Exposes Harper + the local LLM to the extension over + /// 127.0.0.1 with a per-install token — no cloud round-trip. + enum LocalServer { + static let port: UInt16 = 47800 + static let tokenKey = "GrammarGem.localServerToken" + static let enableKey = "GrammarGem.enableLocalServer" + } + /// Free-tier limits + license validation cadence (see spec §5/§6). enum Limits { static let freeDailyAIActions = 10 diff --git a/Sources/GrammarGem/Licensing/LemonSqueezyClient.swift b/Sources/GrammarGem/Licensing/LemonSqueezyClient.swift index 15f2f69..58e5399 100644 --- a/Sources/GrammarGem/Licensing/LemonSqueezyClient.swift +++ b/Sources/GrammarGem/Licensing/LemonSqueezyClient.swift @@ -58,16 +58,24 @@ final class LemonSqueezyClient { private func verifyAndResolveTier(meta: LSMeta?, licenseKey: LSLicenseKey?) throws -> Tier { guard let meta else { throw LicenseError.wrongProduct } - // Store + product check. If AppConfig still holds placeholder (non-numeric) - // IDs, we log and skip the check so the stub flow runs — TODO(real-integration): - // once real numeric IDs are set, this becomes a hard gate. + // Store + product check. With real numeric IDs configured this is a hard + // gate that prevents a key from another Lemon Squeezy product unlocking + // GrammarGem. If AppConfig still holds placeholder (non-numeric) IDs the + // gate can't run — allow the bypass ONLY in DEBUG so local stub flows work; + // in a release build FAIL CLOSED so the "any key unlocks paid" bypass can + // never ship. TODO(real-integration): set real IDs in AppConfig.LemonSqueezy. if let expectedStore = Int(AppConfig.LemonSqueezy.expectedStoreID), let expectedProduct = Int(AppConfig.LemonSqueezy.expectedProductID) { guard meta.store_id == expectedStore, meta.product_id == expectedProduct else { throw LicenseError.wrongProduct } } else { - Log.licensing.warning("Skipping store/product hard-verify — placeholder IDs in AppConfig.") + #if DEBUG + Log.licensing.warning("Skipping store/product hard-verify — placeholder IDs in AppConfig (DEBUG only).") + #else + Log.licensing.error("Refusing to verify license: placeholder Lemon Squeezy IDs in a release build.") + throw LicenseError.wrongProduct + #endif } // Resolve tier from the variant id (reverse-lookup the configured map). diff --git a/Sources/GrammarGem/System/AXSupport.swift b/Sources/GrammarGem/System/AXSupport.swift index 48f155c..7858204 100644 --- a/Sources/GrammarGem/System/AXSupport.swift +++ b/Sources/GrammarGem/System/AXSupport.swift @@ -38,6 +38,17 @@ enum AX { AXUIElementSetMessagingTimeout(element, seconds) } + /// Whether an element is a secure text field (a password input). GrammarGem + /// must NEVER read or rewrite these — so a user who forgot to exclude a + /// password manager or login form can't have a decrypted password captured, + /// sent through the grammar/AI engines, and written back. This is enforced in + /// code rather than relying on the user's exclusion blocklist. + static func isSecureTextField(_ element: AXUIElement) -> Bool { + // AXSecureTextField is the subrole AppKit/most Electron inputs report for + // password fields. String-compared (the constant isn't always imported). + copyString(element, kAXSubroleAttribute) == "AXSecureTextField" + } + /// The currently-focused UI element across the system — robust to the /// system-wide element failing. /// diff --git a/Sources/GrammarGem/System/LocalEngineServer.swift b/Sources/GrammarGem/System/LocalEngineServer.swift new file mode 100644 index 0000000..f6da35a --- /dev/null +++ b/Sources/GrammarGem/System/LocalEngineServer.swift @@ -0,0 +1,266 @@ +import Foundation +import Network + +/// A minimal, loopback-only HTTP server that exposes GrammarGem's local engines +/// (Harper grammar + the on-device LLM) to a **browser extension** — the +/// highest-volume surface for a grammar tool — with NO cloud round-trip. Built on +/// Network.framework so it adds no third-party HTTP dependency, keeping the +/// privacy/trust surface minimal. +/// +/// Security posture (deliberate): +/// - Binds to 127.0.0.1 only (never a routable interface), via `requiredLocalEndpoint`. +/// - Every engine endpoint requires a per-install bearer token (`X-GrammarGem-Token`); +/// a web page that doesn't know the token cannot drive the engines. +/// - OFF by default — only starts when the user opts in, so the app ships no +/// listening socket unless explicitly enabled. +/// +/// It reuses the SAME engines as the menu-bar app via injected async handlers, so +/// there is one engine, one set of prompts (`AIPrompts`), and one entitlement gate +/// across the app, the extension, and (later) other backends. +final class LocalEngineServer { + + struct AIRequest { let action: AIAction; let text: String } + + struct WireSuggestion: Encodable { + let location: Int + let length: Int + let original: String + let replacement: String + let kind: String + let message: String + } + + /// Grammar pass: corrected text + suggestion spans for the extension to underline. + typealias GrammarHandler = (String) async -> (corrected: String, suggestions: [WireSuggestion]) + /// AI action outcome (a plain enum so a user-facing message needn't be an `Error`). + enum AIOutcome { case ok(String); case error(String) } + /// AI action: runs the gate + model, returns the result or a user-facing error. + typealias AIHandler = (AIRequest) async -> AIOutcome + + private let port: UInt16 + private let token: String + private let grammarHandler: GrammarHandler + private let aiHandler: AIHandler + + private var listener: NWListener? + private let queue = DispatchQueue(label: "com.grammargem.localserver") + + init(port: UInt16, token: String, + grammarHandler: @escaping GrammarHandler, + aiHandler: @escaping AIHandler) { + self.port = port + self.token = token + self.grammarHandler = grammarHandler + self.aiHandler = aiHandler + } + + /// A stable per-install token, persisted so the extension can be paired once. + static func loadOrCreateToken() -> String { + let d = UserDefaults.standard + if let existing = d.string(forKey: AppConfig.LocalServer.tokenKey), !existing.isEmpty { + return existing + } + let token = UUID().uuidString + UUID().uuidString.replacingOccurrences(of: "-", with: "") + d.set(token, forKey: AppConfig.LocalServer.tokenKey) + return token + } + + func start() { + guard listener == nil else { return } + do { + let params = NWParameters.tcp + guard let nwPort = NWEndpoint.Port(rawValue: port) else { return } + // Loopback-only: refuse to bind to any routable interface. + params.requiredLocalEndpoint = .hostPort(host: "127.0.0.1", port: nwPort) + let listener = try NWListener(using: params) + listener.newConnectionHandler = { [weak self] conn in self?.accept(conn) } + listener.start(queue: queue) + self.listener = listener + Log.app.info("Local engine server on 127.0.0.1:\(self.port, privacy: .public) (extension bridge)") + } catch { + Log.app.error("Local engine server failed to start: \(error.localizedDescription, privacy: .public)") + } + } + + func stop() { + listener?.cancel() + listener = nil + } + + // MARK: - Connection lifecycle + + private func accept(_ conn: NWConnection) { + conn.start(queue: queue) + receive(conn, buffer: Data()) + } + + private func receive(_ conn: NWConnection, buffer: Data) { + conn.receive(minimumIncompleteLength: 1, maximumLength: 1 << 16) { [weak self] data, _, isComplete, error in + guard let self else { conn.cancel(); return } + var buffer = buffer + if let data { buffer.append(data) } + if let request = HTTPRequest(buffer), request.isComplete { + Task { await self.route(request, on: conn) } + return + } + if isComplete || error != nil { conn.cancel(); return } + self.receive(conn, buffer: buffer) // headers/body not fully arrived yet + } + } + + // MARK: - Routing + + private func route(_ request: HTTPRequest, on conn: NWConnection) async { + // CORS preflight — extensions issue this before a cross-origin POST. + if request.method == "OPTIONS" { + send(conn, status: 204, body: Data()) + return + } + + if request.path == "/health" || request.path == "/v1/health" { + sendJSON(conn, status: 200, HealthResponse(ok: true, app: AppConfig.appName, version: AppConfig.appVersion)) + return + } + + // Token gate for every engine endpoint. + guard request.headers["x-grammargem-token"] == token else { + sendJSON(conn, status: 401, ErrorResponse(error: "unauthorized")) + return + } + + switch (request.method, request.path) { + case ("POST", "/v1/grammar"): + guard let text = decodeText(request.body) else { + sendJSON(conn, status: 400, ErrorResponse(error: "missing 'text'")); return + } + let result = await grammarHandler(text) + sendJSON(conn, status: 200, GrammarResponse(corrected: result.corrected, suggestions: result.suggestions)) + + case ("POST", "/v1/ai"): + guard let req = decodeAI(request.body) else { + sendJSON(conn, status: 400, ErrorResponse(error: "bad request")); return + } + switch await aiHandler(req) { + case .ok(let out): sendJSON(conn, status: 200, AIResponse(result: out)) + case .error(let msg): sendJSON(conn, status: 422, ErrorResponse(error: msg)) + } + + default: + sendJSON(conn, status: 404, ErrorResponse(error: "not found")) + } + } + + // MARK: - Body decoding + + private func decodeText(_ body: Data) -> String? { + struct P: Decodable { let text: String } + guard let p = try? JSONDecoder().decode(P.self, from: body), !p.text.isEmpty else { return nil } + return p.text + } + + private func decodeAI(_ body: Data) -> AIRequest? { + struct P: Decodable { + let action: String + let text: String + let instruction: String? + let language: String? + let mode: String? + let tone: String? + } + guard let p = try? JSONDecoder().decode(P.self, from: body), !p.text.isEmpty else { return nil } + let action: AIAction + switch p.action { + case "rewriteClarity": action = .rewriteClarity + case "rewrite": action = .rewrite + case "ask": + guard let i = p.instruction, !i.trimmingCharacters(in: .whitespaces).isEmpty else { return nil } + action = .ask(i) + case "translate": + guard let l = p.language, !l.isEmpty else { return nil } + action = .translate(language: l) + case "tone": + action = .adjustTone(Tone(rawValue: p.tone ?? "") ?? .professional) + case "mode": + guard let id = p.mode, let m = ModeRegistry.mode(id: id) else { return nil } + action = .applyMode(m) + default: + return nil + } + return AIRequest(action: action, text: p.text) + } + + // MARK: - Responses + + private struct HealthResponse: Encodable { let ok: Bool; let app: String; let version: String } + private struct GrammarResponse: Encodable { let corrected: String; let suggestions: [WireSuggestion] } + private struct AIResponse: Encodable { let result: String } + private struct ErrorResponse: Encodable { let error: String } + + private func sendJSON(_ conn: NWConnection, status: Int, _ value: T) { + let body = (try? JSONEncoder().encode(value)) ?? Data("{}".utf8) + send(conn, status: status, body: body) + } + + private func send(_ conn: NWConnection, status: Int, body: Data) { + var head = "HTTP/1.1 \(status) \(Self.reason(status))\r\n" + head += "Content-Type: application/json\r\n" + head += "Content-Length: \(body.count)\r\n" + // The extension calls cross-origin; a secret token (not the origin) is the gate. + head += "Access-Control-Allow-Origin: *\r\n" + head += "Access-Control-Allow-Headers: Content-Type, X-GrammarGem-Token\r\n" + head += "Access-Control-Allow-Methods: POST, GET, OPTIONS\r\n" + head += "Connection: close\r\n\r\n" + var out = Data(head.utf8) + out.append(body) + conn.send(content: out, completion: .contentProcessed { _ in conn.cancel() }) + } + + private static func reason(_ status: Int) -> String { + switch status { + case 200: return "OK" + case 204: return "No Content" + case 400: return "Bad Request" + case 401: return "Unauthorized" + case 404: return "Not Found" + case 422: return "Unprocessable Entity" + default: return "Error" + } + } +} + +/// A just-enough HTTP/1.1 request parser for small JSON POSTs. Returns nil until +/// the headers terminator (`\r\n\r\n`) has arrived; `isComplete` is false until the +/// full `Content-Length` body is buffered, so the receive loop knows to read more. +private struct HTTPRequest { + let method: String + let path: String + let headers: [String: String] + let body: Data + let isComplete: Bool + + init?(_ raw: Data) { + guard let headerEnd = raw.range(of: Data("\r\n\r\n".utf8)) else { return nil } + guard let headerString = String(data: raw[..= 2 else { return nil } + method = String(parts[0]) + path = String(parts[1]) + lines.removeFirst() + + var hdrs: [String: String] = [:] + for line in lines { + guard let colon = line.firstIndex(of: ":") else { continue } + let key = line[..= contentLength + } +} diff --git a/Sources/GrammarGem/System/TextCapture.swift b/Sources/GrammarGem/System/TextCapture.swift index 80e4f48..1ff2241 100644 --- a/Sources/GrammarGem/System/TextCapture.swift +++ b/Sources/GrammarGem/System/TextCapture.swift @@ -24,10 +24,12 @@ final class TextCapture { enum CaptureError: LocalizedError { case noSelection case notPermitted + case secureField var errorDescription: String? { switch self { case .noSelection: return "Select some text first, then press the hotkey." case .notPermitted: return "GrammarGem needs Accessibility permission to read and replace text." + case .secureField: return "GrammarGem never reads password fields." } } } @@ -41,8 +43,15 @@ final class TextCapture { // MARK: - Capture /// Try AX first; on empty/unavailable, fall back to the clipboard path. + /// Refuses outright if the focused element is a password field. func capture() throws -> Capture { - if let ax = captureViaAccessibility() { + let focused = AXIsProcessTrusted() ? AX.focusedElement() : nil + if let focused, AX.isSecureTextField(focused) { + // Bail before the clipboard fallback too — never synthesize ⌘C into a + // password field. + throw CaptureError.secureField + } + if let ax = captureViaAccessibility(focused) { return ax } if let clip = try captureViaClipboard() { @@ -51,9 +60,8 @@ final class TextCapture { throw CaptureError.noSelection } - private func captureViaAccessibility() -> Capture? { - guard AXIsProcessTrusted() else { return nil } - guard let focused = AX.focusedElement() else { return nil } + private func captureViaAccessibility(_ focused: AXUIElement?) -> Capture? { + guard let focused else { return nil } var valueRef: CFTypeRef? guard AXUIElementCopyAttributeValue( @@ -92,6 +100,7 @@ final class TextCapture { func focusedFieldText() -> (text: String, element: AXUIElement)? { guard AXIsProcessTrusted() else { return nil } guard let focused = AX.focusedElement() else { return nil } + guard !AX.isSecureTextField(focused) else { return nil } // never fix a password field // Only treat genuine editable text roles as fixable, so we don't report // "nothing selected" failures on sliders/steppers/custom controls. diff --git a/Sources/GrammarGem/System/TextFieldScanner.swift b/Sources/GrammarGem/System/TextFieldScanner.swift index ff5ac1d..4e320ea 100644 --- a/Sources/GrammarGem/System/TextFieldScanner.swift +++ b/Sources/GrammarGem/System/TextFieldScanner.swift @@ -47,7 +47,9 @@ enum TextFieldScanner { if role == kAXTextFieldRole as String || role == kAXTextAreaRole as String || role == kAXComboBoxRole as String { - if let value = AX.copyString(el, kAXValueAttribute), + // Never surface password fields in the live monitor. + if !AX.isSecureTextField(el), + let value = AX.copyString(el, kAXValueAttribute), value.trimmingCharacters(in: .whitespacesAndNewlines).count >= 3 { let label = AX.copyString(el, kAXTitleAttribute) ?? AX.copyString(el, kAXDescriptionAttribute) diff --git a/Sources/GrammarGem/System/TextReplacementCoordinator.swift b/Sources/GrammarGem/System/TextReplacementCoordinator.swift index 3746686..2cc0771 100644 --- a/Sources/GrammarGem/System/TextReplacementCoordinator.swift +++ b/Sources/GrammarGem/System/TextReplacementCoordinator.swift @@ -12,14 +12,19 @@ final class TextReplacementCoordinator { private let ai: AIEngine private let gate: FeatureGate private let detector: AppDetector + /// Vocabulary the LLM must reproduce verbatim (personal dictionary / style + /// guide). Read fresh per action so dictionary edits take effect immediately. + private let protectedTerms: () -> [String] init(capture: TextCapture, grammar: GrammarEngine, ai: AIEngine, - gate: FeatureGate, detector: AppDetector) { + gate: FeatureGate, detector: AppDetector, + protectedTerms: @escaping () -> [String] = { [] }) { self.capture = capture self.grammar = grammar self.ai = ai self.gate = gate self.detector = detector + self.protectedTerms = protectedTerms } /// The "fix" hotkey — instant grammar correction (Layer 1, always free). @@ -52,7 +57,7 @@ final class TextReplacementCoordinator { do { cap = try await captureOffMain() } catch { return .failed(error.localizedDescription) } do { - let result = try await ai.run(action, on: cap.text) + let result = try await ai.run(action, on: cap.text, protectedTerms: protectedTerms()) gate.recordAIActionUsed() let ok = await replaceOffMain(result, cap) return ok ? .replaced(result) : .failed("Couldn't write the result back.") @@ -73,7 +78,7 @@ final class TextReplacementCoordinator { do { cap = try await captureOffMain() } catch { return .failed(error.localizedDescription) } do { - let result = try await ai.run(action, on: cap.text) + let result = try await ai.run(action, on: cap.text, protectedTerms: protectedTerms()) gate.recordAIActionUsed() let ok = await replaceOffMain(result, cap) return ok ? .replaced(result) : .failed("Couldn't write the result back.") diff --git a/Tests/GrammarGemTests/GrammarGemTests.swift b/Tests/GrammarGemTests/GrammarGemTests.swift index 41bc914..0341edd 100644 --- a/Tests/GrammarGemTests/GrammarGemTests.swift +++ b/Tests/GrammarGemTests/GrammarGemTests.swift @@ -149,6 +149,66 @@ final class GrammarGemTests: XCTestCase { XCTAssertNil(ModeRegistry.mode(forBundleID: "com.unknown.app")) } + // MARK: - AIPrompts (backend-neutral seam) + + func testProtectedTermsInjectedIntoSystemPrompt() { + let base = AIPrompts.systemPrompt(for: .rewriteClarity) + let withTerms = AIPrompts.systemPrompt(for: .rewriteClarity, protectedTerms: ["GrammarGem", "Harper"]) + XCTAssertFalse(base.contains("GrammarGem")) + XCTAssertTrue(withTerms.contains("\"GrammarGem\"")) + XCTAssertTrue(withTerms.contains("\"Harper\"")) + XCTAssertTrue(withTerms.contains("verbatim")) + } + + func testProtectedTermsClauseSkipsWhenEmpty() { + let blank = AIPrompts.systemPrompt(for: .rewrite, protectedTerms: ["", " "]) + XCTAssertEqual(blank, AIPrompts.systemPrompt(for: .rewrite)) + } + + func testMaxTokensHonorsModeLengthCap() { + // Default actions get the full budget… + XCTAssertEqual(AIPrompts.maxTokens(for: .rewriteClarity), 512) + // …but a short-form Mode (Team Chat, lengthCap 60) gets far fewer. + let slack = ModeRegistry.slack + XCTAssertNotNil(slack.lengthCap) + let capped = AIPrompts.maxTokens(for: .applyMode(slack)) + XCTAssertLessThan(capped, 512) + XCTAssertGreaterThanOrEqual(capped, 64) + // A mode with no cap (Polish) falls back to the default budget. + XCTAssertEqual(AIPrompts.maxTokens(for: .applyMode(ModeRegistry.polish)), 512) + } + + func testCleanStripsPreambleAndQuotes() { + XCTAssertEqual(AIPrompts.clean("Sure, here's the rewrite: Hello world"), "Hello world") + XCTAssertEqual(AIPrompts.clean("\"Quoted result\""), "Quoted result") + XCTAssertEqual(AIPrompts.clean(" already clean "), "already clean") + } + + func testParseToneIsRobust() { + XCTAssertEqual(AIPrompts.parseTone("professional"), .professional) + XCTAssertEqual(AIPrompts.parseTone(" Friendly.\n"), .friendly) + XCTAssertEqual(AIPrompts.parseTone("the tone is academic here"), .academic) + XCTAssertEqual(AIPrompts.parseTone("???"), .professional) // safe fallback + } + + // MARK: - Custom modes + + @MainActor + func testCustomModeRejectsEmptyPromptAndDuplicates() { + // Deterministic regardless of prior runs (the store persists to UserDefaults). + UserDefaults.standard.removeObject(forKey: "GrammarGem.customModes") + defer { UserDefaults.standard.removeObject(forKey: "GrammarGem.customModes") } + + let store = CustomModesStore() + XCTAssertFalse(store.addCustom(name: "Brand Voice", prompt: " "), + "empty prompt must be rejected") + XCTAssertTrue(store.addCustom(name: "Brand Voice", prompt: "Write in Acme's warm voice.")) + XCTAssertFalse(store.addCustom(name: "brand voice", prompt: "different prompt"), + "duplicate name (case-insensitive) must be rejected") + XCTAssertFalse(store.addCustom(name: "Polish", prompt: "collides with a built-in"), + "name colliding with a built-in mode must be rejected") + } + // MARK: - Device fingerprint func testDeviceFingerprintIsStableAndHashed() { From 2f3dd02148d4fd87f52e6a5a812ef8189555b718 Mon Sep 17 00:00:00 2001 From: BigMarc Date: Sat, 20 Jun 2026 20:26:22 +0200 Subject: [PATCH 9/9] feat: stream LLM tokens to the extension via /v1/ai/stream MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - LocalEngineServer: add a streaming AI endpoint (newline-delimited JSON frames) over a no-Content-Length chunked response, plus an AIStreamHandler. - AppState.handleServerAIStream: gate + iterate AIEngine.runStreaming, emitting each token — gives the runStreaming infrastructure its first real consumer. Co-Authored-By: Claude Opus 4.8 (1M context) --- Sources/GrammarGem/App/AppState.swift | 22 +++++++++ .../GrammarGem/System/LocalEngineServer.swift | 47 ++++++++++++++++++- 2 files changed, 68 insertions(+), 1 deletion(-) diff --git a/Sources/GrammarGem/App/AppState.swift b/Sources/GrammarGem/App/AppState.swift index d69dc53..f3eb745 100644 --- a/Sources/GrammarGem/App/AppState.swift +++ b/Sources/GrammarGem/App/AppState.swift @@ -180,6 +180,10 @@ final class AppState: ObservableObject { aiHandler: { [weak self] (req: LocalEngineServer.AIRequest) async -> LocalEngineServer.AIOutcome in guard let self else { return .error("GrammarGem is shutting down.") } return await self.handleServerAI(req) + }, + aiStreamHandler: { [weak self] (req, onChunk) -> LocalEngineServer.AIOutcome in + guard let self else { return .error("GrammarGem is shutting down.") } + return await self.handleServerAIStream(req, onChunk: onChunk) }) server.start() localServer = server @@ -198,6 +202,24 @@ final class AppState: ObservableObject { } } + /// Streaming variant for the extension: yields tokens as they generate. + private func handleServerAIStream(_ req: LocalEngineServer.AIRequest, + onChunk: @escaping (String) -> Void) async -> LocalEngineServer.AIOutcome { + if case .denied(let reason) = gate.authorizeAI(req.action) { return .error(reason) } + guard ai.isReady else { return .error(AIEngineError.modelNotReady.localizedDescription) } + var accumulated = "" + do { + for try await chunk in ai.runStreaming(req.action, on: req.text, protectedTerms: dictionary.entries) { + accumulated += chunk + onChunk(chunk) + } + gate.recordAIActionUsed() + return .ok(accumulated) + } catch { + return .error(error.localizedDescription) + } + } + // MARK: - Hotkey handling /// (Re)register the global hotkeys from the current preferences. diff --git a/Sources/GrammarGem/System/LocalEngineServer.swift b/Sources/GrammarGem/System/LocalEngineServer.swift index f6da35a..eb087f6 100644 --- a/Sources/GrammarGem/System/LocalEngineServer.swift +++ b/Sources/GrammarGem/System/LocalEngineServer.swift @@ -36,22 +36,28 @@ final class LocalEngineServer { enum AIOutcome { case ok(String); case error(String) } /// AI action: runs the gate + model, returns the result or a user-facing error. typealias AIHandler = (AIRequest) async -> AIOutcome + /// Streaming AI action: runs the gate + model, invoking `onChunk` per token as it + /// generates, then returns the final outcome (full text, or an error message). + typealias AIStreamHandler = (AIRequest, @escaping (String) -> Void) async -> AIOutcome private let port: UInt16 private let token: String private let grammarHandler: GrammarHandler private let aiHandler: AIHandler + private let aiStreamHandler: AIStreamHandler private var listener: NWListener? private let queue = DispatchQueue(label: "com.grammargem.localserver") init(port: UInt16, token: String, grammarHandler: @escaping GrammarHandler, - aiHandler: @escaping AIHandler) { + aiHandler: @escaping AIHandler, + aiStreamHandler: @escaping AIStreamHandler) { self.port = port self.token = token self.grammarHandler = grammarHandler self.aiHandler = aiHandler + self.aiStreamHandler = aiStreamHandler } /// A stable per-install token, persisted so the extension can be paired once. @@ -145,6 +151,23 @@ final class LocalEngineServer { case .error(let msg): sendJSON(conn, status: 422, ErrorResponse(error: msg)) } + case ("POST", "/v1/ai/stream"): + guard let req = decodeAI(request.body) else { + sendJSON(conn, status: 400, ErrorResponse(error: "bad request")); return + } + // Newline-delimited JSON frames: {"chunk":"…"} per token, then a final + // {"done":true} or {"error":"…"}. The 200 header goes out before tokens, + // so an entitlement/readiness failure surfaces as a closing error frame. + beginStream(conn) + let outcome = await aiStreamHandler(req) { [weak self] chunk in + self?.streamFrame(conn, ["chunk": chunk]) + } + switch outcome { + case .ok: streamFrame(conn, ["done": true]) + case .error(let msg): streamFrame(conn, ["error": msg]) + } + endStream(conn) + default: sendJSON(conn, status: 404, ErrorResponse(error: "not found")) } @@ -201,6 +224,28 @@ final class LocalEngineServer { send(conn, status: status, body: body) } + // MARK: - Streaming responses (newline-delimited JSON, no Content-Length) + + private func beginStream(_ conn: NWConnection) { + var head = "HTTP/1.1 200 OK\r\n" + head += "Content-Type: application/x-ndjson\r\n" + head += "Cache-Control: no-cache\r\n" + head += "Access-Control-Allow-Origin: *\r\n" + head += "Access-Control-Allow-Headers: Content-Type, X-GrammarGem-Token\r\n" + head += "Connection: close\r\n\r\n" + conn.send(content: Data(head.utf8), completion: .contentProcessed { _ in }) + } + + private func streamFrame(_ conn: NWConnection, _ object: [String: Any]) { + guard var data = try? JSONSerialization.data(withJSONObject: object) else { return } + data.append(0x0A) // newline delimiter + conn.send(content: data, completion: .contentProcessed { _ in }) + } + + private func endStream(_ conn: NWConnection) { + conn.send(content: nil, completion: .contentProcessed { _ in conn.cancel() }) + } + private func send(_ conn: NWConnection, status: Int, body: Data) { var head = "HTTP/1.1 \(status) \(Self.reason(status))\r\n" head += "Content-Type: application/json\r\n"