Commit Graph

541 Commits

Author SHA1 Message Date
Tobi Lutke
c162ed1319
fix: disable libggml-metal residency sets on darwin
The libggml-metal static device destructor asserts on a non-empty
residency set during libc `exit()` → `__cxa_finalize_ranges`
(ggml-org/llama.cpp#17869). The residency set's 180 s keep_alive timer
hasn't expired by exit, so `GGML_ASSERT([rsets->data count] == 0)`
fails and `ggml_abort` dumps a multi-kB backtrace to stderr after the
user-visible output. Every llama-using CLI command (`query`,
`vsearch`, `embed`) was affected, plus the `bun test` runner.

No JS-side dispose path can prevent it: the static destructor runs
after every JS-reachable cleanup, and Node's `reallyExit` calls libc
`exit()` not `_exit()` (verified in node/src/api/environment.cc),
so it does NOT skip C++ static destructors as we'd assumed.

The actual fix is to disable residency sets via
`GGML_METAL_NO_RESIDENCY=1` before the native binding loads. For
QMD's short-lived CLI workflow there's no measurable cost
(benchmarked: identical wall time with and without on M3 Pro).

Three propagation points are needed:
- `bin/qmd` exports the env var before spawning node/bun. This
  covers all production CLI invocations.
- `src/test-preload.ts` mirrors the launcher for `bun test` runs.
  Bun does NOT sync `process.env` mutations to libc `setenv()`
  (verified empirically — Node does, via uv_os_setenv), so on Bun we
  reach for `bun:ffi` to call `setenv()` directly. vitest forks
  per-test-file so its parent never loads the binding.
- `qmd doctor` reports the mitigation state via the new
  `isDarwinMetalMitigationActive()` predicate so users can verify it
  in their environment.

Opt back in with `QMD_METAL_KEEP_RESIDENCY=1` (long-lived qmd
processes, MCP daemon hot reload, upstream fix triage). The old
`QMD_DISABLE_DARWIN_QUERY_JSON_SAFE_EXIT` is removed — its per-command
bypass mechanism didn't actually work on Node (it called
`process.reallyExit` which goes through libc exit) and is fully
replaced by the launcher env var.

Removed the old broken `installDarwinExitGuard()` mechanism from
LlamaCpp; kept the function name as a no-op shim for back-compat.
2026-05-28 13:40:14 -07:00
Tobi Lutke
0d7fdb7589
fix(launcher): prefer Node+tsx over Bun in source mode when both lockfiles exist
Source-mode runner selection now mirrors the dist-mode 'npm priority' rule:
if both package-lock.json and bun.lock are present in the package root,
use Node + tsx instead of Bun. pnpm/npm installs ship Node-ABI native
modules (better-sqlite3, sqlite-vec), and routing through Bun produces
ABI mismatches.

This also fixes pnpm-global installs, which copy the entire working tree
(including .git and bun.lock) into <prefix>/node_modules/@tobilu/qmd/.
The old logic saw .git + bun.lock + bun-on-PATH and routed to Bun
against the Node-installed native modules.

Adds a regression test covering the both-lockfiles source-checkout case.
2026-05-28 11:57:30 -07:00
Tobi Lutke
3de3162e1a
feat(cli): ./-prefix $PWD-relative --full-path; add --format <kind>
--full-path now ./-prefixes any path that resolves under $PWD, both for
search/query results and for get/multi-get headers. This makes the
output unambiguously a filesystem path — a bare 'notes/foo.md' could be
misread as a collection-relative qmd:// fragment, but './notes/foo.md'
cannot. Absolute realpaths (when the file is outside $PWD) are
unchanged. Extracted as renderFullPath() and reused across the three
call sites so the policy stays consistent.

New --format <kind> flag selects output format for search/query and
multi-get (cli|json|csv|md|xml|files). The legacy boolean aliases
(--json/--csv/--md/--xml/--files) still work for back-compat but are
removed from --help; the skill is updated to use --format.

ANSI colors and OSC 8 hyperlinks are already gated on process.stdout
.isTTY, so piped/agentic invocations get clean plain-text output with
no escape sequences. Verified via od -c on a piped 'qmd search' run.
2026-05-28 11:35:21 -07:00
Tobi Lutke
436420e927
feat(search,query): --full-path swaps qmd:// for on-disk paths
`qmd://` URIs remain the default identifier in search and query output
(across all formats: cli, --json, --md, --csv, --xml, --files). The
default CLI view now consistently prints the full qmd:// URI as the
visible label so it can be piped straight into `qmd get`, and --md
output gains a **file:** line for the same reason.

