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 specifier: ^1.17.1 238 specifier: ^1.17.1
239 version: 1.17.1 239 version: 1.17.1
240 pdfjs-dist: 240 pdfjs-dist:
241− specifier: ^5.4.0 241+ specifier: ^6.2.108
242− version: 5.7.284 242+ version: 6.4.299
243 zod: 243 zod:
244 specifier: ^4.1.0 244 specifier: ^4.1.0
245 version: 4.6.7 245 version: 4.6.7
@@ -1150,79 +1150,79 @@ packages:
1150 '@cfworker/json-schema': 1150 '@cfworker/json-schema':
1151 optional: true 1151 optional: true
1152 1152
1153− '@napi-rs/canvas-android-arm64@0.1.100': 1153+ '@napi-rs/canvas-android-arm64@1.0.13':
1154− resolution: {integrity: sha512-hjhCKhntPv9+t4ckHymdx0phYNcVW+GKQR6Lzw2zE+pOVjOplSmtx9nNNknTjbEDLcuLZqA1y8ufKg1XfgftzQ==} 1154+ resolution: {integrity: sha512-trn7AaDzQ+yeeA0ezhkC7cB1ZDPtp4UYk0EvB5F8qtYL9jEVWtVrU30WOpI52DszoTxaTsCgf5PP4ZVaOlOIHQ==}
1155 engines: {node: '>= 10'} 1155 engines: {node: '>= 10'}
1156 cpu: [arm64] 1156 cpu: [arm64]
1157 os: [android] 1157 os: [android]
1158 1158
1159− '@napi-rs/canvas-darwin-arm64@0.1.100': 1159+ '@napi-rs/canvas-darwin-arm64@1.0.13':
1160− resolution: {integrity: sha512-2PcswRaC7Ly645DGt88///zuFDhJxJYdKAs1uU3mfk1atYkXufgcgLfBpk6Tm12nCQBaNt1wpybuPZ4qOhTo8A==} 1160+ resolution: {integrity: sha512-6Y2djEetL8copxfNK6hg7oig/xqTwOchv19hBOm+zBNdKc/02Z3kjZN5wrLzv/l5O04/bAQS6I/AlQpwBlXgPg==}
1161 engines: {node: '>= 10'} 1161 engines: {node: '>= 10'}
1162 cpu: [arm64] 1162 cpu: [arm64]
1163 os: [darwin] 1163 os: [darwin]
1164 1164
1165− '@napi-rs/canvas-darwin-x64@0.1.100': 1165+ '@napi-rs/canvas-darwin-x64@1.0.13':
1166− resolution: {integrity: sha512-ePNZtj7pNIva/siZMg+HmbeozkIjqUIYdoymH8HaA3qK7LfzFN4WMBM8G6HQ9ZC+H3+Dnn5pqtiXpgLykaPOhw==} 1166+ resolution: {integrity: sha512-OZoPwwu4TMMg8GTCFBrg8UFExwQTU/55i3uTC/izDat6PHE+ro9dimyQoOboFf91+NY7Pnn70ScR8f8I8+eZXw==}
1167 engines: {node: '>= 10'} 1167 engines: {node: '>= 10'}
1168 cpu: [x64] 1168 cpu: [x64]
1169 os: [darwin] 1169 os: [darwin]
1170 1170
1171− '@napi-rs/canvas-linux-arm-gnueabihf@0.1.100': 1171+ '@napi-rs/canvas-linux-arm-gnueabihf@1.0.13':
1172− resolution: {integrity: sha512-d5cDB48oWFGU8/XPhUOFAlySgb/VAu7D+s8fi55K1Pcfg8aPplHWqMgibhVLU8ky7Pyg/fuiVLz4Nf3JrSTuUA==} 1172+ resolution: {integrity: sha512-dZSYaKROuswU2eUWG5aBKndNVe68elo1YX93xtRax7q658tj8rYE+HwduovWJgs6qwv1r1/CLR60nDeBbyjvyg==}
1173 engines: {node: '>= 10'} 1173 engines: {node: '>= 10'}
1174 cpu: [arm] 1174 cpu: [arm]
1175 os: [linux] 1175 os: [linux]
1176 1176
1177− '@napi-rs/canvas-linux-arm64-gnu@0.1.100': 1177+ '@napi-rs/canvas-linux-arm64-gnu@1.0.13':
1178− resolution: {integrity: sha512-rDxgxRu69RvDlX/bh9o22DxLsGr8EqsNgotL9+RwQE1S0b0cqeatqsw6aW45mukm0B42DIAaAacKaYQ8cqS1nw==} 1178+ resolution: {integrity: sha512-W6FzYE8ADHI93In1vi80KBL6btDtAMuj50Ch5ptkWS8xuntyzbR4h5JDUmXoakxZn2yMInksudTEqVSWoFqFGg==}
1179 engines: {node: '>= 10'} 1179 engines: {node: '>= 10'}
1180 cpu: [arm64] 1180 cpu: [arm64]
1181 os: [linux] 1181 os: [linux]
1182 libc: [glibc] 1182 libc: [glibc]
1183 1183
1184− '@napi-rs/canvas-linux-arm64-musl@0.1.100': 1184+ '@napi-rs/canvas-linux-arm64-musl@1.0.13':
1185− resolution: {integrity: sha512-K3mDW66N+xT2/V439u1alFANiBUjdEx2gLiNYnCmUsva5jZMxWTjafBYwTzYK+EMFMHrUoabuU+T1BIP5CgbYQ==} 1185+ resolution: {integrity: sha512-+6fQ+rR49hkAa4voh2stLIwQ+4t+gmoseM8Bc53/DlMXb73IKymDPWK9A/NtWeqTW4ijWppYuyuxS2hPI8tzNA==}
1186 engines: {node: '>= 10'} 1186 engines: {node: '>= 10'}
1187 cpu: [arm64] 1187 cpu: [arm64]
1188 os: [linux] 1188 os: [linux]
1189 libc: [musl] 1189 libc: [musl]
1190 1190
1191− '@napi-rs/canvas-linux-riscv64-gnu@0.1.100': 1191+ '@napi-rs/canvas-linux-riscv64-gnu@1.0.13':
1192− resolution: {integrity: sha512-mooqUBTIsccZpnoQC4NgrC1v6C1vof39etLNMnBwCY+p0gajWJvAHLGQ6g/gGyS5YrpDW+GefSN4+Cvcr08UWw==} 1192+ resolution: {integrity: sha512-17XEMO3t9RW/TtHtSFf2AkaSWuCWdzbPeidz7zrOFawHxoLSJCnpTI1hN5aUvrZNnkNNmt/vZVJCh0ryUaik3A==}
1193 engines: {node: '>= 10'} 1193 engines: {node: '>= 10'}
1194 cpu: [riscv64] 1194 cpu: [riscv64]
1195 os: [linux] 1195 os: [linux]
1196 libc: [glibc] 1196 libc: [glibc]
1197 1197
1198− '@napi-rs/canvas-linux-x64-gnu@0.1.100': 1198+ '@napi-rs/canvas-linux-x64-gnu@1.0.13':
1199− resolution: {integrity: sha512-1eCvkDCazm7FFhsT7DfGOdSaHgZVK3bt/dSBl5EWHOWmnz+I7j8tPseJqqD81NF+MH21jKUK4wQSDjN0mdhnTg==} 1199+ resolution: {integrity: sha512-lc48IwknVHBsNzXn9Xs5OkUsRX38Ml3Z1aOybQ51mMEzZckm8+4A0qROlyYHEoBPzr1kL3IU8ZUAqDb7wtdX8w==}
1200 engines: {node: '>= 10'} 1200 engines: {node: '>= 10'}
1201 cpu: [x64] 1201 cpu: [x64]
1202 os: [linux] 1202 os: [linux]
1203 libc: [glibc] 1203 libc: [glibc]
1204 1204
1205− '@napi-rs/canvas-linux-x64-musl@0.1.100': 1205+ '@napi-rs/canvas-linux-x64-musl@1.0.13':
1206− resolution: {integrity: sha512-20arT6lnI19S68qNlii73TSEDbECNgzMz2EpldC1V3mZFuRkeujXkcebRk0LRJe9SEUAooYiLokfMViY8IX7yA==} 1206+ resolution: {integrity: sha512-bGY1r26S2bs8UNFJcPWcCSNdCFbKep5PATsvtgtC9A5u6SRgr2/jJE/RlhHL5m9ZpixNDhVkLY/5h16Kx5V9YA==}
1207 engines: {node: '>= 10'} 1207 engines: {node: '>= 10'}
1208 cpu: [x64] 1208 cpu: [x64]
1209 os: [linux] 1209 os: [linux]
1210 libc: [musl] 1210 libc: [musl]
1211 1211
1212− '@napi-rs/canvas-win32-arm64-msvc@0.1.100': 1212+ '@napi-rs/canvas-win32-arm64-msvc@1.0.13':
1213− resolution: {integrity: sha512-DZFFT1wIAg37LJw37yhMRFfjATd3vTQzjZ1Yki8u2vhO6Hi5VE6BVaGQ1aaDu7xb4iMErz+9EOwjpS7xcxFeBw==} 1213+ resolution: {integrity: sha512-2vRPBZoaIvJrUkDhZTE2Hn0YrnpJRCWVM3EJACoBKjuWI6WgPxGtUoRMsxRviCsyks8bKTSFdyw14CellnG2qA==}
1214 engines: {node: '>= 10'} 1214 engines: {node: '>= 10'}
1215 cpu: [arm64] 1215 cpu: [arm64]
1216 os: [win32] 1216 os: [win32]
1217 1217
1218− '@napi-rs/canvas-win32-x64-msvc@0.1.100': 1218+ '@napi-rs/canvas-win32-x64-msvc@1.0.13':
1219− resolution: {integrity: sha512-MyT1j3mHC2+Lu4pBi9mKyMJhtP6U7k7EldY7sj/uS5gJA65gTXt8MefJQXLJo5d/vZbuWmfxzkEUNc/urV3pHA==} 1219+ resolution: {integrity: sha512-DUlW3lZPz63kYsf8mxgyyZuevhlH0T3/BGP9l+NazhB0F1+gL6D4hqZdnhZpw24DlWmTpATDcyYSZlJOi+DdfQ==}
1220 engines: {node: '>= 10'} 1220 engines: {node: '>= 10'}
1221 cpu: [x64] 1221 cpu: [x64]
1222 os: [win32] 1222 os: [win32]
1223 1223
1224− '@napi-rs/canvas@0.1.100': 1224+ '@napi-rs/canvas@1.0.13':
1225− resolution: {integrity: sha512-xglYA6q3XO5P3BNJYxVZ1IV7DLVjp1Py6nwag88YntrS+3vKHyYcMqXVS4ZztJmwz2uGvz1FWhI/4LgbR5uQDA==} 1225+ resolution: {integrity: sha512-b87ugZpQ5ViwqVBkjervxpwa0GmJPsKHLBNoZN6GpjWeHzTbDUGryriq+2DYW2XbB+xCqSIINQysC0/I87nPbw==}
1226 engines: {node: '>= 10'} 1226 engines: {node: '>= 10'}
1227 1227
1228 '@next/env@16.4.3': 1228 '@next/env@16.4.3':
@@ -2333,8 +2333,8 @@ packages:
2333 pdf-lib@1.17.1: 2333 pdf-lib@1.17.1:
2334 resolution: {integrity: sha512-V/mpyJAoTsN4cnP31vc0wfNA1+p20evqqnap0KLoRUN0Yk/p3wN52DOEsL4oBFcLdb76hlpKPtzJIgo67j/XLw==} 2334 resolution: {integrity: sha512-V/mpyJAoTsN4cnP31vc0wfNA1+p20evqqnap0KLoRUN0Yk/p3wN52DOEsL4oBFcLdb76hlpKPtzJIgo67j/XLw==}
2335 2335
2336− pdfjs-dist@5.7.284: 2336+ pdfjs-dist@6.4.299:
2337− resolution: {integrity: sha512-h4EdYQczmGhbOlqc3PPZwxevn7ApdWPbovAuWXOB/DjIyigSnwfy2oze7c6mRcSr9XgLp3eN3EeL4DyySTPMFw==} 2337+ resolution: {integrity: sha512-AVl138zALtfaAPvADulE0PZThbYzCBS79nL4pOSL/6Sm/4AH5A21BD9VHt97OlCuzJuCpmeZtAtkinisF4Vb1g==}
2338 engines: {node: '>=22.13.0 || >=24'} 2338 engines: {node: '>=22.13.0 || >=24'}
2339 2339
2340 pg-cloudflare@1.4.1: 2340 pg-cloudflare@1.4.1:
@@ -3251,52 +3251,52 @@ snapshots:
3251 transitivePeerDependencies: 3251 transitivePeerDependencies:
3252 - supports-color 3252 - supports-color
3253 3253
3254− '@napi-rs/canvas-android-arm64@0.1.100': 3254+ '@napi-rs/canvas-android-arm64@1.0.13':
3255 optional: true 3255 optional: true
3256 3256
3257− '@napi-rs/canvas-darwin-arm64@0.1.100': 3257+ '@napi-rs/canvas-darwin-arm64@1.0.13':
3258 optional: true 3258 optional: true
3259 3259
3260− '@napi-rs/canvas-darwin-x64@0.1.100': 3260+ '@napi-rs/canvas-darwin-x64@1.0.13':
3261 optional: true 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 optional: true 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 optional: true 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 optional: true 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 optional: true 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 optional: true 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 optional: true 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 optional: true 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 optional: true 3285 optional: true
3286 3286
3287− '@napi-rs/canvas@0.1.100': 3287+ '@napi-rs/canvas@1.0.13':
3288 optionalDependencies: 3288 optionalDependencies:
3289− '@napi-rs/canvas-android-arm64': 0.1.100 3289+ '@napi-rs/canvas-android-arm64': 1.0.13
3290− '@napi-rs/canvas-darwin-arm64': 0.1.100 3290+ '@napi-rs/canvas-darwin-arm64': 1.0.13
3291− '@napi-rs/canvas-darwin-x64': 0.1.100 3291+ '@napi-rs/canvas-darwin-x64': 1.0.13
3292− '@napi-rs/canvas-linux-arm-gnueabihf': 0.1.100 3292+ '@napi-rs/canvas-linux-arm-gnueabihf': 1.0.13
3293− '@napi-rs/canvas-linux-arm64-gnu': 0.1.100 3293+ '@napi-rs/canvas-linux-arm64-gnu': 1.0.13
3294− '@napi-rs/canvas-linux-arm64-musl': 0.1.100 3294+ '@napi-rs/canvas-linux-arm64-musl': 1.0.13
3295− '@napi-rs/canvas-linux-riscv64-gnu': 0.1.100 3295+ '@napi-rs/canvas-linux-riscv64-gnu': 1.0.13
3296− '@napi-rs/canvas-linux-x64-gnu': 0.1.100 3296+ '@napi-rs/canvas-linux-x64-gnu': 1.0.13
3297− '@napi-rs/canvas-linux-x64-musl': 0.1.100 3297+ '@napi-rs/canvas-linux-x64-musl': 1.0.13
3298− '@napi-rs/canvas-win32-arm64-msvc': 0.1.100 3298+ '@napi-rs/canvas-win32-arm64-msvc': 1.0.13
3299− '@napi-rs/canvas-win32-x64-msvc': 0.1.100 3299+ '@napi-rs/canvas-win32-x64-msvc': 1.0.13
3300 optional: true 3300 optional: true
3301 3301
3302 '@next/env@16.4.3': {} 3302 '@next/env@16.4.3': {}
@@ -4185,9 +4185,9 @@ snapshots:
4185 pako: 1.0.11 4185 pako: 1.0.11
4186 tslib: 1.14.1 4186 tslib: 1.14.1
4187 4187
4188− pdfjs-dist@5.7.284: 4188+ pdfjs-dist@6.4.299:
4189 optionalDependencies: 4189 optionalDependencies:
4190− '@napi-rs/canvas': 0.1.100 4190+ '@napi-rs/canvas': 1.0.13
4191 4191
4192 pg-cloudflare@1.4.1: 4192 pg-cloudflare@1.4.1:
4193 optional: true 4193 optional: true
modified services/qa/package.json +2 −2
@@ -23,7 +23,7 @@
23 "@autoscholar/storage": "workspace:*", 23 "@autoscholar/storage": "workspace:*",
24 "drizzle-orm": "^0.45.0", 24 "drizzle-orm": "^0.45.0",
25 "pdf-lib": "^1.17.1", 25 "pdf-lib": "^1.17.1",
26− "pdfjs-dist": "^5.4.0", 26+ "pdfjs-dist": "^6.2.108",
27 "zod": "^4.1.0" 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 parts.push(content.items.map((it) => ("str" in it ? it.str : "")).join(" ")); 73 parts.push(content.items.map((it) => ("str" in it ? it.str : "")).join(" "));
74 } 74 }
75 text = parts.join("\n"); 75 text = parts.join("\n");
76− await pdf.destroy(); 76+ await task.destroy();
77 } catch (e) { 77 } catch (e) {
78 errors.push(`pdfjs text extraction failed: ${(e as Error).message}`); 78 errors.push(`pdfjs text extraction failed: ${(e as Error).message}`);
79 } 79 }
80 80
Menu

Theme