0.9.0 — 2026-09-02
— 2026-09-02
Added
heimdall setup— hardware-fitted configuration: detects accelerator
(Metal/CUDA/CPU) + physical cores, generates annotated~/.graft/config.yaml
(existing file backed up, never clobbered), downloads an embedding model
from a built-in catalog (bge-m3 default; bge-small-en-v1.5,
snowflake-arctic-embed-s, nomic-embed-text-v1.5) or accepts BYO--model-path,
and installs/repairs the launchd daemon (com.graft.daemon). Flags:
--model --model-path --threads --instances --accel --graftd --skip-daemon --detect-only. Seedocs/setup.md.- Doctor expansion —
heimdall doctornow also validates: config present,
graftd --check-configpasses, embedding model file present + sane size,
plist valid, daemon running — each with SETUP NEEDED guidance. - graft-cpp fork + subtree —
vendor/graft/is now a git subtree of the
graft-cppfork (pinnedv0.1.0-heimdall.2). Fork delta: daemon config
fallback chain (--config>$GRAFT_CONFIG>~/.graft/config.yaml>
defaults, source logged) andgraftd --check-config [PATH](side-effect-free
resolved-config dump). Update viagit subtree pull— see
vendor/graft/VENDORED.md. - Self-contained
graftdbuild — llama.cpp fetched via CMake
FetchContentat pinned tagb10760and compiled as static libraries.
graftdhas no dynamiclibllama/libggmldependency and no
RPATH/LC_RPATH. Metal shader library embedded on Apple
(GGML_METAL_EMBED_LIBRARY). CUDA passthrough:-DGGML_CUDA=ON. - npm postinstall auto-build —
npm i -gbuildsgraftdwhen the
toolchain is present; prints a SETUP NEEDED block (what failed + log path- retry instructions) on any failure and exits 0 — install never breaks.
HEIMDALL_NO_BUILD=1skips the build in postinstall andheimdall setup.
- retry instructions) on any failure and exits 0 — install never breaks.
bin/lib/graft-build.mjs— probe (graftd --check-config, exit 0 +
model_path:in stdout; missingconfigPathreturns error immediately),
canonical-first find/install (~/.local/bin/graftdprobed first; if
broken/absent and another candidate works — build cache or
~/Repos/graft-cpp/build/graftd— it is copied atomically into
~/.local/bin/graftd, broken canonical kept asgraftd.bak-<timestamp>;
only if no candidate works does it fall through to build), build (cmake
configure + incremental build, timeout-bounded), install (atomic copy to
~/.local/bin/graftd;graftCLI copied to~/.local/bin/graftonly if
absent).heimdall setupbinary handling — finds a workinggraftdor builds
and installs one when none exists;--graftd PATHprobed before copying
(broken binary = one-line error, nothing written).tests/graftd-binary.test.mjs— asserts the builtgraftdhas no
dynamic llama/ggml deps, no RPATH/LC_RPATH, and runs after being copied
elsewhere.
Changed
- bge-m3.gguf relocated from
vendor/graft/models/to~/.graft/models/
(models no longer live inside the source tree; setup downloads on demand). - Setup default instances — always 2 (was 2 only when cores ≥ 8, else 1).
- Linux thread detection — physical cores counted from
/proc/cpuinfo
(unique physical-id × core-id pairs), falling back tolscpu -p=CORE,SOCKET,
nproc, thenos.cpus(). vendor/graft/in the npm tarball —vendor/graft/source, CMake, and
third_party/{BLAKE3,mpack,sqlite-vec}are shipped;third_party/llama.cpp/,
build/,models/,*.dbare excluded; llama.cpp is fetched at first build
(network needed once).- C++ runtime linkage —
graftdlinksstdc++on Linux,c++on Apple
(wasc++unconditionally, which fails to link on Linux/gcc).
Fixed
dyld: Library not loaded: @rpath/libllama.0.dylib— pre-0.9.0graftd
linked llama.cpp dynamically with build-tree RPATHs; the binary broke when
moved out of the build tree. The static build has no RPATH/LC_RPATH and no
dynamic llama/ggml dependency.- Hardcoded
third_party/llama.cpp/builddependency — replaced by CMake
FetchContent; llama.cpp is fetched at configure time from the pinned tag
and built in place. vendor/graftsubtree missing 61 source files (src/**,
include/graft/*.h,VERSION): commit b7845ef's conflict resolution
deleted them; restored verbatim from the v0.1.0-heimdall.2 squash
(b4a51de).src/daemon/main.ckeeps the heimdall fork delta.- Tracked dangling symlink removed —
vendor/graft/third_party/llama.cpp
→/tmp/llama-masterwas tracked in git; removed. The path is now the
gitignored FetchContent checkout.