--full-path (already on get/multi-get) now also applies to search and
query: the per-result label becomes the file's on-disk path — relative
to $PWD when the file is in a subfolder of the current directory,
absolute realpath otherwise — and the per-result #docid is dropped
because the path is the identifier. Falls back to qmd:// when the file
is no longer resolvable on disk.

Also locks in @@ -line,count @@ header arithmetic with a regression test
that mirrors the user-reported 77-line / '1 before, 72 after' scenario.
2026-05-28 11:18:03 -07:00
Tobi Lutke
fa8f904a9d
docs(qmd-skill): structured-query-first; cite docid + lines; no sed
- Make structured `qmd query` with intent:/lex:/vec:/hyde: the default
  search mode, and emphasize that the caller authors the expansion
  rather than leaning on the built-in query-expansion model.
- Tell the caller to cite the #docid and exact line numbers now
  printed by get/multi-get, and to slice files with the :from:count
  suffix or --from/-l instead of piping through sed/head/tail.
- Document --full-path for handing the on-disk path to editor tools.
- Bump skill version to 2.2.0 and record the behavior changes under
  ## [Unreleased] in CHANGELOG.md.
- Update the package smoke test that pinned the old 'structured
  queries' wording to match the new, more specific intro phrasing.
2026-05-28 10:56:13 -07:00
Tobi Lutke
41bc3a27d8
feat(get,multi-get): line-numbered + docid output, line ranges, --full-path
Redesign the get/multi-get retrieval surface so callers can cite what
they retrieved and request follow-up slices without piping through sed:

- Output is line-numbered by default; opt out with --no-line-numbers.
- Header always identifies the document by qmd:// path + #docid. The
  MCP get/multi_get tools default lineNumbers=true to match.
- qmd get and the MCP get tool accept a :from:count suffix on a path
  or docid (e.g. '#abc123:120:40' reads 40 lines from line 120).
  Explicit --from/-l flags still override the suffix.
- qmd multi-get now includes #docid in every output format (--md,
  --json, --csv, --xml, --files, default CLI), matching qmd search.
- New --full-path flag swaps the qmd:// + docid header for the
  document's on-disk path (handy for piping into Read/Edit/editors);
  falls back to the canonical header when the file no longer exists.
