SPB Git

spb/autoscholar

Public

pdfjs-dist 6.4 (advisory GHSA-hq66-cqwq-w95j), founder guide, launch report draft

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Simon-Pierre Boucher committed (Oct 30, 2026) parent c27002b Browse files

5 changed files +133 −56

added docs/FOUNDER_GUIDE.md +38 −0
@@ -0,0 +1,38 @@
1 +# Founder guide — operating AutoScholar.ai
2 +
3 +One person operates the foundry. Everything happens in the admin console at `https://autoscholar.ai/admin` (LAN fallback: `http://<M3U96b LAN IP>:8470/admin`).
4 +
5 +## 1. First sign-in
6 +- Username `admin`, bootstrap password `admin123` — valid **only until the first sign-in**. You are forced to choose a strong password (≥ 12 chars, three character classes, not the bootstrap one, never reused). All other sessions are revoked. The rotation was already performed on 2026-10-30; the current password is in the operator's secrets folder.
7 +- Sessions last 12 h (2 h idle). Five failed logins lock the account (1 min, doubling up to 1 h). All events are in *Settings & security → Audit log*.
8 +
9 +## 2. Write a research brief
10 +Start from *Templates* (general, empirical, theoretical, computational, review) — "Use this template" prefills *New research*. Follow `docs/RESEARCH_INSTRUCTIONS_GUIDE.md`: one precise question, mode, verified-source rules, data/proof foundations, pre-registered procedure, robustness, acceptance criteria. Briefs that target the platform (sudo, SSH, credentials, "ignore the rules") are rejected at upload; briefs that require regulated activities fail at preflight with the reason shown in the run timeline.
11 +
12 +## 3. Launch
13 +*New research* → upload `.md`/`.txt` or paste → **Validate & freeze** (exact bytes + SHA-256 stored as an immutable version; warnings list missing sections) → choose discipline, mode, secondary modes, compute profile, budget cap (USD), runtime cap (minutes), attempts, auto-publish → **Launch on MacLustr**. The button carries an idempotency key: refreshing or double-clicking cannot create a second run. You get a run ID immediately; close the browser whenever you like.
14 +
15 +## 4. Monitor
16 +*Runs → run*: live timeline (reconnects automatically), stage progress (preflight → framing → literature → design → execute → robustness → manuscript → review → reproduction → quality → publication), cost vs cap, attempts, policy denials, artifacts (download any file). *MacLustr*: worker health, heartbeat age, sandbox status, running jobs; **drain** a worker before maintenance, **quarantine** a misbehaving one. *Cancel* stops a run cooperatively (its logs and frozen input stay); *Retry* grants one more attempt resuming from the last checkpoint.
17 +
18 +## 5. Review quality
19 +*Quality → run*: every deterministic gate with evidence (hard gates block publication; soft gates warn), the automated referee's findings and resolution states, the rubric scores and the publication decision. Hard scientific blockers (unverified citations, untraceable numbers, missing PDF, synthetic data, secrets, simulated worker) **cannot be overridden**. Other failures can be overridden with a written rationale, which moves the run to *awaiting approval*.
20 +
21 +## 6. Publish, correct, retract
22 +- Auto-publish: when enabled on the run and permitted for the mode/discipline, a run that passes all hard gates is published by the scheduler within seconds — public page `/research/<slug>`, PDF, LaTeX source, code/data when present, citations, provenance.
23 +- Manual: *Publications → Publish* for runs awaiting approval; "publish as correction of …" creates version n+1 of an existing paper (history preserved).
24 +- *Retract* writes a permanent notice; *Withdraw artifacts* stops file delivery (HTTP 410) while keeping the notice and the private audit copy; *Edit metadata* records a versioned change.
25 +
26 +## 7. Emergency controls (*Settings & security*)
27 +- **Pause dispatch** — no new research starts; running jobs continue.
28 +- **Halt publishing** (global or per mode) — passing runs wait in *awaiting approval*.
29 +- Worker drain/quarantine; provider availability; env-level switches `DISPATCH_ENABLED=0` / `PUBLISHING_ENABLED=0` (restart required).
30 +
31 +## 8. Costs
32 +Each run's budget cap is enforced per stage by the Agent SDK and across stages by the runner; the scheduler enforces the runtime cap. Spend shown is the SDK's client-side estimate (not the invoice). Typical small study: USD 5–25.
33 +
34 +## 9. When something fails
35 +- Preflight `INFEASIBLE` → the brief needs changes (see reason). No retry is attempted.
36 +- `quality_failed` → open *Quality*, read the hard failures, retry (a new attempt revises from the checkpoint) or fix the brief and relaunch.
37 +- Worker offline → queued runs wait; running runs resume on the next heartbeat window from their last checkpoint.
38 +- Operations, backups and restore: `docs/OPERATIONS.md`.
added docs/LAUNCH_REPORT.md +39 −0
@@ -0,0 +1,39 @@
1 +# Launch report — AutoScholar.ai (draft, 2026-10-30)
2 +
3 +This report separates what was **verified on real infrastructure** from what is **blocked** or **untested**. It is finalised after the milestone runs complete (see the "Live research runs" section of docs/TEST_REPORT.md).
4 +
5 +## URLs and services
6 +
7 +| Item | Value | State |
8 +|---|---|---|
9 +| Public site | https://autoscholar.ai | **blocked by DNS** — the GoDaddy zone has no A record for the apex (see below); the tunnel route and Caddy configuration are in place and will serve as soon as `A @ → 51.161.112.61` exists |
10 +| LAN access (operator) | http://192.168.2.85:8470 (M3U96b) | serving (public pages, admin, APIs) |
11 +| Admin console | `/admin` | serving; bootstrap password rotated 2026-10-30 |
12 +| Control plane processes | pm2 `autoscholar`, `autoscholar-scheduler`, `autoscholar-backup` on M3U96b | online |
13 +| Research worker | M4M64c, LaunchDaemon `io.autoscholar.worker`, user `asworker` | online, enrolled, sandbox available |
14 +| Database | PostgreSQL 17 `autoscholar` on M3U96b | migrated (42 tables), nightly dump + offsite copy on M3U96a |
15 +| Artifact store | `M3U96b:~/apps/autoscholar-data/artifacts` | private `runs/`, public `public/` |
16 +| Source of truth | `M3U96b:~/apps/autoscholar` (git, origin spbgit `autoscholar.git`) | adopted by mld |
17 +
18 +## Verified end to end (real infrastructure)
19 +- Admin sign-in with `admin123` → forced rotation → `admin123` rejected (production, 2026-10-30).
20 +- Upload of a research `CLAUDE.md` → immutable version with SHA-256 → idempotent launch (second identical launch returned the same run, HTTP 200).
21 +- A real MacLustr worker (M4M64c, dedicated low-privilege user) leased the job, created an isolated workspace, loaded the frozen `CLAUDE.md` as project instructions (passphrase self-test), ran Claude Agent SDK sessions per stage, streamed structured events to the admin timeline, uploaded hashed artifacts, and verified real references through Crossref during the literature stage.
22 +- Enforcement: writes outside the workspace, LAN access and non-research tools were denied by the platform hook and the Seatbelt sandbox even when the instructions requested them (self-test transcript in TEST_REPORT.md).
23 +- Crash recovery: an HTTP 500 in the control plane during attempt 1 made the worker report a failed attempt; the scheduler re-queued the run and the worker resumed from the preflight checkpoint on attempt 2 with a new fencing token. The 500 (write-once artifact collision) was fixed and redeployed with a ~5 s gap.
24 +- Invalid brief (clinical trial on patients, fabricated data, skipped review): preflight judged it infeasible; the run ended `failed` after USD 0.13 and never appeared publicly.
25 +- Backup and isolated restore test executed; digests verified.
26 +
27 +## Blocked / needs the founder
28 +1. **DNS**: restore `A autoscholar.ai → 51.161.112.61` at GoDaddy (the record present at discovery disappeared the same day; serial 2026103001). Optional: `A www → 51.161.112.61` then `mlt redirect www.autoscholar.ai autoscholar.ai` (or the reverse).
29 +2. Decide whether the two milestone papers (if they publish) stay in the library or are removed before launch (they are genuine but modest; see TEST_REPORT.md).
30 +
31 +## Not done / limitations
32 +- No MFA (schema ready). No mTLS (LAN tokens). No Linux containers on MacLustr (Seatbelt + user isolation instead).
33 +- Provider spend is the SDK client-side estimate.
34 +- Only one worker (M4M64c) is enrolled; onboarding another node takes one installer run (docs/OPERATIONS.md).
35 +
36 +## Next priorities
37 +1. DNS fix → public HTTPS smoke test (`curl -I https://autoscholar.ai`, admin login over HTTPS, PDF download).
38 +2. Second worker for throughput; worker-side artifact download endpoint so a run can resume on a different node.
39 +3. MFA (TOTP) for the admin account; alerting hook (e.g., e-mail/Slack) on `failed`/`quality_failed`.
modified pnpm-lock.yaml +53 −53
@@ -238,8 +238,8 @@ importers:
238 238 specifier: ^1.17.1
239 239 version: 1.17.1
240 240 pdfjs-dist:
241 − specifier: ^5.4.0
242 − version: 5.7.284
241 + specifier: ^6.2.108
242 + version: 6.4.299
243 243 zod:
244 244 specifier: ^4.1.0
245 245 version: 4.6.7
@@ -1150,79 +1150,79 @@ packages:
1150 1150 '@cfworker/json-schema':
1151 1151 optional: true
1152 1152
1153 − '@napi-rs/canvas-android-arm64@0.1.100':
1154 − resolution: {integrity: sha512-hjhCKhntPv9+t4ckHymdx0phYNcVW+GKQR6Lzw2zE+pOVjOplSmtx9nNNknTjbEDLcuLZqA1y8ufKg1XfgftzQ==}
1153 + '@napi-rs/canvas-android-arm64@1.0.13':
1154 + resolution: {integrity: sha512-trn7AaDzQ+yeeA0ezhkC7cB1ZDPtp4UYk0EvB5F8qtYL9jEVWtVrU30WOpI52DszoTxaTsCgf5PP4ZVaOlOIHQ==}
1155 1155 engines: {node: '>= 10'}
1156 1156 cpu: [arm64]
1157 1157 os: [android]
1158 1158
1159 − '@napi-rs/canvas-darwin-arm64@0.1.100':
1160 − resolution: {integrity: sha512-2PcswRaC7Ly645DGt88///zuFDhJxJYdKAs1uU3mfk1atYkXufgcgLfBpk6Tm12nCQBaNt1wpybuPZ4qOhTo8A==}
1159 + '@napi-rs/canvas-darwin-arm64@1.0.13':
1160 + resolution: {integrity: sha512-6Y2djEetL8copxfNK6hg7oig/xqTwOchv19hBOm+zBNdKc/02Z3kjZN5wrLzv/l5O04/bAQS6I/AlQpwBlXgPg==}
1161 1161 engines: {node: '>= 10'}
1162 1162 cpu: [arm64]
1163 1163 os: [darwin]
1164 1164
1165 − '@napi-rs/canvas-darwin-x64@0.1.100':
1166 − resolution: {integrity: sha512-ePNZtj7pNIva/siZMg+HmbeozkIjqUIYdoymH8HaA3qK7LfzFN4WMBM8G6HQ9ZC+H3+Dnn5pqtiXpgLykaPOhw==}
1165 + '@napi-rs/canvas-darwin-x64@1.0.13':
1166 + resolution: {integrity: sha512-OZoPwwu4TMMg8GTCFBrg8UFExwQTU/55i3uTC/izDat6PHE+ro9dimyQoOboFf91+NY7Pnn70ScR8f8I8+eZXw==}
1167 1167 engines: {node: '>= 10'}
1168 1168 cpu: [x64]
1169 1169 os: [darwin]
1170 1170
1171 − '@napi-rs/canvas-linux-arm-gnueabihf@0.1.100':
1172 − resolution: {integrity: sha512-d5cDB48oWFGU8/XPhUOFAlySgb/VAu7D+s8fi55K1Pcfg8aPplHWqMgibhVLU8ky7Pyg/fuiVLz4Nf3JrSTuUA==}
1171 + '@napi-rs/canvas-linux-arm-gnueabihf@1.0.13':
1172 + resolution: {integrity: sha512-dZSYaKROuswU2eUWG5aBKndNVe68elo1YX93xtRax7q658tj8rYE+HwduovWJgs6qwv1r1/CLR60nDeBbyjvyg==}
1173 1173 engines: {node: '>= 10'}
1174 1174 cpu: [arm]
1175 1175 os: [linux]
1176 1176
1177 − '@napi-rs/canvas-linux-arm64-gnu@0.1.100':
1178 − resolution: {integrity: sha512-rDxgxRu69RvDlX/bh9o22DxLsGr8EqsNgotL9+RwQE1S0b0cqeatqsw6aW45mukm0B42DIAaAacKaYQ8cqS1nw==}
1177 + '@napi-rs/canvas-linux-arm64-gnu@1.0.13':
1178 + resolution: {integrity: sha512-W6FzYE8ADHI93In1vi80KBL6btDtAMuj50Ch5ptkWS8xuntyzbR4h5JDUmXoakxZn2yMInksudTEqVSWoFqFGg==}
1179 1179 engines: {node: '>= 10'}
1180 1180 cpu: [arm64]
1181 1181 os: [linux]
1182 1182 libc: [glibc]
1183 1183
1184 − '@napi-rs/canvas-linux-arm64-musl@0.1.100':
1185 − resolution: {integrity: sha512-K3mDW66N+xT2/V439u1alFANiBUjdEx2gLiNYnCmUsva5jZMxWTjafBYwTzYK+EMFMHrUoabuU+T1BIP5CgbYQ==}
1184 + '@napi-rs/canvas-linux-arm64-musl@1.0.13':
1185 + resolution: {integrity: sha512-+6fQ+rR49hkAa4voh2stLIwQ+4t+gmoseM8Bc53/DlMXb73IKymDPWK9A/NtWeqTW4ijWppYuyuxS2hPI8tzNA==}
1186 1186 engines: {node: '>= 10'}
1187 1187 cpu: [arm64]
1188 1188 os: [linux]
1189 1189 libc: [musl]
1190 1190
1191 − '@napi-rs/canvas-linux-riscv64-gnu@0.1.100':
1192 − resolution: {integrity: sha512-mooqUBTIsccZpnoQC4NgrC1v6C1vof39etLNMnBwCY+p0gajWJvAHLGQ6g/gGyS5YrpDW+GefSN4+Cvcr08UWw==}
1191 + '@napi-rs/canvas-linux-riscv64-gnu@1.0.13':
1192 + resolution: {integrity: sha512-17XEMO3t9RW/TtHtSFf2AkaSWuCWdzbPeidz7zrOFawHxoLSJCnpTI1hN5aUvrZNnkNNmt/vZVJCh0ryUaik3A==}
1193 1193 engines: {node: '>= 10'}
1194 1194 cpu: [riscv64]
1195 1195 os: [linux]
1196 1196 libc: [glibc]
1197 1197
1198 − '@napi-rs/canvas-linux-x64-gnu@0.1.100':
1199 − resolution: {integrity: sha512-1eCvkDCazm7FFhsT7DfGOdSaHgZVK3bt/dSBl5EWHOWmnz+I7j8tPseJqqD81NF+MH21jKUK4wQSDjN0mdhnTg==}
1198 + '@napi-rs/canvas-linux-x64-gnu@1.0.13':
1199 + resolution: {integrity: sha512-lc48IwknVHBsNzXn9Xs5OkUsRX38Ml3Z1aOybQ51mMEzZckm8+4A0qROlyYHEoBPzr1kL3IU8ZUAqDb7wtdX8w==}
1200 1200 engines: {node: '>= 10'}
1201 1201 cpu: [x64]
1202 1202 os: [linux]
1203 1203 libc: [glibc]
1204 1204
1205 − '@napi-rs/canvas-linux-x64-musl@0.1.100':
1206 − resolution: {integrity: sha512-20arT6lnI19S68qNlii73TSEDbECNgzMz2EpldC1V3mZFuRkeujXkcebRk0LRJe9SEUAooYiLokfMViY8IX7yA==}
1205 + '@napi-rs/canvas-linux-x64-musl@1.0.13':
1206 + resolution: {integrity: sha512-bGY1r26S2bs8UNFJcPWcCSNdCFbKep5PATsvtgtC9A5u6SRgr2/jJE/RlhHL5m9ZpixNDhVkLY/5h16Kx5V9YA==}
1207 1207 engines: {node: '>= 10'}
1208 1208 cpu: [x64]
1209 1209 os: [linux]
1210 1210 libc: [musl]
1211 1211
1212 − '@napi-rs/canvas-win32-arm64-msvc@0.1.100':
1213 − resolution: {integrity: sha512-DZFFT1wIAg37LJw37yhMRFfjATd3vTQzjZ1Yki8u2vhO6Hi5VE6BVaGQ1aaDu7xb4iMErz+9EOwjpS7xcxFeBw==}
1212 + '@napi-rs/canvas-win32-arm64-msvc@1.0.13':
1213 + resolution: {integrity: sha512-2vRPBZoaIvJrUkDhZTE2Hn0YrnpJRCWVM3EJACoBKjuWI6WgPxGtUoRMsxRviCsyks8bKTSFdyw14CellnG2qA==}
1214 1214 engines: {node: '>= 10'}
1215 1215 cpu: [arm64]
1216 1216 os: [win32]
1217 1217
1218 − '@napi-rs/canvas-win32-x64-msvc@0.1.100':
1219 − resolution: {integrity: sha512-MyT1j3mHC2+Lu4pBi9mKyMJhtP6U7k7EldY7sj/uS5gJA65gTXt8MefJQXLJo5d/vZbuWmfxzkEUNc/urV3pHA==}
1218 + '@napi-rs/canvas-win32-x64-msvc@1.0.13':
1219 + resolution: {integrity: sha512-DUlW3lZPz63kYsf8mxgyyZuevhlH0T3/BGP9l+NazhB0F1+gL6D4hqZdnhZpw24DlWmTpATDcyYSZlJOi+DdfQ==}
1220 1220 engines: {node: '>= 10'}
1221 1221 cpu: [x64]
1222 1222 os: [win32]
1223 1223
1224 − '@napi-rs/canvas@0.1.100':
1225 − resolution: {integrity: sha512-xglYA6q3XO5P3BNJYxVZ1IV7DLVjp1Py6nwag88YntrS+3vKHyYcMqXVS4ZztJmwz2uGvz1FWhI/4LgbR5uQDA==}
1224 + '@napi-rs/canvas@1.0.13':
1225 + resolution: {integrity: sha512-b87ugZpQ5ViwqVBkjervxpwa0GmJPsKHLBNoZN6GpjWeHzTbDUGryriq+2DYW2XbB+xCqSIINQysC0/I87nPbw==}
1226 1226 engines: {node: '>= 10'}
1227 1227
1228 1228 '@next/env@16.4.3':
@@ -2333,8 +2333,8 @@ packages:
2333 2333 pdf-lib@1.17.1:
2334 2334 resolution: {integrity: sha512-V/mpyJAoTsN4cnP31vc0wfNA1+p20evqqnap0KLoRUN0Yk/p3wN52DOEsL4oBFcLdb76hlpKPtzJIgo67j/XLw==}
2335 2335
2336 − pdfjs-dist@5.7.284:
2337 − resolution: {integrity: sha512-h4EdYQczmGhbOlqc3PPZwxevn7ApdWPbovAuWXOB/DjIyigSnwfy2oze7c6mRcSr9XgLp3eN3EeL4DyySTPMFw==}
2336 + pdfjs-dist@6.4.299:
2337 + resolution: {integrity: sha512-AVl138zALtfaAPvADulE0PZThbYzCBS79nL4pOSL/6Sm/4AH5A21BD9VHt97OlCuzJuCpmeZtAtkinisF4Vb1g==}
2338 2338 engines: {node: '>=22.13.0 || >=24'}
2339 2339
2340 2340 pg-cloudflare@1.4.1:
@@ -3251,52 +3251,52 @@ snapshots:
3251 3251 transitivePeerDependencies:
3252 3252 - supports-color
3253 3253
3254 − '@napi-rs/canvas-android-arm64@0.1.100':
3254 + '@napi-rs/canvas-android-arm64@1.0.13':
3255 3255 optional: true
3256 3256
3257 − '@napi-rs/canvas-darwin-arm64@0.1.100':
3257 + '@napi-rs/canvas-darwin-arm64@1.0.13':
3258 3258 optional: true
3259 3259
3260 − '@napi-rs/canvas-darwin-x64@0.1.100':
3260 + '@napi-rs/canvas-darwin-x64@1.0.13':
3261 3261 optional: true
3262 3262
3263 − '@napi-rs/canvas-linux-arm-gnueabihf@0.1.100':
3263 + '@napi-rs/canvas-linux-arm-gnueabihf@1.0.13':
3264 3264 optional: true
3265 3265
3266 − '@napi-rs/canvas-linux-arm64-gnu@0.1.100':
3266 + '@napi-rs/canvas-linux-arm64-gnu@1.0.13':
3267 3267 optional: true
3268 3268
3269 − '@napi-rs/canvas-linux-arm64-musl@0.1.100':
3269 + '@napi-rs/canvas-linux-arm64-musl@1.0.13':
3270 3270 optional: true
3271 3271
3272 − '@napi-rs/canvas-linux-riscv64-gnu@0.1.100':
3272 + '@napi-rs/canvas-linux-riscv64-gnu@1.0.13':
3273 3273 optional: true
3274 3274
3275 − '@napi-rs/canvas-linux-x64-gnu@0.1.100':
3275 + '@napi-rs/canvas-linux-x64-gnu@1.0.13':
3276 3276 optional: true
3277 3277
3278 − '@napi-rs/canvas-linux-x64-musl@0.1.100':
3278 + '@napi-rs/canvas-linux-x64-musl@1.0.13':
3279 3279 optional: true
3280 3280
3281 − '@napi-rs/canvas-win32-arm64-msvc@0.1.100':
3281 + '@napi-rs/canvas-win32-arm64-msvc@1.0.13':
3282 3282 optional: true
3283 3283
3284 − '@napi-rs/canvas-win32-x64-msvc@0.1.100':
3284 + '@napi-rs/canvas-win32-x64-msvc@1.0.13':
3285 3285 optional: true
3286 3286
3287 − '@napi-rs/canvas@0.1.100':
3287 + '@napi-rs/canvas@1.0.13':
3288 3288 optionalDependencies:
3289 − '@napi-rs/canvas-android-arm64': 0.1.100
3290 − '@napi-rs/canvas-darwin-arm64': 0.1.100
3291 − '@napi-rs/canvas-darwin-x64': 0.1.100
3292 − '@napi-rs/canvas-linux-arm-gnueabihf': 0.1.100
3293 − '@napi-rs/canvas-linux-arm64-gnu': 0.1.100
3294 − '@napi-rs/canvas-linux-arm64-musl': 0.1.100
3295 − '@napi-rs/canvas-linux-riscv64-gnu': 0.1.100
3296 − '@napi-rs/canvas-linux-x64-gnu': 0.1.100
3297 − '@napi-rs/canvas-linux-x64-musl': 0.1.100
3298 − '@napi-rs/canvas-win32-arm64-msvc': 0.1.100
3299 − '@napi-rs/canvas-win32-x64-msvc': 0.1.100
3289 + '@napi-rs/canvas-android-arm64': 1.0.13
3290 + '@napi-rs/canvas-darwin-arm64': 1.0.13
3291 + '@napi-rs/canvas-darwin-x64': 1.0.13
3292 + '@napi-rs/canvas-linux-arm-gnueabihf': 1.0.13
3293 + '@napi-rs/canvas-linux-arm64-gnu': 1.0.13
3294 + '@napi-rs/canvas-linux-arm64-musl': 1.0.13
3295 + '@napi-rs/canvas-linux-riscv64-gnu': 1.0.13
3296 + '@napi-rs/canvas-linux-x64-gnu': 1.0.13
3297 + '@napi-rs/canvas-linux-x64-musl': 1.0.13
3298 + '@napi-rs/canvas-win32-arm64-msvc': 1.0.13
3299 + '@napi-rs/canvas-win32-x64-msvc': 1.0.13
3300 3300 optional: true
3301 3301
3302 3302 '@next/env@16.4.3': {}
@@ -4185,9 +4185,9 @@ snapshots:
4185 4185 pako: 1.0.11
4186 4186 tslib: 1.14.1
4187 4187
4188 − pdfjs-dist@5.7.284:
4188 + pdfjs-dist@6.4.299:
4189 4189 optionalDependencies:
4190 − '@napi-rs/canvas': 0.1.100
4190 + '@napi-rs/canvas': 1.0.13
4191 4191
4192 4192 pg-cloudflare@1.4.1:
4193 4193 optional: true
modified services/qa/package.json +2 −2
@@ -23,7 +23,7 @@
23 23 "@autoscholar/storage": "workspace:*",
24 24 "drizzle-orm": "^0.45.0",
25 25 "pdf-lib": "^1.17.1",
26 − "pdfjs-dist": "^5.4.0",
26 + "pdfjs-dist": "^6.2.108",
27 27 "zod": "^4.1.0"
28 28 }
29 −}
29 +}
\ No newline at end of file
modified services/qa/src/pdf.ts +1 −1
@@ -73,7 +73,7 @@ export async function inspectPdf(buf: Buffer): Promise<PdfInspection> {
73 73 parts.push(content.items.map((it) => ("str" in it ? it.str : "")).join(" "));
74 74 }
75 75 text = parts.join("\n");
76 − await pdf.destroy();
76 + await task.destroy();
77 77 } catch (e) {
78 78 errors.push(`pdfjs text extraction failed: ${(e as Error).message}`);
79 79 }
80 80
Menu

Theme