jab upload-pack / receive-pack) to retire the native keeper daemon on the be:// wire
jab is a wire CLIENT only (verbs get/put/post/patch/delete/head; no serve). The be:/keeper: transport (be/shared/wire.js dispatch) execs the NATIVE keeper daemon — keeper upload-pack locally or ssh host keeper … — which LAGS jab and is absent from the jab-only bin. Local file:// + git transport (git-upload-pack) already run keeper-free, so TEST-003 converts the local/ingest tests off be:. But the be:// WIRE-PROTOCOL tests (get/be, get/cached, any be-store push/fetch) genuinely need a beagle wire SERVER. Give jab one — a JS upload-pack/receive-pack serve loop — so the be:// wire runs jab-to-jab, fully native-binary-free.
be LAGS jab); the
only surviving native dependency is the keeper wire daemon on be:/keeper:.
wire.js transport dispatch: file:/scheme-less local → read direct (no wire);
//host/git:/ssh:/http → git-upload-pack (keeper-free, tests pass); be:/keeper: → exec keeper upload-pack (local) or ssh host keeper ….
build/bin ships no keeper; build-debug/bin/keeper is ABI-stale vs current
jab (abc._ulog_open is not a function). So get/be + get/cached SKIP.
push/fetch). A LOCAL file:// submodule mount must NOT reach keeper at all — it should reuse the on-disk source store + make a (store-backed) worktree; that submount local-reuse gap (the sub/* + spot/submount TEST-003 failures) is its OWN fix, tracked separately, NOT this JS-serve feature.
serveReader (store
open), markReachable (object closure), buildPushPack (pack build), plus pkt.js framing and GIT-013/014's report-status/pack logic.
jab upload-pack <store> and jab receive-pack <store>
(or one jab serve) — speaking the keeper wire protocol over stdin/stdout, so be: local-exec and ssh host jab upload-pack … both work jab-to-jab.
be: dispatch execs the JS server via the EXISTING KEEPER_BIN override;get/be + get/cached (and be-store push/fetch) pass with NO native keeper.
wire.js): v0/v1 refs
advertisement, want/have negotiation, NAK\n, RAW pack after (keeper advertises NO side-band-64k, so no demux). Reuse pkt.js, not hand-rolled framing.
No pack-log logic in the verb (the format core stays shared, per GIT topic).
read the client's wants/haves, flood the closure via markReachable(wants) − haves, build the pack with buildPushPack, stream it after NAK.
GIT-013/014 client push path in reverse), emit report-status.
jab upload-pack/receive-pack invocation (what ssh/localexec spawns); the CLI must NOT emit its normal banners on these (raw wire only).
jab upload-pack <store> serve loop (advertise → negotiate → pack) over stdio. — landed 261680bf: shared/serve.js uploadPack (reuses serveReader/buildPushPack/pkt), raw-wire CLI intercept in core/loop.js ~229.jab receive-pack <store> serve loop (commands → pack ingest → report-status). — NOT built: serve.js exports uploadPack only, loop.js intercepts only upload-pack; a be:// PUSH still needs the native keeper.261680bf via the existing KEEPER_BIN=jab override (proven jab-to-jab in test/serve/uploadpack); no jab serve alias, classify() default stays keeper.test/get/be/run.sh still SKIPs on command -v keeper, test/get/cached still clones over ssh-keeper; only the new test/serve/uploadpack runs jab-to-jab (fetch side, local-exec).classify()'s ssh arm still hardcodes keeper <verb> for be://host (wire.js ~85) — an ssh host jab upload-pack form (or KEEPER_BIN-honouring remote cmd) is needed before the native daemon retires.
RAW-pack contract, and v0/v1 advert must match wire.js exactly or fetch hangs.
handles the local/ingest tests NOW; this ticket is option-2 — the JS keeper that lets the be:// WIRE itself be tested jab-to-jab, retiring the native daemon.
261680bf ("js upload-pack, also fix bro tests"): the FETCH serve
side only — shared/serve.js uploadPack + the jab upload-pack raw-wire CLI entry + test/serve/uploadpack (be: local-exec fetch jab-to-jab via KEEPER_BIN=jab, incl. a want+have thin-serve drive). Remaining: receive-pack serve, the get/be + get/cached test flips, and an ssh-remote jab spawn form (see TODOs).