2026-05-28 10:55:55 -07:00
Tobi Lütke
443760f4d5
release: v2.5.2 2026-05-22 20:24:08 +00:00
Tobi Lütke
f72f6dcc6c
Update CHANGELOG.md and remove autoresearch.jsonl 2026-05-22 20:24:01 +00:00
Tobi Lütke
65e517f783
Enhance launcher shebang polyglot to fall back to Bun if Node is missing on the system
Result: {"status":"keep","test_status":0}
2026-05-22 20:21:12 +00:00
Tobi Lütke
7a5d8f5574
Make bin/qmd launcher a shebang polyglot to support both Windows cmd/ps1 native wrappers and sh-invoked smoke tests
Result: {"status":"keep","test_status":0}
2026-05-22 20:08:49 +00:00
Tobi Lütke
65b813d737
Rewrite launcher in Node.js to fix Windows execution and keep tests passing
Result: {"status":"keep","test_status":0}
2026-05-22 20:03:44 +00:00
Tobi Lütke
ba6538090f
release: v2.5.1 2026-05-20 00:24:59 +00:00
Tobi Lütke
96ab7787f8
Use npm trusted publishing 2026-05-20 00:19:46 +00:00
Tobi Lütke
a8a314b802
Stabilize doctor CLI tests 2026-05-19 23:34:06 +00:00
Tobi Lütke
1926412f29
release: v2.5.0 2026-05-19 23:08:39 +00:00
Tobi Lütke
e3a9c5d02b
Make release script portable 2026-05-19 23:08:30 +00:00
Tobi Lütke
a3f0b9423f
Expand install smoke harness 2026-05-19 23:05:49 +00:00
Tobi Lütke
b5f156c313
Improve qmd diagnostics and embed resilience 2026-05-19 21:39:48 +00:00
Tobi Lutke
105c577b3b
docs: improve qmd skill guidance 2026-05-19 15:22:14 -04:00
Tobi Lutke
2b250f3dca
fix: run qmd from unbuilt checkouts 2026-05-19 15:22:13 -04:00
Tobi Lutke
632c34d120
chore: strengthen package test task 2026-05-19 14:27:38 -04:00
Tobi Lutke
d9348f43a0
feat: add local init and doctor diagnostics 2026-05-19 14:27:33 -04:00
Tobi Lutke
5cda3cf54c
Improve qmd doctor diagnostics 2026-05-19 12:48:16 -04:00
Tobi Lütke
596198c2ba
fix: update nix module hashes 2026-05-18 02:59:20 +00:00
Tobi Lütke
6ea0544e76
chore: update core runtime dependencies 2026-05-18 02:54:03 +00:00
Tobi Lütke
ac6b154f0c
feat: add qmd doctor vector diagnostics 2026-05-18 01:52:05 +00:00
Tobias Lütke
ddbd6bd8be
Merge pull request #656 from tobi/fix/gpu-status-warning
Fix GPU status guidance and benchmark warnings
2026-05-16 19:55:39 -04:00
Tobi Lütke
ad8a371be2
Fix QMD CI test runtime assumptions 2026-05-16 23:52:53 +00:00
Tobi Lütke
028e8fc86f
Improve packaged QMD skill 2026-05-16 23:46:40 +00:00
Tobi Lütke
15a711d729
Run local tests on Node and Bun 2026-05-16 23:46:22 +00:00
Tobi Lütke
da184e58e9
Unify QMD model resolution 2026-05-16 23:46:22 +00:00
Tobi Lütke
1f757379e2
Fix GPU status guidance and benchmark warnings 2026-05-16 23:45:58 +00:00
Tobias Lütke
cdf3bc0712
Merge pull request #657 from tobi/feat/cli-served-skills
Serve QMD skill instructions from the CLI
2026-05-16 19:40:10 -04:00
Tobi Lütke
c18c74a134
Serve QMD skill instructions from CLI 2026-05-16 22:43:33 +00:00
Tobias Lütke
17aa34d753
Merge pull request #655 from tobi/feat/local-qmd-index-bench
feat: support project-local QMD indexes
2026-05-16 14:31:05 -04:00
Tobi Lütke
b2550d273a
Merge remote-tracking branch 'origin/main' into feat/local-qmd-index-bench
# Conflicts:
#	src/cli/qmd.ts
2026-05-16 18:27:49 +00:00
Tobi Lütke
2e0c74310c
feat: support project-local indexes in bench 2026-05-16 18:22:04 +00:00
Tobias Lütke
87520252a5
Merge pull request #654 from tobi/workoff/t_657414dc-dev-review
fix: keep partial embeddings pending
2026-05-16 13:52:49 -04:00
Tobi Lütke
910ca07fd9
fix: keep partial embeddings pending 2026-05-16 17:48:01 +00:00
Tobias Lütke
a35a487af0
Merge pull request #653 from tobi/workoff/t_09301bf8-dev-review
test: cover qmd bin wrapper install layouts
2026-05-16 13:47:44 -04:00
Tobi Lütke
dc49ccff1e
test: cover qmd bin wrapper install layouts 2026-05-16 17:41:43 +00:00
Tobias Lütke
474ac7863d
Merge pull request #652 from tobi/workoff/t_23fce575-dev-review
fix: avoid macOS Metal cleanup abort after JSON query
2026-05-16 13:41:02 -04:00
Tobi Lütke
b59ba6ab1e
test: keep cleanup lifecycle regression portable 2026-05-16 17:35:08 +00:00
Tobias Lütke
9bc316e545
Merge pull request #651 from tobi/workoff/t_0d576ae5-dev-review
fix: keep llama GPU fallback noise off JSON stdout
2026-05-16 13:31:16 -04:00
Tobi Lütke
e4505607f9
Merge remote-tracking branch 'origin/main' into workoff/t_0d576ae5-dev-review
# Conflicts:
#	CHANGELOG.md
2026-05-16 17:26:27 +00:00
Tobi Lütke
60c75cb332
fix: avoid macOS Metal cleanup abort after JSON query 2026-05-16 17:22:46 +00:00
Tobias Lütke
bad20f5565
Merge pull request #644 from Ginja/fix/snippet-absolute-line-numbers
fix: return absolute line numbers from qmd_query
2026-05-16 13:18:35 -04:00
Tobi Lütke
dd5d82d523
fix: keep llama GPU fallback noise off JSON stdout 2026-05-16 17:18:06 +00:00
Tobias Lütke
d0bcdf0cfb
Merge pull request #635 from erlebach/fix/ls-absolute-path-collections
fix(ls): handle collections whose names are absolute paths
2026-05-16 13:13:15 -04:00
Tobi Lütke
2dc8634ac7
fix(ls): preserve qmd:/// collection aliases 2026-05-16 17:12:38 +00:00