cli: sift extract uploads a local PDF; README and skill

`sift extract <file.pdf>` stats the file (refusing over 100 MiB before the
upload), streams it as the POST body with Content-Type application/pdf and the
ContentLength set, and prints the /v1/extract answer exactly as `sift fetch`
prints a PDF URL — same content output, same errors and exitFor codes.
parseExtractOpts reuses splitAroundPositional; extractURL sends only the set
options with mode=digest when a question is given. main.go gains the case and a
help line; README and skill document the command.

Co-Authored-By: ornith-1.5-35b-a3b <ornith-1.5-35b-a3b@llama.cpp.invalid>
This commit is contained in:
2026-09-26 19:52:09 -07:00
co-authored by ornith-1.5-35b-a3b
parent 7c40531891
commit 3a3a470cd7
6 changed files with 218 additions and 3 deletions
+7 -3
View File
@@ -33,14 +33,18 @@ with `blocked: …`.
sift serve [-listen addr] [-config /etc/sift/config.toml] [-keys /var/lib/sift/keys.toml] [-deny-prefix CIDR]...
sift fetch <url> [--question q] [--mode clean|raw|digest] [--jq filter] [--pages a-b] [--grep re]
[--no-context] [--recover] [--json]
sift extract <file.pdf> [--pages a-b] [--grep re] [--question q] [--mode clean|digest] [--json]
sift search "<query>" [--k n] [--json]
sift keys add --caller name [--workspace ws] [--out file] | list | revoke --caller name
sift version
```
`sift fetch` and `sift search` are clients: they read `url` and `key_file` from `client.toml`
(`$SIFT_CLIENT`, else `$HERMES_HOME/sift/client.toml`, else `~/.config/sift/client.toml`); the key
file must be mode 0600. The agent-facing guide is [`skill/SKILL.md`](skill/SKILL.md).
`sift fetch`, `sift extract` and `sift search` are clients: they read `url` and `key_file` from
`client.toml` (`$SIFT_CLIENT`, else `$HERMES_HOME/sift/client.toml`, else `~/.config/sift/client.toml`);
the key file must be mode 0600. `sift extract` uploads a local PDF to `/v1/extract` and prints the
answer exactly as `sift fetch` does for a PDF URL — `--pages`, `--grep` and `--question` behave the
same, and a file over 100 MiB is refused before the upload. The agent-facing guide is
[`skill/SKILL.md`](skill/SKILL.md).
## Configuration