Closes D-5 / D-6 (sqlite-vec dylib bundling) carry-forwards from the 2026-05-04 audit by adopting jkrukowski/SQLiteVec as a SPM dependency. The package's CSQLiteVec target compiles sqlite3.c + sqlite-vec.c into one statically-linked C target with `core_vec_init()` registering vec0 as an auto-extension. All sqlite3_* calls in Replay's SQLiteConnection and Memory's MemoryStore resolve to this bundled SQLite (vec0 always available) instead of Apple's stripped /usr/lib/libsqlite3.dylib. The retired hand-rolled approach (dlsym pathway + JARVIS_VEC0_STUB_PATH env-flag + Bundle.module placeholder text file) never worked on macOS because Apple stripped sqlite3_load_extension from the system libsqlite3. Memory init has been silently dormant since Phase 7 (2026-04 onward), which is what made B-02 (history threading) appear permanently broken to the user during dogfooding even after the48ad8d6tactical patch landed. Live verification 2026-05-11: fresh launch with empty jarvis.db creates schema, persists turn rows across submits, B-02 multi-turn context resolves correctly ("what breed is Toby?" → "Golden Retriever" after prior turn established Toby is a Golden Retriever), and the new get_memory_stats tool reports `turnsCount=6, vecVersion=v0.1.6, sqliteVersion=3.51.0`. Changes: - packages/Replay/Package.swift + SQLiteVec SPM dependency (from: "0.0.14") + CSQLiteVec product wired into Replay target - packages/Replay/Sources/Replay/SQLiteConnection.swift - import SQLite3 + @_exported import CSQLiteVec All sqlite3_* call sites unchanged — linker now resolves to our bundled sqlite3 with vec0 statically linked in. - packages/Memory/Package.swift + SQLiteVec SPM dependency (named product so MemoryStore can import CSQLiteVec directly for the core_vec_init() one-shot call) - resources: PLACEHOLDER.txt copy (defunct vec0.dylib stub slot) - packages/Memory/Sources/Memory/MemoryStore.swift - import SQLite3 → import CSQLiteVec + _vecAutoExtensionRegistered static-let one-shot: calls CSQLiteVec.core_vec_init() which registers vec0 via sqlite3_auto_extension on the first MemoryStore construction. Idempotent (static-let initializer fires exactly once). - loadVecExtension(on:) dlsym/JARVIS_VEC0_STUB_PATH/Bundle.module pathway (retired; ~70 lines removed) Updated docstring to reflect the new hard-fail boot policy. - packages/Memory/Sources/Memory/Resources/PLACEHOLDER.txt — deleted - App/AppDelegate.swift installMemory() Reverses Track-D D-1 (75a10be, 2026-05-04): MemoryStore.init failures are now FATAL via Logger.critical + TCCAlertService.presentHardBlock + NSApp.terminate. The graceful-degradation path that kept the app booting with memoryStore=nil hid the entire B-02/B-04/B-05 silent- failure bug class. Aligns with the 2026-05-07 API-first pivot thesis: "no silent failures". `store` is now non-optional throughout installMemory; downstream callers no longer need `if let store = store`. - packages/MCP/Sources/MCP/InProcess/GetMemoryStatsTool.swift (new) + MemoryStatsDispatching protocol + MemoryStats Codable struct (turnsCount, factsTotal, factsActive, sessionsCount, dbFileBytes, vecVersion, sqliteVersion, lastTurnAtUnixMs, lastFactAtUnixMs) + GetMemoryStatsTool conforming to InProcessTool - App/MCP/InProcessMemoryAdapters.swift + MemoryStatsStoreAdapter — bridges the protocol to MemoryStore's public queryRowCount / querySingleString seams and FileManager for the on-disk file size. Read-only, no confirmation. - App/AppDelegate.swift installSelfKnowledgeTools() + Registers GetMemoryStatsTool with MemoryStatsStoreAdapter. - packages/Memory/Tests/MemoryTests/* Retired the JARVIS_VEC0_STUB_PATH XCTSkipUnless guards from 9 tests (vec0 is always available now — no need to env-gate). Rewrote MemoryStoreTests to drop the now-impossible "init throws when vec missing" case and assert facts_vec virtual table creation + vec_version() readback. Added seedTurnRow helper to MemoryStoreApplyOpTests so the now-enforced `facts.source_turn_id REFERENCES turns(id)` foreign key is honored in tests that previously passed when FK enforcement was dormant. Test summary: Memory full suite 91 tests, 10 skipped (env-gated real- Ollama tests), 0 failures. App target builds clean. Substrate verified end-to-end via live launch (vec_version: v0.1.6 logged at boot; get_memory_stats returns actual schema row counts). Pending D-7 carry-forward: ollama pull nomic-embed-text (~270MB) for embedder; user already has qwen2.5-coder:32b-instruct-q8_0 which is a higher-quality variant of the project's hardcoded qwen2.5-coder:32b — small ModelID config delta to follow. Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
64 lines
2.7 KiB
Swift
64 lines
2.7 KiB
Swift
// swift-tools-version:6.0
|
|
//
|
|
// Package: Memory
|
|
//
|
|
// Phase 7 / Plan 07-01 — local memory subsystem (SQLite + FTS5 + sqlite-vec).
|
|
//
|
|
// D-5/D-6 closure (2026-05-11): SQLite and sqlite-vec are now statically
|
|
// linked together via the `CSQLiteVec` target of jkrukowski/SQLiteVec.
|
|
// SQLiteConnection (in Replay) re-exports CSQLiteVec; Memory consumes it
|
|
// transitively but also names the product directly so the import in
|
|
// MemoryStore.swift resolves by name. The old runtime extension-loading
|
|
// pathway (sqlite3_load_extension via dlsym) is retired — it never worked
|
|
// on macOS because Apple strips that symbol from the system libsqlite3.
|
|
import PackageDescription
|
|
|
|
let package = Package(
|
|
name: "Memory",
|
|
// Plan 09-02 cascade — bumped from v13 to v14 because Memory depends on
|
|
// AgentCore (now v14 due to JarvisVision dependency in AgentOrchestrator's
|
|
// vision-dispatch path).
|
|
platforms: [.macOS(.v14)],
|
|
products: [
|
|
.library(name: "Memory", targets: ["Memory"]),
|
|
],
|
|
dependencies: [
|
|
.package(path: "../Logging"),
|
|
.package(path: "../AgentCore"),
|
|
.package(path: "../Replay"),
|
|
.package(url: "https://github.com/apple/swift-log.git", from: "1.5.0"),
|
|
// D-5/D-6: Memory directly imports CSQLiteVec for the
|
|
// process-global `core_vec_init()` auto-extension registration.
|
|
// Replay already pulls SQLiteVec for SQLiteConnection; declaring
|
|
// here gives Memory a named product to import. Same version pin.
|
|
.package(url: "https://github.com/jkrukowski/SQLiteVec.git", from: "0.0.14"),
|
|
],
|
|
targets: [
|
|
.target(
|
|
name: "Memory",
|
|
dependencies: [
|
|
.product(name: "JarvisLogging", package: "Logging"),
|
|
.product(name: "AgentCore", package: "AgentCore"),
|
|
.product(name: "AgentOrchestrator", package: "AgentCore"),
|
|
.product(name: "Replay", package: "Replay"),
|
|
.product(name: "Logging", package: "swift-log"),
|
|
.product(name: "CSQLiteVec", package: "SQLiteVec"),
|
|
],
|
|
path: "Sources/Memory",
|
|
swiftSettings: [.swiftLanguageMode(.v6)]
|
|
),
|
|
.testTarget(
|
|
name: "MemoryTests",
|
|
dependencies: [
|
|
"Memory",
|
|
// Plan 07-06: MemoryRegressionCorpusTests drives MemoryExtractor
|
|
// end-to-end against a real local Ollama under JARVIS_REAL_MODELS=1.
|
|
// The OllamaProvider product is the live LLMProvider implementation.
|
|
.product(name: "OllamaProvider", package: "AgentCore"),
|
|
],
|
|
path: "Tests/MemoryTests",
|
|
swiftSettings: [.swiftLanguageMode(.v6)]
|
|
),
|
|
]
|
|
)
|